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

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

前言

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

    文章目录

  • 一万粉的时候,我爬光了我所有的粉丝,只为验证一个事情
  • 前言
  • 爬取 C 站粉丝和他们的访问量和粉丝数
  • 爬所有粉丝
  • 获得粉丝的访问量等基本情况
  • 对于粉丝的论述
  • 粉丝基本情况
  • 粉丝是否僵尸粉的判别
  • python3 网页抓取基本模板
  • urllib、urllib2、requests 库的区别与联系
  • requests 使用的一个基本框架
  • GET 方式
  • POST 方式
  • urllib 使用的一个基本框架
  • GET 方式
  • POST 方式
  • 来源:陆嵩

    物联沃分享整理
    物联沃-IOTWORD物联网 » 一万粉的时候,我爬光了我所有的粉丝,只为验证一个事情

    发表评论