微博爬虫系列(1):爬取并分析用户粉丝

前言

相信大家微博粉丝列表里面都拥有很多粉丝吧,但是仔细观察这些粉丝,你会发现很多都是僵尸粉,真正有效的粉丝少之又少。我们平时看到一些大V用户粉丝都是几十万几千万的,但到底真正的粉丝是不是有那么多呢?今天我们就来选取其中一个大V用户,然后分析他的粉丝。

前期分析

在电脑访问新浪微博移动端(m.weibo.com),然后找到你想进行分析的用户。电脑端不能直接打开粉丝列表,我们就借助json中的粉丝地址进行访问。

图1 关注列表和粉丝列表的地址

我们在Network中找到粉丝页的JSon文件。

图2 粉丝数据所在的JSon文件

然后看到Headers部分,记住Request URL。第一页的地址往往跟后面是不同的,后面一般多了页面id。

图3 Headers

开始爬取

由于用户名里面可能会出现特殊表情(tk字符),导致Python因为无法识别这些字符而出错,所以要进行处理。

non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), 0xfffd)

由于微博的反爬虫可能会导致页面连接失败,所以要设置重试次数(这里设为3次),并且采用循环爬取(爬取微博内容必须循环爬取,否则会经常出错)。

from requests.adapters import HTTPAdapter

requests = requests.Session()

requests.mount('http://', HTTPAdapter(max_retries=3))

requests.mount('https://', HTTPAdapter(max_retries=3))

获取数据。

headers = {"User-Agent":"……"}

#第二页地址

url_next = "https://m.weibo.cn/api/container/getIndex?containerid=……featurecode=20000320&since_id="

for i in range(1,251): #微博粉丝页只公开显示了前250页

print(str(i))

if i == 1:#第一页地址

url = "https://m.weibo.cn/api/container/getIndex?containerid=231051_-_fans_-……&featurecode=20000320"

else:#第二页地址

url = url_next + str(i)

req = requests.get(url,headers=headers,verify=False)

text = json.loads(html,encoding="UTF-8")

cg = text['data']['cards']

if(len(cg) > 0):

cg = cg[0]['card_group']

#print(gender.encode('utf-8'))

total = text['data']['cardlistInfo']['total']

我特意测试了250页之后的内容,返回的json文件如下:

{"ok":0,"msg":"\u8fd9\u91cc\u8fd8\u6ca1\u6709\u5185\u5bb9","data":{"cards":[]}}

其中Unicode字符转码后为:

(转码地址:http://tool.chinaz.com/tools/unicode.aspx)

这里还没有内容

其实对于用户数据的保护,微博还是有采取措施的,至少粉丝列表不允许全部查阅。

图4 粉丝列表的权限

要测试250页之后的内容,就必须要设置条件,否则json解析会出错。将上面的字典部分改成下面形式。

if "cards" in text['data'].keys(): #250页后没有了cards键,所以要进行判断

cg = text['data']['cards']

else:

cg = ""

if(len(cg) > 0): #当cg大于0,证明有cards键,并且有列表数据

cg = cg[0]['card_group']

#print(gender.encode('utf-8'))

total = text['data']['cardlistInfo']['total']

结果分析

我们对粉丝分一下类,统计每一类的数量。

for each in cg:

user = user + 1

#---------------start-------------------

#粉丝数小于10的用户

if each['user']['followers_count']

followers_count10 = followers_count10 + 1

#关注数小于10的用户

if each['user']['follow_count']

follow_count10 = follow_count10 + 1

#均小于10的用户

if each['user']['follow_count']

both_count10 = both_count10 + 1

#-----------------end-------------------

#---------------start-------------------

#粉丝数小于20的用户

if each['user']['followers_count']

followers_count20 = followers_count20 + 1

#关注数小于20的用户

if each['user']['follow_count']

follow_count20 = follow_count20 + 1

#均小于20的用户

if each['user']['follow_count']

both_count20 = both_count20 + 1

#-----------------end-------------------

#---------------start-------------------

#粉丝数小于30的用户

if each['user']['followers_count']

followers_count30 = followers_count30 + 1

#关注数小于30的用户

if each['user']['follow_count']

follow_count30 = follow_count30 + 1

#均小于30的用户

if each['user']['follow_count']

both_count30 = both_count30 + 1

#-----------------end-------------------

#认证用户数

if each['user']['verified'] == True:

verify_user = verify_user + 1

if each['user']['followers_count']

verify30 = verify30 + 1

print(each['user']['screen_name'])

#普通有效用户数

if each['user']['followers_count'] > 30 and each['user']['verified'] == False:

valid_user = valid_user + 1

我们能看到的粉丝数量只有4875个,相比粉丝总数是非常少的了。

图5 粉丝情况

我们看到在前4875名粉丝里面:

粉丝数小于10的用户数量与关注数小于10的用户数量分别约占35%和8%

粉丝数小于20的用户数量与关注数小于20的用户数量分别约占43%和12%

粉丝数小于30的用户数量与关注数小于30的用户数量分别约占49%和17%

两者都小于的数量略低于各段关注数小于的用户数量

认证用户约占1%

有效用户约占49%

正常应该是user = 粉丝数小于30的用户数量 + 有效用户数量 + 认证用户数量,但实际不相等

粉丝数小于30的用户数量占了将近用户可见粉丝数的一半,说明了存在着很多僵尸粉,我们姑且把僵尸粉的标准放低点,以小于10为标准,但也占了三成。其实有时觉得微博不让看全部的粉丝数,是不是只是为了不让人知道里面到底有多少僵尸粉呢?!

不过我们不能忽略那些用小号追星的人,这部分人据我所知也是存在的,但僵尸粉的数量会远多于这部分人。

关于僵尸粉,我查了一下百度百科。

图6 百科资料1

图7 百科资料2

图8 百科资料3

1968年,美国科学史研究者罗伯特·莫顿(Robert K. Merton)提出马太效应以概括一种社会心理现象:“相对于那些不知名的研究者,声名显赫的科学家通常得到更多的声望;即使他们的成就是相似的,同样地,在一个项目上,声誉通常给予那些已经出名的研究者”。

图7提到衡量用户的影响力是由被评论数、被转发数和粉丝数组成的,但我认为应该是由被评论数和被转发数组成的,因为真正的粉丝是会关注你的微博,会发表意见的,而不仅仅是关注和赞。有些几千万粉丝甚至粉丝上亿的用户微博下面却没有多少评论,他们仅靠粉丝数来彰显自己其实正体现了他们的不自信和自欺欺人,以为自己的关注度高了就能出名了(马太效应)。虽然很多时候僵尸粉都是注册时系统自动分配的,但是买粉的情况也是存在的。

而我爬取的这位大V用户,微博底下评论数和转发数稳定在一万多,赞稳定在四五万左右,赞偶尔会有十几万(但“赞”我认为只能衡量微博内容的热度),所以2000多万粉丝里面的僵尸粉可想而知有多少了,而且分析的过程中粉丝数也不断增加了几十个。

如果说要整理注册时送粉丝和买粉的行为,那也不太可能,因为谁敢处理这条利益链呢?!

(………………)

琴子的喵窝∣分享文化,生活

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180422G0PHZ500?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券