天天看点

爬取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,这个下次再说吧