欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python数据分析揭秘知乎大V的小秘密

程序员文章站 2024-01-05 15:14:10
前言 文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者: 清风小筑 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 http://note.youdao.com/noteshare?id=3054cce4 ......

前言

文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者: 清风小筑

ps:如有需要python学习资料的小伙伴可以加点击下方链接自行获取

知乎,可以说是国内目前最大的问答类社区。与微博、贴吧等产品不同,知乎上面的内容更多是用户针对特定的问题分享知识、经验和见解。

大v的关联

首先给大家看的是知乎上粉丝数前50用户的关系图:

Python数据分析揭秘知乎大V的小秘密 Python数据分析揭秘知乎大V的小秘密 Python数据分析揭秘知乎大V的小秘密

图中的线是用户之间的相互关注的关系。这三张图的差别只在圆圈的大小上,依次分别代表:粉丝数、连入度(被图中其他人关注的数量)、连出度(关注图中其他人的数量)

比较明显的是,像知乎日报、刘看山、丁香医生这类普通用户关注较多的“机构号”,在大v中的受关注度并不高。

这张图是通过一个叫做 gephi 的软件,基于 python 采集下来的数据做出来的。其中圈的颜色是 gephi 根据关联关系自动聚合的结果。

谁是大v

知乎的四大指标:关注、赞同、感谢、收藏。我们分别看下以不同指标排行的“头部用户”:

Python数据分析揭秘知乎大V的小秘密

Python数据分析揭秘知乎大V的小秘密

Python数据分析揭秘知乎大V的小秘密

Python数据分析揭秘知乎大V的小秘密

 

其中,张佳玮可以说是非常突出了。(这个名字好熟悉……还记得之前的虎扑分析吗?)

 

Python数据分析揭秘知乎大V的小秘密

Python数据分析揭秘知乎大V的小秘密

 

官方收录回答数,张佳玮还是遥遥领先,收录文章数也榜上有名。

 

如果不论质量,仅看数量的话:

Python数据分析揭秘知乎大V的小秘密

Python数据分析揭秘知乎大V的小秘密

把这几组数据合成了两张三维散点图:

Python数据分析揭秘知乎大V的小秘密

Python数据分析揭秘知乎大V的小秘密

图中选取的数据为关注数大于1万的用户。在项目里有可以交互的网页版本,可以更直观的查看这个分布图。

Python数据分析揭秘知乎大V的小秘密

大v的热情在消退?

Python数据分析揭秘知乎大V的小秘密

Python数据分析揭秘知乎大V的小秘密

Python数据分析揭秘知乎大V的小秘密

Python数据分析揭秘知乎大V的小秘密

 

上面几张图是对目前关注数超10万的用户的历史发布数据进行的统计。从图上来看,2015年大v们更热衷于回答,后来则大都改去写专栏文章了。从趋势来看,似乎大v们发文的频率已不再增长。不过这并不能直接推断知乎的整体热度,也可能内容的产出更分散于不同用户了呢?这就只有知乎官方才有权威数据了。

用户爱看什么?

 

Python数据分析揭秘知乎大V的小秘密

Python数据分析揭秘知乎大V的小秘密

 

这些关注度最高专栏和收藏夹,里面有你关注的吗?

最后,这是一个以关注数超1万的用户的个人简介做出来的词云:

 

Python数据分析揭秘知乎大V的小秘密

代码

 1 # coding:utf8
 2 # 抓取粉丝数过 1w 用户
 3 import requests
 4 import pymongo
 5 import time
 6 import pickle
 7 ​
 8 def get_ready(ch='user_pd',dbname='test'):
 9     '''数据库调用'''
10     global mycol, myclient,myhp
11     myclient = pymongo.mongoclient("mongodb://localhost:27017/")
12     mydb = myclient[dbname]
13     mycol = mydb[ch]
14 get_ready()
15 ss = mycol.find({})
16 ​
17 se = {1,} # 去重集合
18 se2 = ['gouki9999','zhang-jia-wei'] # 爬取的列表
19 # with open(r'c:\users\yc\desktop\used.txt', 'rb') as f: # 读取
20 #     used = pickle.load(f)
21 used={1,}
22 sed = {}
23 for s in ss:
24     if s['follower_count']>=10000: # 粉丝数大于10000 
25         sed[s['user_id']] = sed.get(s['user_id'],0) + 1
26         if sed[s['user_id']] == 1:
27             se.add(s['user_id'])
28             se2.append(s['user_id'])
29 leng = len(se2)
30 print(leng)
31 proxies = {
32     "http": "http://spiderbeg:pythonbe@106.52.85.210:8000",
33     "https": "http://spiderbeg:pythonbe@106.52.85.210:8000",
34 }
35 headers = {
36     'user-agent':'mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/75.0.3770.100 safari/537.36',
37     'cookie':'your_cookie(用户主页面)'
38     }
39 for i,url_id in enumerate(se2): # 爬取
40     if i>=0:
41         print(i,' ', end='') # url个数
42     if url_id not in used: # 是否使用过
43         used.add(url_id)
44         nums = 500
45         off = 0
46         
47         while true:
48             url2 = 'https://www.zhihu.com/api/v4/members/' + url_id + '/followees?include=data%5b*%5d.answer_count%2carticles_count%2cgender%2cfollower_count%2cis_followed%2cis_following%2cbadge%5b%3f(type%3dbest_answerer)%5d.topics&offset=' + str(off) + '&limit=' + str(nums)
49             r2 = requests.get(url2, headers=headers,proxies=proxies)
50             time.sleep(0.5)
51             c = 0
52             if 'error' in r2.json():
53                 if r2.json()['error']['code'] in {310000, 310001}:
54                     break
55                 else:
56                     raise nameerror('页面错误')
57             used.add(url_id) # 判断是否使用
58             for d in r2.json()['data']:
59                 z = {}
60                 c+=1
61                 z['user_id'] = d['url_token']
62                 z['name'] = d['name']
63                 z['headline'] = d['headline']
64                 z['follower_count'] = d['follower_count']
65                 z['answer_count'] = d['answer_count']
66                 z['articles_count'] = d['articles_count'] # if d['articles_count'] else 0 
67                 z['from'] = url_id # 谁的关注列表
68                 if d['follower_count']>=10000 and d['url_token'] not in se and d['url_token'] not in used: # 粉丝大于 1w,则爬取
69                     se.add(d['url_token'])
70                     se2.append(d['url_token'])
71                     mycol.insert_one(z) # 插入数据
72             if r2.json()["paging"]['is_end'] == false:
73                 nums+=500
74                 off+=500
75             elif r2.json()["paging"]['is_end'] == true:
76                 break
77             else:
78                 print(r2.json)
79                 break

 

上一篇:

下一篇: