Javascript 如何使用Scrapy和Splash刮取基于AJAX的网站?

Javascript 如何使用Scrapy和Splash刮取基于AJAX的网站?,javascript,ajax,scrapy,scrapy-splash,splash-js-render,Javascript,Ajax,Scrapy,Scrapy Splash,Splash Js Render,我想做一个通用的刮板,它可以从任何类型的网站(包括AJAX网站)抓取和刮取所有数据。我已经在互联网上进行了广泛的搜索,但找不到任何合适的链接来解释Scrapy和Splash如何一起刮去AJAX网站(包括分页、表单数据和在页面显示之前单击按钮)。我提到的每个链接都告诉我,可以使用Splash呈现Javascript网站,但是没有关于使用Splash呈现JS网站的好教程/解释。请不要给我提供与使用浏览器相关的解决方案(我想以编程方式完成所有事情,欢迎无头浏览器建议..但我想使用Splash) 类Fl

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

类FlipSpider(爬行蜘蛛):
name=“flip”
允许的_域=[“www.amazon.com”]
起始URL=['https://www.amazon.com/s/ref=nb_sb_noss?url=search-别名%3Daps&field关键字=mobile']
规则=(规则(LinkExtractor(),callback='lol',follow=True),
def parse_start_url(自我,响应):
生成scrapy.Request(response.url,
self.lol,
meta={'splash':{'endpoint':'render.html','args':{'wait':5,'iframes':1,})
def lol(自我,响应):
"""
一些代码
"""
您可以通过编写JavaScript函数,并告诉Splash在呈现页面时执行脚本,来模拟行为,如点击滚动

一个小例子:

您可以定义一个JavaScript函数,该函数选择页面中的一个元素,然后单击该元素:

(来源:)

#使用javascript获取按钮元素维度并执行鼠标单击。
_script=”“”
主功能(飞溅)
断言(splash:go(splash.args.url))
本地get_dimensions=splash:jsfunc([[
函数(){
var rect=document.getElementById('button').getClientRects()[0];
返回{“x”:rect.left,“y”:rect.top}
}
]])
splash:set_viewport_full()
飞溅:等待(0.1)
局部尺寸=获取尺寸()
飞溅:鼠标单击(dimensions.x,dimensions.y)
--等待分秒以允许事件传播。
飞溅:等待(0.1)
返回splash:html()
结束
"""
然后,当您请求时,您修改
端点
,并将其设置为
“执行”
,然后将
“lua\u脚本”:\u脚本
添加到参数

示例:

def解析(self,response):
生成请求(response.url、self.parse_elem、,
endpoint=“execute”,
args={“lua_源”:{u脚本})

您将找到有关启动脚本的所有信息。启动和分页的问题如下:

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

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

因此,我在有分页链接的页面上执行

请求(url=response.url,callback=self.get\u url,endpoint=“execute”,args={'lua\u source':script})
使用下面的Lua脚本

def parse_类别(自我、响应):
script=”“”
主功能(飞溅)
断言(splash:go(splash.args.url))
飞溅:等待(1)
splash:runjs('document.querySelectorAll(“.next page”)[0]。单击()
飞溅:等待(1)
返回splash:url()
结束
"""
以及get_url函数

def get_url(self,response):
生成请求(url=response.body\u as\u unicode(),callback=self.parse\u categories)
这样我就可以循环查询了


同样,如果您不希望有新的URL,那么您的Lua脚本可以生成纯html,您必须使用正则表达式(这很糟糕)-但这是我能做的最好的了。

你遵循了吗?你到底有什么问题?是的。Splash doc只是提到了我们可以使用的命令。我想知道如何使用它们来运行网站的javascript以获取动态内容…如果你对Splash没有具体问题,我不会复制粘贴文档…如果你参考文档,你应该能够抓取一个基于JavaScript的网站好的。我想做的是做一个通用的刮板,它可以解决分页(无限滚动)的问题,从表格填写页面中抓取数据,在页面显示在一起之前单击按钮。我看到的是,正在发送一个POST请求,该请求将数据加载到浏览器中。我想知道如何使用Splash针对上述问题发出这些POST请求。如何做到这一点?谢谢!很好的解释。我想知道我们是否可以执行使用scrapy+splash在网页上创建所有Java脚本?