有补充的可以联系我
如果有更好的技巧或者是一些心得也可以分享给我~
- Author: Leo
- Wechat: Leo-sunhailin
- E-mail: 379978424@qq.com
- 会一直维护下去,待补充...
直入主题
Scrapy是一个基于Twisted的异步多线程的爬虫框架
核心爬虫的步骤就是: parse -> yield item -> pipeline
其余就是不同的中间件的问题了,还有一些根据业务需求开发的模块
只要再完整周期中实现就好,Scrapy都会帮你解决的.
基本的Scrapy的爬虫就不讲了,自己体会百度的各种案例就好.
接下来将几种特别的,也是我自己轻身试验过的.
1、 动态JS爬虫
这种爬虫一般就是页面上的数据并不在源代码中生成。
这里划分两种:
1.1、 有json的在后台返回,且能直接访问json的链接获取数据
解决办法: 这种直接用最简单的请求就好了.
1.2、 没有json在后台返回,或者有json,但不能访问(服务器做了访问限制的)
解决办法: 也是两种.
1.2.1、 Scrapy + selenium + webdriver(做过项目)
1.2.2、 Scrapy-splash(准备实验)
一般来说两种都差不多.而且我觉得selenium的也是最简单的,模拟人工操作
浏览器,只要知道相对应操作的标签位置就能开发代码,而且官方文档和社区
都很强大,所以懂得使用selenuim + webdriver的基本上都可以结合用
Scrapy写一个多线程的爬虫.
那至于splash为啥不那么简单呢,其实实际上是差不多的,也是需要学习一些
别的东西例如代码里要写一些新的写法,而且splash的部署是用docker的,对
于没接触过docker的同学来说是一件挑战.毕竟,官方文档很无情的没有给出
Windows下的docker安装.这和splash本身是应对于分布式部署来说也是有他
的道理所在。至于docker的安装就需要自行百度.
Ps: 有空我会完善自己试验的一篇Scrapy-Splash的爬虫文章出来,敬请期待~
2、 "多线程"爬虫
这种爬虫,也算是自己对于自己爬虫方面的一个补充吧,毕竟以前写的都是线程池的单
爬虫多链接的一种形式.
话不多说,直接说为啥叫"多线程".实际上并没有多进程这种概念在Scrapy里面.因为
Scrapy是基于Twisted这种基于事件驱动的网络引擎框架,虽然提高了效率和IO进程
的利用效率,但是实际上还是单个线程而已.Twisted在一定程度的提高线程的利用率
,能够在有限的时间通过对一个线程的调度,完成多个线程的任务(见下模型图)
回到Scrapy项目本身.在spiders文件夹中可以创建多个爬虫,可以分开执行,Scrapy
会自动识别的.那么问题来了,怎么同时启动呢?
回归官方文档中,就能找到这么个东西叫commands.当改写这个东西以后可以创建一个
py文件,里面调用CrawlProcess这个方法即可。大致如下:
# 获得项目的基本配置
settings = get_project_settings()
# 爬虫线程
process = CrawlerProcess(settings)
# 多爬虫
process.crawl(<A爬虫>)
process.crawl(<B爬虫>)
# 启动
process.start()
至于process.crawl里面的就是项目对应的不同爬虫类的名字.
接下来有人会问,启动了不用关闭嘛?
很显然这个问题可以回答需要,但是不是在这里.
关闭的逻辑很明显肯定是在你的爬虫逻辑里面实现的。假设你有多个不同时间结束的
爬虫,那么如果你统一关闭了,那么在爬取过程中有的爬虫跑完就又继续跑,会造成数
据重复或者一直无意义的请求。
至于在爬虫里面的逻辑怎么写,就得看具体的逻辑了,这里只给出关键代码:
# 关闭爬虫
scrapy.Spider.close(<爬虫类名>, reason=<可自定义,不可缺的变量,随便写写就好>)
下面给出个简单的例子: 链接见下面
Scrapy多线程并发爬虫: Github地址
Twisted的模型:
问题区
还有其他什么的好的东西,希望各位可以分享分享~
1. Scrapy监控是一个短板.目前只能想到的是用一个中间表去维护爬虫项目.用flask-restful + vue-admin进行管理
2. Scrapy的多线程爬虫虽好,但是。。日志流用的却是同一个(貌似并不能分离.需要待我研究下).
3. item到pipeline的地方,在多线程爬虫的时候process_item需要写很多个if-elif.如果什么时候Scrapy能够通过配置
文件去指定某个爬虫对应某个pipeline就好了,这样就可以"分而治之"。