天天看點

爬取B站前兩千位up主的粉絲數

看到B站有很多分析up主粉絲量的視訊,自己也來試着實作一下

  1. 第一步先進到一位up主的個人空間,這裡以uid是1和2的bishi為例,

    https://space.bilibili.com/1/

    ,使用者名:bishi

    https://space.bilibili.com/2/

    ,使用者名:碧詩

    可以看到,前面的連結都是一樣的,後面的數字就是up主的uid,那我們隻要改變後面的數字就可以了。

    但是,如果在爬蟲程式中直接用這個url會發現擷取不到資料,是以說,這個url是不正确的。

    爬取B站前兩千位up主的粉絲數

    說到底,我們效果要擷取的就是粉絲數等,而所有的資料都會在控制台中出現,那我們直接搜尋粉絲數就可以了,這裡注意一點,大up主的粉絲是以萬為機關的,但是在控制台中并不是。是以他的粉絲10.3萬,需要用103來搜尋(不要小數點,但是10.3萬并不精确到個,是以隻用103就可以)

    在控制台按CTRL+F,搜尋103

    爬取B站前兩千位up主的粉絲數
    當然還有一種做法,這是我已經找到資料才發現的,粉絲在代碼中顯示的英語是follower,是以直接搜尋follower也是可以的
    爬取B站前兩千位up主的粉絲數

    可以看到,搜尋103有90個結果,而follow隻有14個結果

    搜尋完成之後,可以挨個結果點開看,經驗比較豐富的找起來會更快一點。

    找到需要的檔案,打開,發現相應的結果是這個:

__jp3({“code”:0,“message”:“0”,“ttl”:1,“data”:{“mid”:1,“following”:5,“whisper”:0,“black”:0,“follower”:102616}})

mid:其實就是uid

following:關注數

follower:粉絲數

剩下兩個我沒在網頁找到對應的東西

102616約等于10.3萬,如果不放心的話,可以多找幾個試試。

之後,我們需要再找到url,到标頭(header)裡,找到請求url(request url):

https://api.bilibili.com/x/relation/stat?vmid=1&jsonp=jsonp&callback=__jp3

vmid=1,就是uid,後面的東西每個up主都是一樣的

那我們的url就可以用循環來設定

uid = 1
while True:
	url = f'https://api.bilibili.com/x/relation/stat?vmid={str(uid)}&jsonp=jsonp&callback=__jp3'  
           
  1. 之後就是發送請求,擷取相應就可以了,需要注意的是,響應回來的資料是json格式,需要導入json包,json.dumps()一下。将解析出來的資料存到資料庫裡。
import requests
import json
import MySQLdb

conn = MySQLdb.connect(host='localhost',port=3306,password='',user='',db='',charset='utf8')
cursor = conn.cursor()
uid = 1
while uid <100000:
    try:
        headers = {
            'referer': 'https://api.bilibili.com/x/relation/stat?vmid=10330740',
            'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'
        }
        url = f'https://api.bilibili.com/x/relation/stat?vmid={str(uid)}&jsonp=jsonp&callback=__jp3'
        proxy = {'HTTP': 'HTTP://106.37.195.199:8080'}
        res = requests.get(url,headers=headers,proxies=proxy)
        print(res.text[6:-1])
        result = json.loads(res.text[6:-1])
        fans = result['data']['follower']

        url2 = f'https://api.bilibili.com/x/space/acc/info?mid={str(uid)}&jsonp=jsonp'
        res2 = requests.get(url=url2,headers = headers,proxies=proxy)
        result2 = json.loads(res2.text)
        name = result2['data']['name']
        level = result2['data']['level']
        sql = 'insert into bilibili values (%s,%s,%s,%s)'
        cursor.execute(sql,(uid,name,level,fans))
        conn.commit()

    except:
        pass
    uid+=1


cursor.close()
conn.close()
           
  1. 個人習慣重新寫一個py檔案,當然不新寫也行,不把資料存放到資料庫也是可以的

    使用pyecharts或者echarts進行資料可視化,此處以pyecharts為例

    相關教程,可以自己查閱官方文檔

http://pyecharts.org/#/zh-cn/intro

因為不難,隻要套用就可以了,是以直接上代碼

import pymysql
from pyecharts.charts import Bar
from pyecharts import options as opts
conn = pymysql.connect(
    host = "localhost",
    port = 3306,
    user = "",
    passwd = "",
    db = "",
    charset="utf8"
)
cursor = conn.cursor()
sql = "select name ,fans from bilibili order by -fans"
cursor.execute(sql)
data = cursor.fetchall()
print(data)
c = (
    Bar()
        .add_xaxis([i[0] for i in data])
        .add_yaxis("粉絲數量", [i[1] for i in data])
        .set_global_opts(title_opts=opts.TitleOpts(title="前兩千名up主的粉絲數量"),
                         datazoom_opts=[opts.DataZoomOpts()])
        .render("bar_stack0.html")
)

           

先後運作兩個檔案,就會發現多了一個html檔案,用浏覽器打開,就可以看到了

爬取B站前兩千位up主的粉絲數

最後,一個比較麻煩的事,B站是有反爬機制的,過快的通路會封禁ip,我試的時候,大概爬取600條資料就會封禁ip,解決辦法也隻能是換ip,資金充足可以花錢買,當然也可以爬取免費ip,這個下次再說吧