javascript - 如何使用 Scrapy 和 Splash 抓取基于 AJAX 的网站?

标签 javascript ajax scrapy scrapy-splash splash-js-render

我想制作一个通用的抓取工具,它可以从任何类型的网站(包括 AJAX 网站)抓取和抓取所有数据。我在互联网上进行了广泛的搜索,但找不到任何合适的链接来解释 Scrapy 和 Splash 如何一起抓取 AJAX 网站(包括分页、表单数据和在显示页面之前单击按钮)。我提到的每个链接都告诉我可以使用 Splash 呈现 Javascript 网站,但是没有关于使用 Splash 呈现 JS 网站的好的教程/解释。请不要给我与使用浏览器相关的解决方案(我想以编程方式完成所有事情,欢迎提出 headless 浏览器建议..但我想使用 Splash)。

class FlipSpider(CrawlSpider):
    name = "flip"
    allowed_domains = ["www.amazon.com"]

    start_urls = ['https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=mobile']  

    rules = (Rule(LinkExtractor(), callback='lol', follow=True),

    def parse_start_url(self,response):
       yield scrapy.Request(response.url,
                            self.lol,
                            meta={'splash':{'endpoint':'render.html','args':{'wait': 5,'iframes':1,}}})

    def lol(self, response):
       """
       Some code
       """

最佳答案

Splash 和分页的问题如下:

我无法生成一个 Lua 脚本来提供响应格式的新网页(点击分页链接后)。而不是纯 HTML。

因此,我的解决方案如下 - 单击链接并提取新生成的 url,并将爬虫定向到这个新 url。

所以,我在有分页链接的页面上执行

yield SplashRequest(url=response.url, callback=self.get_url, endpoint="execute", args={'lua_source': script})

使用以下 Lua 脚本

def parse_categories(self, response):
    script = """
             function main(splash)
                 assert(splash:go(splash.args.url))
                 splash:wait(1)
                 splash:runjs('document.querySelectorAll(".next-page")[0].click()')
                 splash:wait(1)
                 return splash:url()  
             end
             """

和 get_url 函数

def get_url(self,response):
    yield SplashRequest(url=response.body_as_unicode(), callback=self.parse_categories)

这样我就可以循环查询了。

同样的方法,如果您不期望新的 URL,您的 Lua 脚本只能生成纯 html,您必须使用我们的正则表达式(这很糟糕)——但这是我能做的最好的。

关于javascript - 如何使用 Scrapy 和 Splash 抓取基于 AJAX 的网站?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44436160/

相关文章:

Scrapyd在子目录中找不到代码

python - Scrapy 发布请求无效

javascript - jQuery 不能在 HTML 文件中工作

javascript - 如何使用下拉列表填充文本框

javascript - 何时调用 XMLHttpRequest?

javascript - 是什么让浏览器自动填充电子邮件/密码输入?

javascript - jquery ajax readystate 0 responsetext 状态 0 statustext 错误

php - 如果 ajax 失败,也可以通过 php 加载页面

python - 抓取网站时出现错误 "Took longer than 180.0 seconds"。为什么?

javascript - 在 JavaScript 中继续之前等待函数完成