工业级微博爬虫 一天1000万+数据量

为什么要加上一个工业级???
在网上有很多博客写很好一天也能实现一千万得数据量,但是在实际过程中就会遇到很多问题

楼主就先来说几个问题吧:
第一个:微博id的存储和去重问题,我在几篇文章上看见的都是用set 来去重,额,这个让你跑一天两天没问题,但是持续跑下去,可能就会出问题了
我们都知道爬去微博的是通过一个id 抓取粉丝id 来构建url抓取数据,那问题就来了,假如一个人有100个粉丝,100个粉丝的粉丝就要再乘以100,id 就呈现指数爆炸,如果用的集合,我相信你的内存怕是有的扛不住
渣图:
在这里插入图片描述
第二个:请求的去重
我们可以通过id来构建info,fans,profile三个页面,如果你还是用set来去重,

到这里那我们就理一下思路吧

  • 通过id来构建url 发送请求获取数据
  • 实现一天一千万 -----------分布式
  • id和request采用redis来 存储去重
  • 产生的请求特别多,选取好的存储方式来减缓内存的压力 ---------------queue,stack,优先级

微博的数据量这么大,肯定要用分布式的,分布式并不是说一定要用特别好的电脑来当master端,而是降低网络io,这样才能实现千万级的数据量

减缓内存压力
假如一个id,首先会产生三个请求,分别是info, fans,profiles,粉丝页解析完之后就又会产生大约100个请求,profiles解析完可能会产生500个请求,也就是说一个id就会可能就会产生这么多请求,而且一个请求内包含的数据量特别大,包含回调函数啊,url,meta参数等待,一直放在redis中,即使再强的电脑,也扛不住,
所以:重点来了:
发送和存储请求的存储结构就显得十分重要,如果你 一直使用queue进行存储,会一直产生请求,那么内存会直接炸掉,如果一直选用stack,会显得特别慢,最好的方式就是queue和stack结合,结合并不是在一个爬虫中使用,而是在多个爬虫中,比如楼主就是用的一个爬虫是queue用来一直产生请求,15个爬虫用stack来发送请求,内存基本上就稳定在60左右,如果太快了,可以多开一个slave,用stack继续跑,如果太慢了,可以在将队列那个爬虫发送请求调快一点,这样内存压力不会特别大,而且数据量也特别大,一天千万计妥妥的,估计2000万都可能的,-。-

好啦,也是自己的一点经验,希望能分析给大家,让大家少走弯路 = =

猜你喜欢

转载自blog.csdn.net/qq_42896149/article/details/86536818
今日推荐