我们一直在使用scrapy-splash
middleware通过在docker容器内运行的Splash
javascript引擎传递已删除的HTML源代码。
如果我们想在蜘蛛中使用Splash,我们会配置多个required project settings并生成Request
,指定具体的meta
arguments:
yield Request(url, self.parse_result, meta={
'splash': {
'args': {
# set rendering arguments here
'html': 1,
'png': 1,
# 'url' is prefilled from request url
},
# optional parameters
'endpoint': 'render.json', # optional; default is render.json
'splash_url': '<url>', # overrides SPLASH_URL
'slot_policy': scrapyjs.SlotPolicy.PER_DOMAIN,
}
})
这有助于记录。但是,我们如何在Scrapy Shell内使用scrapy-splash
?
答案 0 :(得分:20)
只需将您要封装的网址包装到splash http api。
所以你会想要这样的东西:
scrapy shell 'http://localhost:8050/render.html?url=http://domain.com/page-with-javascript.html&timeout=10&wait=0.5'
其中localhost:port
是您的启动服务运行的地方
url
是您要抓取的网址,不要忘记 urlquote 它!
render.html
是可能的http api端点之一,在这种情况下返回retml html页面
超时的timeout
时间以秒为单位
wait
在读取/保存html之前等待javascript执行的时间(以秒为单位)。
答案 1 :(得分:14)
您可以在已配置的Scrapy项目中运行scrapy shell
不带参数,然后创建req = scrapy_splash.SplashRequest(url, ...)
并调用fetch(req)
。
答案 2 :(得分:0)
对于使用Docker Toolbox的Windows用户:
将单个倒数逗号更改为双倒数逗号,以防止发生invalid hostname:http
错误。
将localhost更改为鲸鱼徽标下方的docker ip地址。对我来说是192.168.99.100
。
最后我得到了:
scrapy shell "http://192.168.99.100:8050/render.html?url="https://samplewebsite.com/category/banking-insurance-financial-services/""