其他分享
首页 > 其他分享> > 一万粉的时候,我爬光了我所有的粉丝,只为验证一个事情

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

作者:互联网

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

前言

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

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

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

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

爬取 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 库的区别与联系

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

文章目录

标签:粉丝,一万,验证,dfs,urllib,import,requests,data
来源: https://blog.csdn.net/lusongno1/article/details/121021556