Skip to content

elliotxx/zhihu-crawler-people

Repository files navigation

zhihu-crawler-people

一个简单的分布式知乎爬虫,抓取知乎用户个人信息。

使用该爬虫做的数据分析:大数据报告:知乎百万用户分析

该爬虫的解析如何写一个简单的分布式知乎爬虫?

依赖

  • BeautifulSoup
  • pymongo
  • redis
  • requests

安装

  • 搭建主机数据库:MongoDB + Redis。
  • 搭建代理池 qiyeboy/IPProxyPool
  • 修改 common.py 18行,配置数据库。如果你设置了权限认证,那么请修改注释部分的认证信息,并去掉注释。
# 数据库设置
redis_host = 'your_ip'          # redis 主机地址
redis_port = 6379               # redis 主机端口
# redis_pwd  = 'your_password'	# redis 访问密码
mongo_host = 'your_ip'          # mongodb 主机地址
mongo_port = 27017              # mongodb 主机端口
# mongo_user = 'your_user'      # mongodb 登陆用户
# mongo_pwd  = 'your_password'  # mongodb 用户密码
  • 修改 ProxyIP.py 8行,配置代理池请求IP。
  host = 'http://your_proxy_pool_ip:8000' # 代理池请求IP
  • 如果你设置了数据库的权限认证,那么请将 info_crawler.py、list_crawler.py、test_speed.py 中 Init() 函数的连接数据库部分替换成注释中的代码。

分布式爬虫架构

redis 中设置五个集合:待抓取节点集合个人信息抓取成功节点集合个人信息抓取失败节点集合列表抓取成功节点集合列表抓取失败节点集合

它们在 Redis 中分别命名为 waiting / info_success / info_failed / list_success / list_failed

它们的关系为:

个人信息抓取进程 从 待抓取节点集合 中随机取出一个节点,抓取该节点代表的用户信息。如果抓取成功,加入 个人信息抓取成功节点集合,如果抓取失败,加入 个人信息抓取失败节点集合。

列表抓取进程 从 个人信息抓取成功节点集合 中随机取出一个节点,抓取该节点的 follower 列表。如果抓取成功,加入 列表抓取成功节点集合,如果抓取失败,加入 列表抓取失败节点集合。

整个分布式架构采用 主从结构:主机维护的数据库,配合从机的 info_crawler 和 list_crawler 爬虫程序,便可以循环起来:info_crawler 不断从 waiting 集合中获取节点,抓取个人信息,存入数据库;list_crawler 不断的补充 waiting 集合。

主机和从机的关系如下图:

大数据报告:知乎百万用户分析

使用该爬虫做的数据分析,全文见:大数据报告:知乎百万用户分析

知乎的男女比例?

首先来看看知乎用户的男女比例,以当前样本数据统计的结果接近 1:1,其中男生偏多一些。(其实还有很大一部分性别不明的用户,被我略掉了 ╮(╯▽╰)╭)

蓝色为男生,红色为女生。具体数据为:

男生:1,202,234 人,占 51.55%
女生:1,129,874 人,占 48.45%

知乎用户都是哪里人?

再来看看全国(全球?)都有哪些地方的人在玩知乎

由上图可以看到,知乎用户中一线城市用户占较大的比重,北上广深皆在词云的中心位置(文字越大,比重越大)。我们再来看看具体的排名(前十名):

知乎用户居住地前十名依次是:北京、上海、杭州、成都、南京、武汉、广州、深圳、西安、重庆

你可能发现了Y坐标里每座城市的用户数并不多,这是因为有大概260万的知乎没有填写“居住地”这一栏~ 以下分析也有可能出现用户没有填写某一栏信息的情况,我会把这些用户忽略掉,以保证展示图表的准确性。

知乎的职业分布?

以下显示知乎主流职业,同样根据知乎用户个人信息里填写的职业为准:

由上图可以看到,知乎用户中学生用户占据多数,其它的比如产品经理、程序员、运营、HR数量也不少。我们看一下具体的排名(前十名):

由上图可以看到,知乎用户中“学生”的比重独占鳌头,我们把“学生”去掉,来看看正经些的知乎职业排名

去除学生后,知乎主流职业比重从大到小依次是(前十名):产品经理、自由职业、程序员、工程师、设计师、腾讯、教师、人力资源(HR)、运营、律师。可以看到,除了一些互联网公司的常见职位外,教师和律师用户在知乎中也占据不小的比重。

下面我们结合 性别居住地 来分析一下知乎的主流职业。

知乎主流职业的性别分布

上面这张饼图的内圈表示各主流职业在前十名中所占的比重,外圈表示该职业从业者中的男女比例,蓝色为男性,红色为女性。我们再用一张直方图来表示:

同样蓝色代表男性,红色代表女性,从左到右的职业在知乎中的数量依次下降。可以看到,知乎大部分主流职业中主要为男性占主导。前 10 名的主流职业中有 8 个职业的男性从业者比女性多,其中以 程序员 的男女比例差距最为悬殊(-_-|||),以 设计师 男女比例差距最小,看来设计师从业人员男女比例较为均衡。其它的,比如产品经理、自由职业者、律师中,均为男性从业者多于女性。而前 10 名剩下的 2 个职业——教师、人力资源(HR)——女性从业者要多于男性,其中以 人力资源(HR) 男女比例差距最为悬殊,教师的男女比例虽不那么夸张,但女性也远远多于男性(也许是因为男性教师不怎么上知乎?)。

看完了知乎各职业的性别分布,我们再用一张热力图,来观察知乎主流职业(前五名)在各个地区的分布情况

这里我为了展示方便,去掉了产品经理,你只需要知道产品经理在各地人数都是最多的…… 不明白知乎上怎么这么多产品经理,可能是为了方便宣传他们的产品?

从上图可以看出,知乎各主流职业大部分集中在北京和上海两地,更准确地说,大部分都集中在北京,但是**人力资源(HR)**是个例外,他们更多集中在上海。我们再来看看其他职业,程序员分布最多的城市依次是:北京、上海、广州、杭州、厦门。北京占得比重最大,简直绿的发黑,看来北京是程序员的天堂?其中深圳没有上榜,让我很奇怪。设计师分布最多的城市依次是:北京、上海、杭州、深圳、武汉。设计师的地区分布比较平均,各个城市都有一定数量。

知乎的高校用户

知乎中学生用户占很大的比重,我们来看看他们都来自哪些学校!词云中字体越大,表示所占比重越大。

我们再列出详细的比重排名:

以上展示的结果不一定准确,可能有很大一部分学生用户没有填写自己的学校。仅从上图可以看出,知乎活跃高校用户从大到小依次是:浙江大学、武汉大学、华中科技大学、中山大学、北京大学、上海交通大学、复旦大学、南京大学、四川大学、清华大学

既然分析到学校了,我们顺便看看各高校的男女比例,嘿嘿。

发现一个有意思的现象,各高校大部分都是男生在玩知乎……

再看一下哪些高校在知乎获得的赞数最多

第一是同济大学,土木工程,恩,这是哪位大佬撑起来的;第二是华南理工大学,软件工程,这个我知道,轮子哥是皇家理工的嘛;第三,重庆第一工程尸培训基地,恩???这是什么鬼(黑人问号);继续往后看,恩……??家里蹲大学??!!还有一个兰州大学,牛肉面工艺专业???WHAT??!!∑(っ°Д°;)っ

知乎大佬都这么调皮吗……

这个图似乎不太准,大家忽略就好……

我们再来看看各地区有哪些高校是知乎重度用户

北京玩知乎最多的高校依次是:北京大学、北京邮电大学、中国传媒大学、中国人民大学、清华大学
上海玩知乎最多的高校依次是:上海交通大学、复旦大学、同济大学、上海大学、上海财经大学
杭州玩知乎最多的高校依次是:浙江大学、浙江工业大学、杭州电子科技大学、浙江大学,计算机科学、浙江大学,软件工程。浙江大学是重度用户啊……
成都玩知乎最多的高校依次是:电子科技大学、四川大学、西南交通大学、电子科技大学,软件工程、四川师范大学
广州玩知乎最多的高校依次是:中山大学(SYSU)、华南理工大学(SCUT)、华南农业大学(SCAU)、广东外语外贸大学、广东工业大学

我们再来看一下知乎各高校用户的活跃程度,按每个学校用户回答问题的总数排名:

排名依次是:武汉大学、浙江大学、中山大学、华南理工大学、北京大学、华中科技大学、复旦大学、上海交通大学、西北农林科技大学

好了,高校分析告一段落,我们再来看看知乎用户的各类排名。

知乎赞数最多的100位大V

下图中词云的字越大,表示收到的赞数越多:

我们再来一张直方图,配合着看:

张佳玮大大无可争议的获得第一名,360+万赞,恐怖。其次是马前卒、唐缺、vczh、肥肥猫、朱炫、Seasee Youl、ze ran、鬼木知、豆子。知乎获赞总数前五名有两位都是作家(张佳玮和唐缺),看来作家在知乎回答问题获赞方面还是很吃香,果然表达能力是观点获得认可的一个重要支撑 。

知乎关注者最多的100位大V

下图词云的字越大,表示关注者越多,看看有没有你熟悉的大V 呢?:

同样我们配合着一张直方图来看:

知乎关注人数最多的前10位大V依次是:张佳玮、李开复、黄继新、周源、张亮、张小北、李淼、朱炫、葛巾、田吉顺。这些是知乎真正的大V,关注者数量极多。关注者最多的张佳玮有137万粉丝(抓取时),他的粉丝还在不断上涨,到现在已经有138万粉丝。关注者最少田吉顺也有57万粉丝,轮子哥(vczh)稍微少一些,排在第11位。

知乎回答问题最多的100位大V

这些大V在知乎很活跃…… 下图词云文字越大,表示回答问题数量越多。

具体的排名为:

知乎回答问题数最多的10位大V从大到小依次为:vczh、李东、赵钢、另一只袜子、四海之内、M3小蘑菇、kun yu、白猫转转风、yskin、肛里拉出个电锯。微软的工作貌似很闲,看轮子哥(vczh)整天刷知乎……

我们再来加上这几位用户在知乎的获得的赞数,看看**“回答问题的数量”“获得的赞数”**之间有没有什么联系:

由上图我们可以粗略的得出结论,回答问题的数量和获得赞数的关系没有很大。上图中只有 kun yu 和 vczh 回答问题的数量和获赞数基本持平,榜单前十名的其它用户获得赞数虽然也不少,但和他们回答问题数量的排名比起来,还不在一个量级上。这从侧面也说明了一个问题,回答问题的质量更加重要,某些高质量的会更容易吸引用户点赞

知乎参加live最多的100位大V

我们再来看一个有意思的统计,知乎参加 live 最多的100位用户,以及他们最多参加过多少场 live。(live 是知乎推出的一种类似于直播的问答形式,大V开一场 live,分享他所在领域的知识,用户买门票参与 live,是一种知识变现的方式)

再来看看他们最多参加过多少场 live:

最多的那个大V竟然参加过 1600+ 场 live,真的很有精力和金钱,哈哈。

参考资料

Python操作redis(python client 操作)
http://www.cnblogs.com/melonjiang/p/5342505.html

Redis集合(redis 控制台操作)
http://www.yiibai.com/redis/redis_sets.html

Redis系列-存储篇set主要操作函数小结(redis 并集操作,可以将一个 set 数据移动到另一个 set)
http://blog.csdn.net/love__coder/article/details/8497497

Redis数据备份与恢复
http://www.cnblogs.com/qinghub/p/5909921.html

MongoDB入门(3)- MongoDB备份与恢复
http://www.cnblogs.com/wardensky/p/5799276.html

MongoDB 如何修改数据库名称
https://segmentfault.com/q/1010000000694527

Releases

No releases published

Packages

No packages published