完整的微博千万级数据量思路过程

单日千万级微博爬虫介绍:

	我也不喜欢说废话,来救直接上,项目要求爬微博,**存成四张表**,分别是用户信息表,用户和用户关系表,微博信息表,微博和微博关系表,改为分布式爬虫可实现单日1000+的数据量,直接开始干把
  1. 准备:
    首先你的准备好几百个微博账号,并获取cookie,楼主借鉴网上很多大神的方法,也是通过访问手机端拿到cookie,http://weibo.cn,比较简单,并且验证码是四宫格,相比于其他验证码,简单,网上很多破解的教程,这里不赘述,
    然后就是代理池,微博那么大的数据量肯定是需要用代理的

  2. 思路:
    通过观察手机端网页我们可以发现,微博的几个信息是可以构建的,user_info 可以在微博uid后面加上info,就能访问到详情页,同样,fans可以访问到粉丝页,profile可以访问到微博页,所以我们仅仅需要得到uid就够了,然后具体的请求再调用不用的collback即可

  3. 过程:
    1:找到一个uid作为种子,爬去他的粉丝,再将粉丝的uid又作为种子,指数爆炸的抓取uid

    2:例如uid=12345678911,然后构建三个请求,http://weibo.cn/12345678911/info,
    http://weibo.cn/12345678911/fans,http://weibo.cn/12345678911/profile,三个请求,这三个请求分别对应的是用户详情,用户粉丝,用户微博,然后就是码代码对每个请求做不同的处理了,这个就是基本的字符串之类的操作了,略过了就
    
    3:上面就已经实现了基本的逻辑,然后接下来就是控制请求了,如果让他一直按上面那样跑下去,uid会越来越多,就算是存在redis中,也会受不了的,所以有必要控制下请求的个数,我是在callback中进行一个计数,如:这个callback处理了多少条请求,就弹出一个用户id去构建请求,通过修改这个阀值,来实现弹出快慢,从而实现控制请求的产生的快慢
    
    4:上面那一套基本是可以实现了300万左右的数据量了,因为是单机爬虫,通过修改为分布式scrapy-redis爬虫,就可以实现题所说的千万级,所以啊,这个网络io限制还是特别严重,分布式确实能提高不少的速度,如何修改为分布式爬虫,百度一大堆,也不再赘述了
    
    5:setting中的一些设置,cookie那个一定要开起来,还有就是改写下retry模块,因为被发现是爬虫之后,会给我们返回418这种没有任何意义的状态吗,我们可以改写下retry模块,把418也加入到重试模块中,这样就能减少请求的丢失,
    
    6:中间件的一些设置,这个不用多说就是随机代理,随机cookie,随机ua,不赘诉
    
    7:pipeline这个,可试可不试,因为我是将数据写入到mysql中,所以我再网上找到了很多异步插入mysql的教程,改写了之后有个重大的改变的就是cpu占用变得特别低,老板们可以试试
    
    8:一些小方法:我们都知道再scrapy-redis中有三种队列用来存数据,微博这种建议使用stack来用,因为构建好请求之后最好马上就发掉,如果使用queue这样,就会一直产生请求,没有把产生好的请求及时发送出去,导致请求堆积越来越多,并且,我们都知道mysql中连接是有时间限制的,默认是8个小时,如果超过了8个小时的话,就会报pymysql.error.interface(0,'')这个错误,好像是这个错误,具体记不清了,楼主在这里就卡了很久,希望各位爬友不要再这里浪费时间,这个的原因就是连接被关闭了,解析完数据之后,没有能存进mysql,导致的错误
    
    9:有一些坑爹的地方,比如:就uid而言,很多人就是11位的一串数字,但是慢慢发现我们直接抓粉丝页得到的uid可能会出现一串字母,比如bigxg这种,直接去构建是得不到数据的,但是细心的你一定会发现,还是会有uid的,不过这样得从info页进行提取,楼主得做法是将这个有问题得数据存入数据库,然后再写一个爬虫用来专门查询这种有问题得数据,然后进行update,亲测有效,就写一个获取这个失败得uid,然后构建info,请求,然后再info页粉丝或则微博页得到uid,然后再构建发送,返回得数据提取出来,再在原来的数据中进行更新即可
    
    10:在抓取微和微博关系得时候有得问题,因为我们需要抓微博和微博之间得关系,就是有转发得话,需要获取转发关系,没有转发得话就是原创,在转发得微博中是一定有原文评论得,并且在这个原文评论得url中就藏在原文得weibo_id,所以我们可以通过判断这一篇微博是否存在原文评论来进行判断是否是转发,如果是则将当前微博和原文微博得关系返回,并返回当前微博得信息,如果不是就直接返回当前微博得信息
    
    11:在发微博的时候我们会遇到有的微博是没有年月日的,有的会没有年,比如今天发的微博,他的时间就会显示为今天12:32分这样,这种数据是没法用的,所以我们得进行处理,如果遇到这样得再前面加上年,或则加上年月日,再存入数据库,保证数据得完整
    
    12:再微博中我用到的是正则匹配,所以会匹配 出很多例如\n\u200b<>这样的字符,对我原文得污染挺严重得,再询问了大佬之后发现了一个包专门提取这种数据得,html2text,听名字就知道是干嘛的,利用这个可以对一些无关的数据进行清洗,只留下文字,特别爽,这个包通过pip安装即可,很好用
    

猜你喜欢

转载自blog.csdn.net/qq_42896149/article/details/88029646