Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/elliotxx/zhihu-crawler-people

A simple distributed crawler for zhihu && data analysis
https://github.com/elliotxx/zhihu-crawler-people

crawler python python-crawler spider web-crawler web-spider

Last synced: 7 days ago
JSON representation

A simple distributed crawler for zhihu && data analysis

Awesome Lists containing this project

README

        

## zhihu-crawler-people

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

使用该爬虫做的数据分析:[大数据报告:知乎百万用户分析](http://yangyingming.com/article/389/)

**该爬虫的解析**:[如何写一个简单的分布式知乎爬虫?](http://www.yangyingming.com/article/392/)

### 依赖
* BeautifulSoup
* pymongo
* redis
* requests

### 安装
* 搭建主机数据库:MongoDB + Redis。
* 搭建代理池 [qiyeboy/IPProxyPool](https://github.com/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**。

它们的关系为:

![](http://www.yangyingming.com/uploads/markdownx/2017/7/c4595153-977e-4ee0-b5a7-217c31157ce2.png)

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

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

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

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

![](http://www.yangyingming.com/uploads/markdownx/2017/7/b08b1bc1-36a0-46a9-a844-3def95e249f1.png)

### 大数据报告:知乎百万用户分析
使用该爬虫做的数据分析,全文见:[大数据报告:知乎百万用户分析](http://yangyingming.com/article/389/)
#### 知乎的男女比例?
首先来看看知乎用户的男女比例,以当前样本数据统计的结果接近 **1:1**,其中男生偏多一些。(其实还有很大一部分性别不明的用户,被我略掉了 ╮(╯▽╰)╭)

![](http://yangyingming.com/uploads/markdownx/2017/7/e5ceffab-2afb-44d8-84ef-c602ab5cf17b.png)

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

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

#### 知乎用户都是哪里人?

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

![](http://yangyingming.com/uploads/markdownx/2017/7/d67b117f-1363-4489-b3f8-8b2bb0770ea2.png)

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

![](http://yangyingming.com/uploads/markdownx/2017/7/79272e4b-2483-4936-afd5-afbd7f21cc71.png)

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

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

#### 知乎的职业分布?

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

![](http://yangyingming.com/uploads/markdownx/2017/7/7573ec55-bcf2-40c7-b7dc-34d3d117b576.png)

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

![](http://yangyingming.com/uploads/markdownx/2017/7/5c22df3e-c26f-49f5-a6bd-2197e9db439d.png)

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

![](http://yangyingming.com/uploads/markdownx/2017/7/dced3ee9-f009-420a-b96a-4b7c234ce5c6.png)

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

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

**知乎主流职业的性别分布**:

![](http://yangyingming.com/uploads/markdownx/2017/7/33c3fb3c-aa80-4af4-8aa4-b05fa58bd6a7.png)

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

![](http://yangyingming.com/uploads/markdownx/2017/7/58d76873-aee3-4b83-b068-c22916c88937.png)

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

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

![](http://yangyingming.com/uploads/markdownx/2017/7/a66c6cb9-0203-4bec-85f6-0c766a23faba.png)

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

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

#### 知乎的高校用户

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

![](http://yangyingming.com/uploads/markdownx/2017/7/efa772e2-456c-4209-8428-417a339cacb8.png)

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

![](http://yangyingming.com/uploads/markdownx/2017/7/aed3a33c-cbf2-4dcd-bc69-87646e044165.png)

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

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

![](http://yangyingming.com/uploads/markdownx/2017/7/c31c5be7-32ff-4a03-9e55-d33ff82df7c5.png)

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

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

![](http://yangyingming.com/uploads/markdownx/2017/7/01d6e457-5b2f-4d5c-8b4a-0f8685275b92.png)

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

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

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

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

![](http://yangyingming.com/uploads/markdownx/2017/7/16c52d52-b175-4b34-93a7-6f54314a84fa.png)

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

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

![](http://yangyingming.com/uploads/markdownx/2017/7/0ef9b198-ad67-46e9-86aa-ce95d779195f.png)

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

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

#### 知乎赞数最多的100位大V

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

![](http://yangyingming.com/uploads/markdownx/2017/7/0162a585-5166-4ec9-8783-985e142f5487.png)

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

![](http://yangyingming.com/uploads/markdownx/2017/7/5c52ea6b-ef1b-469b-a4ff-d8af1e0a5e6e.png)

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

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

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

![](http://yangyingming.com/uploads/markdownx/2017/7/7dbe042e-1919-4206-b1e4-e2c27b6350cc.png)

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

![](http://yangyingming.com/uploads/markdownx/2017/7/659c517c-1488-4f45-96aa-1ad3c3452b98.png)

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

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

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

![](http://yangyingming.com/uploads/markdownx/2017/7/e331d138-be36-4397-8e40-804b3915ee61.png)

具体的排名为:

![](http://yangyingming.com/uploads/markdownx/2017/7/25e2b7aa-1256-497a-b700-ea51f585944a.png)

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

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

![](http://yangyingming.com/uploads/markdownx/2017/7/887a4afe-7f93-4e54-92a2-911f45801447.png)

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

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

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

![](http://yangyingming.com/uploads/markdownx/2017/7/00d0a022-99a8-4fb8-a16c-cd63c525e6b5.png)

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

![](http://yangyingming.com/uploads/markdownx/2017/7/cf0f7836-72c1-4172-ab28-c3bb671b6f9c.png)

最多的那个大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