微博爬虫,单机每日千万级的数据

前言

此前我发布了一篇博客微博爬虫,每日百万级数据,并且把代码开源在了Github上,然后就有很多人联系我,也有公众号转载了这篇文章。

不过对于微博爬虫,我还是心虚的,因为没有解决账号池的问题,所以每天百万级的数据,是有水分的。单单爬好友关系,这种简单数据可以达到百万级,如果爬关键词搜索的微博,或者一个人的全部微博,是达不到百万级数据这个量的。

不过既然已经埋了坑,就要填!所以自从写了那片文章以后,就一直想构建一个稳定的单机每日千万级的微博抓取系统

值得庆祝的是,这个问题现在已经全面解决了!也对微博爬虫有了更深层次的认识!

微博站点分析

目前微博一共有三个站点,分别是
https://weibo.cn
这里写图片描述
https://m.weibo.com
这里写图片描述
https://weibo.com
这里写图片描述

可以看到这三个站点的复杂程度是逐渐提高的,很显然,如果能在最简单的weibo.cn完成的抓取,肯定不去复杂的weibo.com上去抓,但是事实上,有的只能在复杂的抓取!

那什么任务是weibo.cn完成不了的呢?可以说,抓取一个人的全部微博,抓取好友关系,抓取个人信息,这些都能在weibo.cn这个站点完成。
但是,就是有一个任务,weibo.cn实现不了,就是高级搜索

微博高级搜索

可能你经常有这样的需要,比如最近疫苗事件兴起,你要抓取7月10号到7月20号这段时间,提及到疫苗这个关键词的微博

这其实是一个非常刚性的需求,这就要采用微博的高级搜索来完成了。

对于高级搜索接口,微博三个站点的情况是:

weibo.cn

高级搜索入口:https://weibo.cn/search/mblog?advanced=mblog&f=s
这里写图片描述
可以看到这里可以筛选的条件是,类型,用户,时间,注意,这里的时间是以天为单位。

下面具体搜索一个关键词,疫苗
这里写图片描述
这里写图片描述

可以看到一页有10条搜索的结果,最多显示100页,也就是1000条结果
所以,一次搜索的结果,最多返回1000条微博
而这个站点的时间单位是,所以比如搜索的时间段是10天,那么最多能抓取到10*1000=10000条数据。

m.weibo.com

很遗憾这个站点没有高级搜索接口

weibo.com

高级搜索入口:https://s.weibo.com
这里写图片描述
可以看到这里可以筛选的条件是,类型,用户,时间,地区,注意,这里的时间是以小时为单位。

这里写图片描述

这个站点一页是20条微博,最多50页,所以一次搜索也是最多返回1000条微博数据
但是这个站点的时间单位是小时
所以比如搜索的时间段是10天,那么最多能抓取到10241000=240000条数据。

总结

  • 对于搜索接口,只能选择weibo.com和weibo.cn
  • weibo.com的筛选条件更加丰富,包括了地区,时间段更细,以小时为单位
  • 所以如果希望抓取尽可能多的关键词搜索结果,需要采用weibo.com

所以仅仅高级搜索有可能需要用到weibo.com,并且是你需要的搜索结果数据很大,并且筛选条件很细,比如地区,其他所有爬虫需求都可以通过weibo.cn这个站点来抓取,包括比较粗略的高级搜索

微博抓取经验总结

wiebo.com 还是传统的验证码,5位数的数字字母组合
这里写图片描述
这种验证码可以通过扫码平台解决。具体的登陆代码参考这里
不过,由于你买的小号,可能由于频繁操作,被微博盯上了,登陆进去是账号异常,这就会产生非常恶心的验证码,如下图
这里写图片描述
这种情况,我建议你放弃治疗吧,不要想着破解这种验证码了,所以一般买的小号,不是100%可以用,有一部分是异常账号的!

构建千万级的爬虫系统

根据以上这些分析以后,要想构建千万级别的爬虫系统,只要做一件事情构建账号池

构建账号池的步骤也非常简单:

  1. 购买大量账号
  2. 登陆进微博,保存下cookie
    就这两步,以后每次请求,只要随机从账号池中选择一个账号即可。

对于weibo.cn和weibo.com这两个站点的cookie是不同的,所以要构建两个账号池,一个cn站点的,一个com站点的。

这时候,你结合我之前写的项目WeiboSpider就可以轻松达到每日百万级的数据抓取了!

注意这里实际的抓取速度和你的账号池大小和电脑的带宽有很大关系,如果账号池不大,请求的间隔延迟就需要时间长一点,如果带宽小的话,每次请求的耗时也会长一点

我的数据是,
账号池里230个账号,每次请求延迟为0.1秒,可以达到一天200~300万的抓取结果。

冲刺千万级

我一直认为,我上面构建的这个爬虫,已经占满了带宽!
有一次,我又启动了一个爬虫程序,发现另一个爬虫,也可以达到一天200~300万的抓取速度,同时之前的爬虫也是在以一天200~300万的抓取速度在运行,
所以,仅仅是因为CPU限制了爬虫的抓取量,而不是网络IO!

所以只需要用多进程优化即可,这里推荐Redis-Scrapy,所有的爬虫共享一个Redis队列,通过Redis统一给爬虫分配URL,这样就是一个分布式的抓取系统了。
可以分别部署在不同的机器上(如果一个机器带宽/CPU占用满了),或者就在一个机器上开多个进程即可。

就这样,我开了5个进程,不敢多开,毕竟账号池还是200多个。

然后结果就是:

这里写图片描述

一分钟可以抓取8000条数据,一天可以达到1100万+

这个抓取系统目前一直在稳定运行

所以就此实现了最初的目标,千万级别的微博爬虫系统

总结

  • 解决微博登陆问题,并构建账号池
  • 通过scrapy-redis框架构建分布式系统
  • 深入分析微博高级搜索需求的解决方案,并编写weibo.cn和weibo.com两个站点的爬虫

至此,可以说,彻底解决了一切关于微博爬虫的问题!!!

开源代码在这里,你需要添加自己的账号池.