崔庆才python3爬虫-13章 Scrapy框架的使用-Spider对接Splash
1 | 在上一节我们实现了 Scrapy对 接 Selenium抓取淘宝商品的过程,这是一种抓取JavaScript动态渲染页面的方式。除了 Selenium, Splash也可以实现同样的功能。本节我们来了解Scrapy对接Splash来进行页面抓取的方式。 |
准备工作
1 | 请确保 Splash已经正确安装并正常运行,同时安装好Scrapy-Splash库 ,如果没有安装可以参考第1章的安装说明。 |
创建项目
1 | 首先新建一个项目,名 为 scrapysplashtest,命令如下所示: |
添加配置
1 | 可以参考Scrapy-Splash的配置说明进行一步步的配置,链接如下:https://github.com/scrapyplugins/scrapy-splash#configurationo |
1 | 这里配置了三个Downloader Middleware和一个Spider Middleware, 这是Scrapy-Splash的核心部分。我们不再需要像对接Selenium那样实现一个Downloader Middleware, Scrapy-Splash库都为我们准备好了,直接配置即可。 |
新建请求
SplashRequest
1 | 配置完成之后,我们就可以利用Splash来抓取页面了。我们可以直接生成一个SplashRequest对象并传递相应的参数, Scrapy会将此请求转发给Splash, Splash对页面进行渲染加载,然后再将渲染结果传递回来。此时Response的内容就是渲染完成的页面结果了,最后交给Spider解析即可。 |
1 | 这里构造了一个SplashRequest对象,前两个参数依然是请求的URL和回调函数。另外我们还可以通过args传递一些渲染参数,例如等待时间wait等,还可以根据endpoint参数指定渲染接口。更多参数可以参考文档说明:https://github.eom/scrapy-plugins/scrapy-splash#requestso |
Request
1 | 另外我们也可以生成Request对象, Splash的配置通过m eta属性配置即可,代码如下: |
1 | SplashRequest对象通过args来配置和Request对象通过meta来配置,两种方式达到的效果是相同的。 |
1 | function main(splash, args) |
1 | 我们只需要在Spider里 用 SplashRequest对 接 Lua脚本就好了,如下所示: |
1 | 我们把Lua脚本定义成长字符串,通过SplashRequest的args来传递参数,接口修改为execute |
运行
1 | scrapy crawl taobao |
结语
1 | 因此,在 Scrapy中,建议使用Splash处理JavaScript动态渲染的页面。这样不会破坏Scrapy中的异步处理过程,会大大提高爬取效率。而且Splash的安装和配置比较简单,通过API调用的方式实现了模块分离,大规模爬取的部署也更加方便 |
没有伞的孩子,必须努力奔跑!
Typewriter Mode** 已开启。
可以在视图菜单中关闭
不再显示关闭