爬取B站前两千位up主的粉丝数

2023-10-30

看到B站有很多分析up主粉丝量的视频,自己也来试着实现一下

  1. 第一步先进到一位up主的个人空间,这里以uid是1和2的bishi为例,
    https://space.bilibili.com/1/,用户名:bishi
    https://space.bilibili.com/2/,用户名:碧诗
    可以看到,前面的链接都是一样的,后面的数字就是up主的uid,那我们只要改变后面的数字就可以了。
    但是,如果在爬虫程序中直接用这个url会发现获取不到数据,所以说,这个url是不正确的。
    在这里插入图片描述
    说到底,我们效果要获取的就是粉丝数等,而所有的数据都会在控制台中出现,那我们直接搜索粉丝数就可以了,这里注意一点,大up主的粉丝是以万为单位的,但是在控制台中并不是。所以他的粉丝10.3万,需要用103来搜索(不要小数点,但是10.3万并不精确到个,所以只用103就可以)
    在控制台按CTRL+F,搜索103
    在这里插入图片描述
    当然还有一种做法,这是我已经找到数据才发现的,粉丝在代码中显示的英语是follower,所以直接搜索follower也是可以的
    在这里插入图片描述
    可以看到,搜索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站是有反爬机制的,过快的访问会封禁ip,我试的时候,大概爬取600条数据就会封禁ip,解决办法也只能是换ip,资金充足可以花钱买,当然也可以爬取免费ip,这个下次再说吧

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬取B站前两千位up主的粉丝数 的相关文章

随机推荐

  • Oracle创建临时表

    Oracle临时表 临时表是一种特殊的表 当需要对某一 也可以是多个 表中的一批数据进行反复的操作时 通过为这批数据创建一个临时表 可能会简化操作并且有可能提高效率 语法 CREATE GLOBAL TEMPORARY TABLE 临时表空
  • 【C语言】——调试技巧

    目录 编辑 前言 1 什么是Bug 2 什么是调试 2 1调试的基本步骤 2 2Release与Debug 3 常用快捷键 4 如何写出好的代码 4 1常见的coding技巧 assert const const修饰指针 前言 调试是每个程
  • linux系统下部署python自动化程序并配置Jenkins定时执行

    问题 自动化测试脚本代码咱已经有了 项目地址Python接口自动化框架 那么该如何部署到我们的服务器上 在服务器上定时自动执行呢 思路 首先 我们要统一环境 大家知道 python2和python3的语法和库有很多改动 而大多服务器自带的p
  • spring boot 使用@ConfigurationProperties

    有时候有这样子的情景 我们想把配置文件的信息 读取并自动封装成实体类 这样子 我们在代码里面使用就轻松方便多了 这时候 我们就可以使用 ConfigurationProperties 它可以把同类的配置信息自动封装成实体类 首先在配置文件里
  • XSS之xss-labs-level3

    文章目录 0x01 XSS Labs 0x02 实验工具 0x03 实验环境 0x04 实验步骤 0x05 实验分析 0x06 参考链接 0x01 XSS Labs XSS 跨站脚本攻击 是指恶意攻击者往Web页面里插入恶意Script代码
  • css伪元素实现选中效果【打勾效果】

    css伪元素实现选中效果 item border 1px solid 00a9ff position relative after position absolute content width 0px height 0px top 0px
  • 基于SECS协议开发的简明教程(7)

    接着前面6篇SECS GEM开发教程系列 基于SECS协议开发的简明教程 1 怎么搭建支持SECS工程 基于SECS协议开发的简明教程 2 怎么编辑交换数据的ID 基于SECS协议开发的简明教程 3 怎么收 发控制命令和数据消息 基于SEC
  • FA萤火虫算法求解二元四峰函数的简单例子(python代码)

    这个代码是应付智能优化的课的 代码有些地方有些重复啰嗦 请大家担待 可视化都是自己搞得 好多for循环打印 有些地方完全可以构造函数 大家有需要可以自己改一下 import random import numpy as np import
  • python--支持向量机应用小例

    以下内容笔记出自 跟着迪哥学python数据分析与机器学习实战 外加个人整理添加 仅供个人复习使用 SVM的分类效果 软间隔的作用 复杂算法容易造成过拟合 如何解决 核函数的作用 核函数的作用 可以实现非线性分类 import numpy
  • SpringBoot整合vue-admin-template实现登录

    vue admin template简介 前后端分离开发模式越来越受开发人员的喜爱 开源项目vue admin template 是一个后台前端解决方案 它基于 vue 和 element ui实现 更多详情请阅读vue template
  • java打印模板_怎样做一个word模板,用java调用打印功能

    1 首先新建一个空白文档 并另存为 Normal dotm Word2007及以后版本 Normal dot Word2003 2007版本 2 进行需要的模板设置 对字体 段落 页眉页脚 页面边距等进行设置 3 对字体 段落的设置 在空白
  • JSON格式化异常:JsonMappingException

    使用RestTemplate请求post json接口报错 Caused by org codehaus jackson map JsonMappingException Can not instantiate value of type
  • 【Linux命令详解

    文章标题 简介 一 参数列表 二 使用介绍 1 打包文件和目录 2 解包归档文件 3 压缩归档文件 4 列出归档文件内容 5 排除特定文件 6 保留文件权限和所有权 7 保留时间戳 8 增量备份 9 使用文件列表 10 压缩级别控制 总结
  • html iframe post,iframe实现跨域post请求的技术细节

    在最近的一个项目中 我打算在页面上实现这样一个功能 在网页上画出某种图形 上传到服务器后 返回一个src地址 这个地址可以用来分享到各种社交媒体 这个功能看似非常简单 但要实现它还需要注意各种小的细节 首先说下思路和技术要点 用canvas
  • vue下载所有格式的文件

    vue下载所有格式的文件 vue下载所有格式的文件需要先安装downloadjs插件 downloadjs官网 https github com rndme download 下载插件 npm install downloadjs vue引
  • STM32F103操作DS1302时钟芯片串口显示(标准库和HAL库)

    目录 DS1302的性能指标 DS1302的寄存器及片内RAM 标准库实现 HAL库实现 源码链接 单片机型号 STM32F103C8T6 在日常生活中 很多情况下会需要使用时间 单片机中虽然也是有定时器但并不能较为准备的实现计时功能 而且
  • SpringBoot + Poi-tl操作word,快速生成报表

    前段时间做了一个需求 需要快速生成一份数据报告 里面包含了文字 图片和数据报表 同时生成的图形数据也可以随意修改 之前想着使用Apache POI来进行实现 在翻阅一些资料后 发现poi tl更适合我们的业务 也更容易上手 于是对其进行了研
  • 什么是实例分割,与语义分割和目标检测有何不同?

    在计算机视觉领域 图像分割是一项重要任务 旨在将图像分割成具有语义或实例级别的不同区域 实例分割 语义分割和目标检测是图像分割中的三个关键概念 本文将介绍这些概念 并详细讨论它们之间的区别和特点 什么是目标检测 1 目标检测 目标检测是一种
  • docker容器CPU共享比例——通过--cpu-shares选项设置容器按比例共享CPU资源(弹性)

    多容器任务运行时 很难计算CPU的使用率 命令中的 cpu shares选项值不能保证可以获得1个vcpu或者多少GHz的CPU资源 仅仅只是一个弹性的加权值 root 10 docker run name con1 itd cpu sha
  • 爬取B站前两千位up主的粉丝数

    看到B站有很多分析up主粉丝量的视频 自己也来试着实现一下 第一步先进到一位up主的个人空间 这里以uid是1和2的bishi为例 https space bilibili com 1 用户名 bishi https space bilib