前言
文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
作者: 清风小筑
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef
知乎,可以说是国内目前最大的问答类社区。与微博、贴吧等产品不同,知乎上面的内容更多是用户针对特定的问题分享知识、经验和见解。
大V的关联
首先给大家看的是知乎上粉丝数前50用户的关系图:
图中的线是用户之间的相互关注的关系。这三张图的差别只在圆圈的大小上,依次分别代表:粉丝数、连入度(被图中其他人关注的数量)、连出度(关注图中其他人的数量)
比较明显的是,像知乎日报、刘看山、丁香医生这类普通用户关注较多的“机构号”,在大V中的受关注度并不高。
这张图是通过一个叫做 Gephi 的软件,基于 Python 采集下来的数据做出来的。其中圈的颜色是 Gephi 根据关联关系自动聚合的结果。
谁是大V
知乎的四大指标:关注、赞同、感谢、收藏。我们分别看下以不同指标排行的“头部用户”:
其中,张佳玮可以说是非常突出了。(这个名字好熟悉……还记得之前的虎扑分析吗?)
官方收录回答数,张佳玮还是遥遥领先,收录文章数也榜上有名。
如果不论质量,仅看数量的话:
把这几组数据合成了两张三维散点图:
图中选取的数据为关注数大于1万的用户。在项目里有可以交互的网页版本,可以更直观的查看这个分布图。
大V的热情在消退?
上面几张图是对目前关注数超10万的用户的历史发布数据进行的统计。从图上来看,2015年大V们更热衷于回答,后来则大都改去写专栏文章了。从趋势来看,似乎大V们发文的频率已不再增长。不过这并不能直接推断知乎的整体热度,也可能内容的产出更分散于不同用户了呢?这就只有知乎官方才有权威数据了。
用户爱看什么?
这些关注度最高专栏和收藏夹,里面有你关注的吗?
最后,这是一个以关注数超1万的用户的个人简介做出来的词云:
代码
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:[email protected]:8000", 33 "https": "http://spiderbeg:[email protected]: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