我想制作一个通用的抓取工具,它可以从任何类型的网站(包括 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/