一万粉的时候,我爬光了我所有的粉丝,只为验证一个事情

一万粉的时候,我爬光了我所有的粉丝,只为验证一个事情

前言

CSDN 博客网站的粉丝增长和访问增长是一件很离奇的事情。
如果你不发博客,粉丝几乎零增长。你发了一篇文字数量充分多的博客之后的一两天,会有一个粉丝量和访问量的突变,然后一下又零增长了。你以为这些突变是你发的这单篇博文带来的,但是我观察到,这篇文章几乎无访问量,难道这篇文章会带来别的文章访问量增加呢?离奇!
曾经每增加 N 个粉丝,都有 k 个人跟你互动。但是通过 C 站推荐,获得的 100N 个粉丝,却不足 k 个人跟你互动。不符合大数定律。粉丝很离奇!
原来每日的阅读量为 S,突然某一天,阅读量突然变成了 S/2 不到。这个突变,不符合互联网大背景下的自然市场规律,非常离奇!
……

基于以上的种种的离奇事件,我斗胆做出以下预测:

  • C 站官方“造”了很多机器僵尸粉或者直接利用了主人很久没上号的半僵尸粉,用于刺激博主们进行主动发文章,发长文章,发高质量文章。实际关注量并没有数据上那么高,官方放大了数值。在所谓的“热榜”、“粉丝”等虚荣心的刺激下,大家卷起来了。当然,大部分热门博主都是靠爱发电,并不是十分在乎这些。也是也有很多人,乐此不疲地去追求,这恰好也是 C 站官方所想看到的,几乎免费的劳动力,正中下怀。

  • 官方给出的每日阅读量等数据,是 C 站官方人为可控的,可以是主观的,而不是客观的访问。即,他想让你的访问量骤降,只是后台修改一个参数的事情。当然,修改也是基于客观数据的权重修改,而不是乱来。对于博文的各个数据,他们对于每个博主都有一个 threshhold 参数,来控制 “水” 的流出。各个数据之间似乎也没有相关关系。

  • 热榜算法,立足于自身利益,一直在修改。比如说,对于新人发好文的扶持,对于卷王的培养。

以上想法,纯属猜测,如有冒犯,请勿删文。一个好的企业总是经得起批评的,这样才会朝着更好的方向发展。狭隘的企业,才会时时提防别人说不好的话。

基于以上想法,值此粉丝破万之际,我们来爬取一下粉丝,一波分析看看他们是不是“机器僵尸粉”。

爬取 C 站粉丝和他们的访问量和粉丝数

代码比较简单,我就不解释了,直接贴出来。其中,参考了几行擦姐的代码。

爬所有粉丝

# -*- coding: utf-8 -*-
import requests
import random
import json
import pandas as pd
from lxml import etree
import math

n = 10000;#需要修改为想要爬取的粉丝数,数值要小于自己的粉丝数
page_num = math.ceil(n/20);
uas = [
    "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
]
ua = random.choice(uas)
headers = {
    "user-agent": ua,
    'cookie': 'UserName=lusongno1; UserInfo=f332fa86de644360b04f896a8a46f7d4; UserToken=f332fa86de644360b04f896a8a46f7d4;',
    "referer": "https://blog.csdn.net/qing_gee?type=sub&subType=fans"
}
url_format = "https://blog.csdn.net/community/home-api/v1/get-fans-list?page={}&size=20&noMore=true&blogUsername=lusongno1"

dfs = pd.DataFrame();
for i in range(1,page_num+1):
    print("get page:"+str(i))
    url = url_format.format(i);
    response = requests.get(url,headers=headers)
    content = json.loads(response.text)
    tmp=content.get("data")
    data=tmp.get("list")
    df=pd.DataFrame(data)
    dfs = pd.concat([dfs,df],axis=0)
    
dfs = dfs.reset_index()
dfs.to_csv("fans.csv",encoding='utf_8_sig')#, index_label="index_label")

获得粉丝的访问量等基本情况

dfs['访问'] = None
dfs['粉丝'] = None
dfs['原创'] = None
dfs['周排名'] = None
dfs['总排名'] = None
for i in range(0,len(dfs)):
    print("get fan:"+str(i))
    link = dfs.iloc[i]['blogUrl']
    res = requests.get(link,headers=headers)
    html = res.text;
    tree=etree.HTML(html)
    yuanchuang = tree.xpath('//*[@id="asideProfile"]/div[2]/dl[1]/a/dt/span')   
    fangwen = tree.xpath('//*[@id="asideProfile"]/div[2]/dl[4]/dt/span')
    fensi = tree.xpath('//*[@id="fan"]')
    zhoupaiming = tree.xpath('//*[@id="asideProfile"]/div[2]/dl[2]/a/dt/span')
    zongpaiming = tree.xpath('//*[@id="asideProfile"]/div[2]/dl[3]/a/dt/span')
    yc = yuanchuang[0].text
    fw = fangwen[0].text
    fs = fensi[0].text
    zpm = zhoupaiming[0].text
    zongpm = zongpaiming[0].text
    dfs.loc[i:i,('访问','粉丝','原创','周排名','总排名')]=[fw,fs,yc,zpm,zongpm]
del dfs['userAvatar']
del dfs['briefIntroduction']
del dfs['index']
dfs.to_csv("myFans.csv",encoding='utf_8_sig')  

对于粉丝的论述

跑完程序,我就爬下来了两张表。一张表包括所有粉丝的 ID、昵称、头像、博客链接、是否互关、是否博客专家、个人签名。另外一张表包含了粉丝的原创文章数、访问量、粉丝数、排名情况等。

粉丝基本情况

一万粉的时候,我爬光了我所有的粉丝,只为验证一个事情

从粉丝上可以看出,和我互关的一共有 9 人。他们是我的几个研究生同学,还有杨老师、英雄哥等前排的博主,包括 CSDN 官方博客。其中,博客专家有 4+ 人,他们是秀璋老师、天涯哥、大饼和小新,因为 get 返回的结果有 bug,所以很多博客专家被标成了不是,比如说天涯兄,所以我这里写了 4+。

一万粉的时候,我爬光了我所有的粉丝,只为验证一个事情

他们当中,粉丝数过 1000 的,一共有 17 人。原创文章数达到 100 的,一共有 68 人。

一万粉的时候,我爬光了我所有的粉丝,只为验证一个事情

周排名在 1 万名以内的,一共有 30 人。访问量过万的有 371 人。总排名在 1 万以内的,一共有 42 人。

粉丝是否僵尸粉的判别

现在重点来了,这 1 万的粉丝里面,到底有没有是通过官方推荐关注的 “僵尸机器粉” 呢?如何判别?这个有点难,我找到了好多论文,也没找到有用的方法。

退而求其次,我分析了我的粉丝数据,还是无法推出他们是机器粉的结论。主要是那些零访问、零粉丝、无文章、无排名的粉丝批量分析之后都太真实了,不管是从头像,还是 ID,还是昵称。如果真是随机的,那我也没办法了。

本着疑罪从无的态度,我宣布,C 站没有用僵尸粉诱导我们写文章。它还是我们曾经的那个好大哥。

即使如此,博客文章的各个维度的数据,官方必然是有所控制的,而不是自然发展的。他们是一个公司,他们有一帮子人要养,服务器也要钱,不管他们干了什么,哪怕放了很多广告,我们也要理解。既然享受了权利,就要履行一定的义务。世上没有只白嫖别人,而不付出的道理。

python3 网页抓取基本模板

贴一个爬数据的基本模板,引为参考。

urllib、urllib2、requests 库的区别与联系

  • urllib、urllib2 是 python2 自带的库,二者相互补充。
  • python3 中只有 urllib,而 urllib2 已经不再存在,在 python3 中,urllib 和 urllib2 进行了合并,现在只有一个 urllib 模块,urllib 和 urllib2 的中的内容整合进了 urllib.request,urlparse 整合进了urllib.parse。
  • requests 是第三方库,它的 slogen 是“Requests is the only Non-GMO HTTP library for Python, safe for human consumption”。因为 urllib 和 urllib2 太乱了,使用时还需要考虑编码问题。
  • requests 是 对 urllib 更上层的封装,使用更傻瓜方便。

requests 使用的一个基本框架

GET 方式

import requests
stuID = "xxxxxxxxxxxxxxx"
url = "xxx"+stuID
r = requests.get(url)

# requests提供了 params 关键字参数来传递参数
parameter = {
            "key1":"value1",
            "key2":"value2"
            }
response = requests.get("http://httpbin.org/get",params = parameter)
print(response.url)
# 输出 http://httpbin.org/get?key1=value1&key2=value2

POST 方式

import requests
payload = {
    "key1":"value1",
    "key2":"value2"
}
response = requests.post("http://httpbin.org/post",data = payload)
print(response.text)

import requests
postdata = { 'name':'aaa' }
r = requests.post("http://xxxxx",data=postdata)
print(r.text)

#如果要爬虫用的话 一般建议带上session会话和headers表头信息,session会话可以自动记录cookie
s = requests.Session()
headers = { 'Host':'www.xxx.com'}
postdata = { 'name':'aaa' }
url = "http://xxxxx"
s.headers.update(headers)
r = s.post(url,data=postdata)
print(r.text)

#可以直接带上 header
import requests
#import json
 
data = {'some': 'data'}
headers = {'content-type': 'application/json',
           'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}
 
r = requests.post('https://api.github.com/some/endpoint', data=data, headers=headers)
print(r.text)

urllib 使用的一个基本框架

GET 方式

from urllib.request import urlopen
myURL = urlopen("https://www.runoob.com/")
f = open("runoob_urllib_test.html", "wb")
content = myURL.read()  # 读取网页内容
f.write(content)
f.close()

POST 方式

import urllib.request
import urllib.parse
url = 'https://www.runoob.com/try/py3/py3_urllib_test.php'  # 提交到表单页面
data = {'name':'RUNOOB', 'tag' : 'xx教程'}   # 提交数据
header = {
    'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}   #头部信息
data = urllib.parse.urlencode(data).encode('utf8')  # 对参数进行编码,解码使用 urllib.parse.urldecode
request=urllib.request.Request(url, data, header)   # 请求处理
reponse=urllib.request.urlopen(request).read()      # 读取结果
fh = open("./urllib_test_post_runoob.html","wb")    # 将文件写入到当前目录中
fh.write(reponse)
fh.close()

文章目录

上一篇:Python爬虫实战,requests模块,Python实现爬取网站漫画


下一篇:【Python爬虫】尺度太大了!爬一个专门看小姐姐的网站,写一段紧张刺激的代码(附源码)