(Gitchat备份)微博爬虫,单机每日千万级的数据 && 吐血整理的微博爬虫总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nghuyong/article/details/81251948

1. 前言

这是本人第一次做Gitchat,非常荣幸能够将我这段时间对微博数据的抓取工作整理成这篇文章,分享给大家。最后,我也会讲述一下我对于爬虫的理解,以及爬虫工程师,这个大数据时代站在数据最源头的人,工作是什么样的,未来有什么发展。

2. 微博的价值

微博是中国最早兴起的自媒体平台,理念就是人人都是自媒体,人人都可以在这里发表自己的观点。到现在微博已经成为了官方,明星等“新闻发布“的第一阵地,比如政府发条微博向社会通报某件社会事件的进展情况,明星则悄咪咪的发条微博宣布自己的恋情,瞬间微博的服务器表示自己扛不住了!!
当然,对于我们普通人,也常会发微博,或者转发,评论来表达自己对于社会事件的观点,也会来表现自己生活的日常,或开心,或吐槽。
更为重要的是什么呢,微博不同于QQ空间,不同于微信朋友圈,不需要对方加你,也不需要你关注对方,你就可以看到对方的全部动态,个人信息!。所以,微博变成了唯一一个可以爬的社交媒体平台。

2.1 微博数据维度

微博数据,可以分成,微博数据,个人信息,单条微博评论数据,社交关系数据。

2.1.1 微博数据

微博数据,就是微博最基本的语料数据。比如下面这条微博:
enter image description here

能抓取到的数据维度包括:

字段 说明
weibo_url 这条微博的URL,可以作为这则微博的唯一标识
user_id 这则微博作者的ID
content 微博的内容
tool 发布的工具,一般是手机型号,或者上图中的weibo.com
created_at 微博发表时间
image_group 微博附带图的URL
repost_num 转发数
comment_num 评论数
like_num 点赞数
is_repost 是否是转发的微博
repost_weibo_url 如果是转发的微博,源微博的URL

2.1.2 用户数据

enter image description here

能抓取到的数据维度包括:

字段 说明
user_id 用户的ID,可以作为用户的唯一标识
nick_name 昵称
province 所在省
city 所在市
brief_introduction 个人简介
birthday 生日
gender 性别
vip_level 会员等级
authentication 认证情况
tweets_num 微博发表数
fans_num 粉丝数
followers_num 关注数

2.1.3 评论数据

对于一条微博的评论数据
enter image description here
能抓取到的数据维度包括:

字段 说明
comment_url 这则评论的URL,可以作为唯一ID
user_id 评论的用户ID
weibo_url weibo的URL
content 评论内容
created_at 评论创建时间

2.1.4社交关系

也就是用户之间的关注情况,其实只需要维护一张关注表即可,因为粉丝关系,就是反向的关注关系。
enter image description here

能抓取到的数据维度包括:

字段 说明
fan_user_id 关注者的用户ID
follower_user_id 被关注者的用户ID

这其实也就是一个有方向的箭头。

2.2 数据金矿

正是因为由以上这些数据维度,所以微博语料是一个非常有价值的数据金矿,在上面可以完成多种的分析和挖掘。
举一个商业分析的例子,比如你要在中国市场投放转基因的食品,你就可以根据转基因为关键词来搜索微博,对搜索结果进行情感分类,来判断中国民众对于转基因的持有态度,是支持还是反对,支持的人,是什么地区,是什么学习,同样反对的人呢,这样你就可以针对性的来投放自己产品。
再比如,其实可以通过微博来评价明星手机代言的效果。比如鹿晗代言了vivo手机,那么你就可以抓取鹿晗粉丝是什么手机,并且有没有原先不是vivo,后来变成了vivo的现象,以此来评测。
当然,还有很多很多,数据只有放在有想法的人手里才有价值。下面我们就要讨论以下,如何来抓数据了。

3. 微博爬虫

3.1 站点分析

目前微博一共有三个站点,分别是
https://weibo.cn

这里写图片描述

https://m.weibo.com

这里写图片描述

https://weibo.com

这里写图片描述

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

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

3.2 微博高级搜索

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

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

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

3.2.1 weibo.cn

高级搜索入口:https://weibo.cn/search/mblog?advanced=mblog&f=s

可以看到这里可以筛选的条件是,类型,用户,时间,注意,这里的时间是以天为单位。

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

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

3.2.2 m.weibo.com

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

3.2.3 weibo.com

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

这里写图片描述

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

3.2.4 总结

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

3.3 微博登陆

要抓取到微博的数据,首先就是要登陆微博,否则就会重定向到登陆界面。而微博检测你是不是登陆了微博,就是检查你这次Request请求携带的cookie。
所以要做的事情,就是登陆微博,获取cookie存下来,然后以后的请求带上这个cookie即可。当然,如果你不会微博自动化登陆,也可以手工登陆,然后复制cookie下来。BUT,这对于批量的账户,你总不能逐个这样做吧…
下面,来分析以下,如果实现微博的自动化登陆。我们主要考察两个站点,weibo.cn和weibo.com

对于自动化登陆,就是通过代码来驱动浏览器,进行微博的登陆操作,具体通过自动化工具 selenium 来实现,它支持Chrome,Firefox和PhantomJS等多种浏览器。好处就是,不用再去分析登陆时候恶心的js加密,解密的过程,直接而且简单,坏处就是效率比较慢,但是我们只是用它来完成登陆并获取cookie的操作,所以效率并不是很重要的事情。

3.3.1 weibo.cn自动化登陆

通过selenium编写浏览器的脚本,自动打开微博的手机站,点击登录,在输入框中填充账号,密码,再点击登录。最后返回cookie即可。

def get_cookie_from_weibo(username, password):
    driver = webdriver.Chrome()
    driver.get('https://weibo.cn')
    assert "微博" in driver.title
    login_link = driver.find_element_by_link_text('登录')
    ActionChains(driver).move_to_element(login_link).click().perform()
    login_name = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.ID, "loginName"))
    )
    login_password = driver.find_element_by_id("loginPassword")
    login_name.send_keys(username)
    login_password.send_keys(password)
    login_button = driver.find_element_by_id("loginAction")
    login_button.click()
    cookie = driver.get_cookies()
    driver.close()
    return cookie

获取cookie以后,可以保存到数据库中。以后每次request请求,随机从数据库中选一个cookie加上,就免登录了。

但是,对于网上买的小号,登陆可能会出现验证码,如下图所示:

这里写图片描述

破解方案参考这里,滑动宫格验证码都给碰上了?没事儿,看完此文分分钟拿下!

3.3.2 weibo.com自动化登陆

weibo.com其实是基于新浪的密码验证的,所以网上已经有了,不需要selenium这个大杀器的解决方案,我们其实可以直接调用即可。
代码很长,就不贴了,在这里
可以重点安利一下fuck-login这个项目,解决了几乎所有主流网站的登陆问题,可以作者已经不在维护了,不过项目中的代码可以参考,有很大的价值。

不过,对于weibo.com的登陆时候,还是会出现验证码的,这是5位数的数字字母组合
这里写图片描述

这种验证码可以通过扫码平台解决。具体的登陆代码参考这里

不过,由于你买的小号,可能由于频繁操作,被微博盯上了,登陆进去是账号异常,这就会产生非常恶心的验证码,如下图
这里写图片描述
这种情况,我建议你放弃治疗吧,不要想着破解这种验证码了,所以一般买的小号,不是100%可以用,有一部分是异常账号的!

3.3.3 小号购买

明人不说暗话,小号购买地址是http://www.xiaohao.shop/ 需要翻墙

3.4 构建微博爬虫

我们这里采用scrapy框架来构建爬虫,这是一个非常成熟的爬虫框架

首先给爬虫一批起始URL,比如你要抓一个人的全部微博,那就是输入该用户首页URL即可,爬虫就会将该页面下载下来,并解析该页面的信息,得到该页面的微博数据,同时产生下一页的地址,并接着去抓取下一页,以此循环,抓取完该用户的全部微博。

这样的逻辑是不是很清晰,我也整理成了一个基于scrapy的微博爬虫的开源项目,戳这里,麻烦点个star呗,谢谢各位啦。

还需要说明的一点就是,图中scrapy有一个spider Middleware,这是请求的中间件,也就是每次请求之前都先经过这个中间件,所以,我们就是在这里完成给每个请求,随机添加一个cookie。

3.5 构建千万级的微博抓取系统

3.5.1 百万预热

微博不封IP,只封账号微博不封IP,只封账号微博不封IP,只封账号 重要的事,说三遍。这意味着,只需要购买大量账号,构建账号池即可,不需要构建IP池
要想构建千万级别的爬虫系统,只要做一件事情构建账号池

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

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

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

这时候,就可以轻松达到每日百万级的数据抓取了!也就是这个项目.

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

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

3.5.2 冲刺千万级

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

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

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

然后结果就是:

这里写图片描述

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

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

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

3.6 总结

  • 首先完成对微博各个站点分析,然后解决微博登陆问题,为构建账号池做准备。
  • 购买账号,构建账号池,并基于scrapy框架实现单机每日百万级的爬虫
  • 通过scrapy-redis框架,构建分布式的爬虫,实现每日千万级数据抓取。

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

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

结语

前文已经彻底分析介绍了微博爬虫的起源,价值和如何一步步的构建千万级的微博语料爬虫。
最后可以聊一聊对于爬虫这个事情和现在爬虫工程师这个岗位的认知。首先,爬虫这个事情并不违法,而且现在互联网上超过一般的流量都是爬虫。现在都在吹嘘大数据时代,那么大数据哪里来,大公司有千万上亿的用户,自然可以大数据,那么小创业公司呢,也只能通过爬虫来获取了。
所以爬虫工程师,这个岗位起始在大公司和小公司都非常需要,随手拉钩搜一张图。
enter image description here

可以看到京东这样的一线公司和后面的创业公司都在招聘爬虫工程师,这是站在大数据源头的人,数据抓取的质量和效率能直接影响后面的数据产品!
对的,数据产品,我想爬虫工程师,需要更多的考虑如何做一个数据产品,而不单单是蒙头爬数据,可以试着学习数据分析,挖掘的知识,真正实现手中的数据就是金钱。
本次的Gitchat就到这里结束啦,有什么问题欢迎大家跟我交流.

阅读更多

扫码向博主提问

千叶正志

非学,无以致疑;非问,无以广识
去开通我的Chat快问
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页