Python爬虫日记第十三天之微博-总结篇

这是微博部分的最后一篇

本篇概要:

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状态下有效提高爬虫速度的较好的方法之一

好了,微博篇到此分析结束,之后有关微博的内容也可能以单篇出现,另外有的地方由于头一次写,没有解释的很完善,关于这一点希望有什么不足之处大家可以提出来,小编也会不断改进的!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181212G1MX9Q00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券