Scrapy-Splash-爬虫
本文最后更新于:2021年2月5日 晚上
信息
Scrapy的Splash插件
github地址:https://github.com/scrapy-plugins/scrapy-splash
这个插件只是让Scrapy使用Splash服务而已
如果没人给你提供Splash服务,那么你需要自己弄
流程
安装
pip install scrapy-splash
配置
在
settings.py中添加Splash地址1
SPLASH_URL = 'http://192.168.59.103:8050'根据ip来,要是本地就localhost:8050
在
settings.py中配置Downloader中间件1
2
3
4DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}启用Spider中间件
SplashDeduplicateArgsMiddleware1
2
3SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}这个功能需要
cache_args支持。
它能通过不保存 重复的Splash参数 节约磁盘空间
若Splash版本2.1+,它能通过 不重复发送Splash参数 节约带宽设置去重类
DUPEFILTER_CLASS1
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'如果你使用HTTP cache,那么要定义一个缓存后端
scrapy-splash提供一个
scrapy.contrib.httpcache.FilesystemCacheStorage子类1
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
使用
1 | |
如果在splash中使用lua脚本,那么args中的内容会通过main函数的 splash.args 参数传入,其余的内容会通过第二个 参数 args 传入。
比如下面有一个简单的用户登录的例子:
1 | |
上述代码提交了一个Splash的请求,在脚本中首先获取用户名和密码的输入框元素和对应的提交按钮元素,接着填入用户名和 密码,最后点击提交并返回对应的cookie。 回调函数 after_login 的代码如下:
1 | |
在回调函数中,可以通过response.data来获取lua脚本中返回的内容,而对应的HTML代码的获取方式与使用传统的Request方式 相同。
另外在回调函数中可以通过response.meta来获取Request中meta传入的参数。
上述示例演示了如何使用SplashRequest来像Splash发送渲染请求,以及如何在回调函数中获取lua脚本中的返回、 以及如何在回调函数中获取lua脚本中的返回、如何向回调函数传递参数。
当然您也可以使用常规的scrapy.Request来向Splash发送请求,发送的示例如下:
1 | |
splash 参数中的内容是用于splash的,使用这个参数表明我们希望向splash发送渲染请求。
最终它们会被组织成 request.meta[‘splash’] 。在scrapy处理这些请求的时候根据这个来确定是否创建spalsh的 中间件,最终请求会被中间件以HTTP API的方式转发到splash中
splash中各个参数的作用如下:
meta[‘splash’][‘args’] 是最终发送到splash HTTP API的参数
- url 表示目标站点的url
- http_method 表示向url发送的HTTP的请求方式
- body 是采用POST方式发送请求时,请求体的内容
meta[‘splash’][‘cache_args’] 表示将要被作为缓冲的参数的列表字符串,以分号分隔
meta[‘splash’][‘endpoint’] 表示对应的端点
meta[‘splash’][‘splash_url’] 与settings文件中的 SPLASH_URL 作用相同,但是会优先采用这里的设置
meta[‘splash’][‘splash_headers’] 即将发送到splash服务器上的请求头信息,注意,这里它不是最终发送到对应站点的请求头信息
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!