即使你是北航的学生,你也可能从未听说过北航羊公主。不过我也没有什么立场在这里说三道四,姑且替羊公主做一个免费宣传吧。她的知乎页面是https://www.zhihu.com/people/weslinayun-yang-yang/activities
不过之前一直有关于羊公主的粉丝造假的传闻,有人说公主的粉丝除了50个喜羊羊粉丝,500个看热闹的围观群众,剩下全是买的。对于这种观点我一直是不认可的,毕竟没有证据。
前几天羊公主发了新的知乎想法(类似微信朋友圈),庆祝自己达成4000粉丝。不过作为一个4000粉丝的大V,这条想法只有4个人点赞,实在是过于丢人
我的学长最近意外同羊公主发生了口角,但我无意站队支持其中任何一方。不过他们爆出了一点有意思的内容:
羊公主
羊公主
所以我们有必要来分析一下羊公主真正的粉丝了。不过羊公主把知乎上所有发过对其不利言论的人都拉黑了,我写下此文的时候,就注定了自己也要被拉进黑名单里。

模型

以下内容看不懂请直接跳到文章后半部分看图。
我们只需要从数据中分析出一个账户是否有买粉丝的嫌疑,而不是要具体确认哪些粉丝是假的。
我们不能通过一个账号的关注/被关注数、问答数、动态数等数据完全确认其为假粉丝,毕竟我知道有些人用知乎只看别人回答,从不创作。
虽然我们不能判断具体到单个账号的粉丝是不是假的,但是从总体上假粉丝应该有一定规律。
基于群友和淘宝上一个知乎刷粉的店家沟通后我们做出如下推测:店家拥有一个账号池(店家宣称真人账号),且容量比较大。这里我们没必要在意该账号池是机器人号还是真人号,因为即使按照店家所介绍的真人真号,我们也有理由认为这是真人建立的专用于卖粉丝的账号,因此其账号特征应该和机器号没什么区别。
这里我们也无法通过比较几个账号的关注列表和顺序进行判断。由于账号池很大,在每次出售粉丝的时候必然只会用到一部分,因此池子着每个账号的关注总数和顺序都不一致。
但是每个账号关注的数量(即卖出去的次数)应该是极为相近的。因此我们有理由认为,如果一个账号的关注者按照关注时间排序,粉丝的关注数在某一个范围出现集中,则说明这个账号在这个区间段存在买粉行为。若要进一步验证,可以选特征明显的区间段,去知乎上搜索该段的粉丝账号,然后人工判断。经我人工判断,这个模型是成立的,但是存在特殊情况的误判,仅供参考。
本次实验使用这个简单的模型,相关数据获取工具在下面,欢迎各位自己复现实验结果。同时也欢迎各位提出更精确的模型。

爬虫

又双叒叕要写爬虫了,这次利用知乎 API v4,主要参考了outback123的博客我们的目的是爬取其粉丝的关注/被关注数量。
首先获取目标的粉丝。
没有模拟登陆过程,因此请先在默认浏览器登陆知乎。

import requests
f = open("furls.txt","w")
followed_url = "https://www.zhihu.com/api/v4/members/{user}/followers?include={include}&limit={limit}&offset={offset}"
followed_query = "data[*].answer_count,articles_count,gender,follower_count,is_followed,is_following,badge[?(type=best_answerer)].topics"
headers={'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit'}
user = 'weslinayun-yang-yang'
offset = 0
while True:
    r = requests.get(followed_url.format(user = user,include = followed_query,limit = '20',offset = str(offset)),headers=headers)
    temp = r.json()
    l = temp['data']
    if len(l) == 0:
        break
    for i in l:
        print(i['url_token'])
        f.write(i['url_token']+'\n')
    offset = offset+20
    print(str(offset)+"已完成")
f.close()

但是这里返回的数据不包含我们需要的关注数,因此要依次爬每个粉丝:

import requests
f = open("furls.txt","r")
users = f.read().split('\n')[:-1]
f.close()
user_url = 'https://www.zhihu.com/api/v4/members/{user}?include={include}'
user_query = 'locations,employments,gender,educations,business,voteup_count,thanked_Count,follower_count,following_count,cover_url,following_topic_count,following_question_count,following_favlists_count,following_columns_count,answer_count,articles_count,pins_count,question_count,commercial_question_count,favorite_count,favorited_count,logs_count,marked_answers_count,marked_answers_text,message_thread_token,account_status,is_active,is_force_renamed,is_bind_sina,sina_weibo_url,sina_weibo_name,show_sina_weibo,is_blocking,is_blocked,is_following,is_followed,mutual_followees_count,vote_to_count,vote_from_count,thank_to_count,thank_from_count,thanked_count,description,hosted_live_count,participated_live_count,allow_message,industry_category,org_name,org_homepage,badge[?(type=best_answerer)].topics'
headers={'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit'}
flag = 0
f = open("0.txt","w")
for user in users:    
    r = requests.get(user_url.format(user = user,include = user_query),headers=headers)
    temp = r.json()
    f.write(str(temp["following_count"])+'\t'+str(temp["follower_count"])+'\t'+str(temp["answer_count"])+'\t'+str(temp["question_count"])+'\n')
    flag = flag+1
    if flag%100 == 0:
        f.close()
        print(flag,"已完成")
        f = open(str(flag)+".txt","w")
if flag%100 != 0:
    f.close()
print(flag,"已完成")

程序分开运行,数据也分段保存的主要原因是,说不定爬着爬着就被知乎反爬虫制裁了,因此拿到少量数据就立刻保存。

数据处理

羊公主(4k粉)

我们把分割储存的数据合并,用excel打开并以关注数/被关注数制作折线图如下:

个别数据值太高影响总体判断,我们把横纵坐标范围修改一下,纵坐标只显示到100。

看起来好像很有趣啊。横坐标从左到右依次是新关注的粉丝,纵坐标是个数,蓝色表示x轴对应账号的关注数量,黄色则是该账号自身的粉丝数量。此模型中粉丝的粉丝数几乎没有作用。
为了看的更明显,我们把横坐标限制在最新的1000粉丝上。

对照组

但是正常账号的粉丝数据应该是什么样子的呢?我们要设置对照组。
对照组必须满足未购买假粉丝这个条件,可是一个账号粉丝是否造假不是号主自己说的算的。
对此我们可以找一些公信力极强的大V,例如共青团中央等。此模型的验证完全基于我对共青团中央等账号的无条件信任。
但是我爬共青团中央爬到1000个数据的时候触发了反爬,费了点劲才拿到数据。

共青团中央(837k粉)

这是共青团中央最新的4000个粉丝的关注/被关注数:

最新1000粉丝图:

看起来……没啥规律啊。可能是影响力太大,可以保证自身的粉丝都是普通的知乎用户且数据趋向于无序杂乱。我们可以认为这是一组真正的粉丝数据。

indienova(4k粉)

4000粉图表(其粉丝质量很高,纵坐标上限调成1000仍然很壮观):

1000粉图表:

可能由于是面向开发者的账号,其粉丝一般都是开发行业的大/小V,所以粉丝的粉丝数非常高。但是总体来说还是趋向于无序。

对照组结论

此外仍有几个大V的粉丝数据受限于文章长度无法展示,但是我们依然可以发现无论是针对普通大众还是某一特定群体的大V,其粉丝的数据规律性普遍极低,无法轻易找到规律。如果针对这个结果有异议,欢迎使用任何您认为有公信力的大V,或者您有充足的证据认定为清白的账号进行实验复现。

附加图表

一张羊公主4000粉的散点图:

虽然这类图表用散点图更适合,但我个人认为折线图视觉效果更好。

总结

关于羊公主粉丝造假的事情,根据以上实验,我们虽然不能100%肯定地得出一个结论,但是真相已经在各位心中了。

2019年11月14日更新

最近发现公主一直以50人/日速率涨粉,顺手人工看了下粉丝都是什么人。不看不知道,一看吓一跳。这是羊公主第4496个粉丝:

后面几乎全是这样的账号,大部分甚至连一条动态都没有。甚至就在我写这段话的时候,新增了两个同样类型的粉丝。
至此,虽然关于模型的准确性还可以讨论,但是关于羊公主粉丝造假的问题已经没有任何值得讨论的意义了。现在看羊公主前前后后关于自己粉丝的言论,真的非常好笑,喜感度超过她介绍自己的邻居姐姐。当然本文并没有实锤,因此也请各位不要以此文为证据去知乎举报羊公主。


挂科一时爽,一直挂科一直爽。
🀇🀇🀇🀈🀉🀊🀋🀌🀍🀎🀏🀏🀏 🀋