看到B站有很多分析up主粉絲量的視訊,自己也來試着實作一下
- 第一步先進到一位up主的個人空間,這裡以uid是1和2的bishi為例,
,使用者名:bishihttps://space.bilibili.com/1/
https://space.bilibili.com/2/
,使用者名:碧詩
可以看到,前面的連結都是一樣的,後面的數字就是up主的uid,那我們隻要改變後面的數字就可以了。
但是,如果在爬蟲程式中直接用這個url會發現擷取不到資料,是以說,這個url是不正确的。
爬取B站前兩千位up主的粉絲數 說到底,我們效果要擷取的就是粉絲數等,而所有的資料都會在控制台中出現,那我們直接搜尋粉絲數就可以了,這裡注意一點,大up主的粉絲是以萬為機關的,但是在控制台中并不是。是以他的粉絲10.3萬,需要用103來搜尋(不要小數點,但是10.3萬并不精确到個,是以隻用103就可以)
在控制台按CTRL+F,搜尋103
當然還有一種做法,這是我已經找到資料才發現的,粉絲在代碼中顯示的英語是follower,是以直接搜尋follower也是可以的爬取B站前兩千位up主的粉絲數 爬取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'
- 之後就是發送請求,擷取相應就可以了,需要注意的是,響應回來的資料是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()
-
個人習慣重新寫一個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站是有反爬機制的,過快的通路會封禁ip,我試的時候,大概爬取600條資料就會封禁ip,解決辦法也隻能是換ip,資金充足可以花錢買,當然也可以爬取免費ip,這個下次再說吧