4

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

 2 years ago
source link: https://blog.csdn.net/lusongno1/article/details/121021556
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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()

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK