这是微博部分的最后一篇
本篇概要:
1、如何提高微博爬取的速度达到百万级
2、总结微博爬取
ps:已采集三千多万微博账户信息(速度可达日两百万),但是有个不太好的消息,不知道是不是准确时间,但也没差多少,微博wap站开始对于爬取频率过快会封 IP,就在12月7日(根据小编的程序反应得出的结果),这下不能愉快的玩耍了 :(
所以这就意味着不能爬数据了?
当然不是!我们还能通过切换 IP 来爬取,只是速度会相应的降低,目前小编了解到的通过ADSL动态拨号IP是个不错的选择
这一块单独会放在日后的爬虫实战篇中讲述
正文
今天主要还是来讲讲小编是如何提高爬虫速度的
就小编知道的,爬虫的爬取速度受很多因素的影响,如网速,电脑性能,程序导致的请求是同步的还是异步的等,这些因素都会多少影响爬虫,而这之中同步与异步的差别算是一个重要的因素
试想一个爬虫,在同步的情况下发送请求到获取响应的时间都是1秒,那么对于100个请求,也就需要100秒;而异步的状态就是可以同时发送着100个请求,这就意味着所需要的时间会大大的减少
一般来说很多人会考虑用scrapy来实现,因为scrapy是基于twisted开发的,所以能实现请求的异步,速度上也有保障
但是scrapy实现的速度也是有限的,对于脚本式的代码通过多进程+多协程的方式能将爬虫速度极大的提高
多进程、多线程、协程等的概念可以参考这里
https://www.cnblogs.com/huangguifeng/p/7632799.html
协程:又称微线程,在单线程上执行多个任务,用函数切换,开销极小。不通过操作系统调度,没有进程、线程的切换开销
也就是说,Python中的协程是程序内部自己的调度,且协程一旦执行,无法控制请求的顺序
小编用的是gevent这个第三方模块
之前也使用过多线程的,但是光使用多线程效率好像没有多少提升,且Python(CPython)存在的GIL仍是一个问题
考虑用多进程执行,本机是4核CPU所以开4个进程应该说是效率最好的,但是测试后速度是提升了,但还是不够快!
但是多进程+多协程在使用时,应避免进程池与协程共同使用,容易出现问题
假装是分割线
接下来就来看看代码中是如何实现多进程+协程
首先需要导入 gevent 以及 猴子补丁monkey.patch_all()
这里需要注意猴子补丁需要放在导包的首行,猴子补丁的作用就是会在程序运行时对已有的代码进行修改
而在gevent这里的作用就是把标准库中的thread/socket等给替换掉,这样我们在后面使用socket的时候可以跟平常一样使用,无需修改任何代码,但是它变成非阻塞的了
还有多进程
在这里通过把大量的关键词按一定的数量分割开来,以分隔的块数来启用对应块数的进程,再对每一块关键词实现多协程的调用,这样一来就能够充分利用CPU资源,从而高效的提高爬虫的速度
其实说白了也没有那么神秘,关键在于控制进程数以及协程数达到一个适合的状态,这也是在不用scrapy状态下有效提高爬虫速度的较好的方法之一
好了,微博篇到此分析结束,之后有关微博的内容也可能以单篇出现,另外有的地方由于头一次写,没有解释的很完善,关于这一点希望有什么不足之处大家可以提出来,小编也会不断改进的!
领取专属 10元无门槛券
私享最新 技术干货