Python-增加b站视频播放量

news2025/1/12 6:18:25

前言

本文是该专栏的第1篇,后面会持续更新对应平台干货知识,记得关注。

需求背景和说明:实现获取真实播放量,以及增加播放量

废话不多说,跟着笔者直接往下看正文,在文中将结合代码进行详细说明。(附完整代码)

正文

在开始之前,需准备代理IP。加入代理IP主要是为了防止平台触发的封控,导致请求异常。总之,在每次请求url的时候,随机带入某个IP防止被平台检测,便于达到增加播放量预期。

1. 代理

如果条件允许的情况下,有代理API更好,每次请求url调用API也更方便。如果没有的话,也不用担心,网上本身也有着很多免费国内代理,不过代理是否可用需要自己花点时间去检测,检测方法笔者这里就不详述了,后面有时间的话会单独针对这一块做详细说明。

下面是获取某个代理平台的免费IP方法,示例如下:

# 获取代理IP
def get_prox():
    url = 'https://www.xiaoxiangdaili.com/free/4360'    # 可更改
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Language': 'zh-CN,zh;q=0.9'
    }
    res = requests.get(url, headers=headers)
    ip_list = []
    if res.status_code == 200:
        result = etree.HTML(res.text)
        all_ip = result.xpath('//div[@class="freeProxyInfo"]/table/tbody/tr')
        for tr in all_ip:
            ip_data = tr.xpath('.//td/text()')
            ip = ip_data[0]
            port = ip_data[1]
            ip_port = f"http://{ip}:{port}"
            ip_list.append(ip_port)
    else:
        print(res.status_code)
    return ip_list

注意:这里笔者仅以某个代理平台为例,url可能已失效。大致思路就是针对你的目标代理平台进行IP抓取,并存入到自己本地的IP代理池。


2. 获取播放量

代码如下:

def get_video_data(video_url, proxy):
    session = requests.Session()
    session.proxies = proxy
    bvid = video_url.rsplit('/')[-1]
    res = session.get(url="https://api.bilibili.com/x/player/pagelist?bvid={}&jsonp=jsonp".format(bvid))
    cid = res.json()['data'][0]['cid']
    res = session.get(url="https://api.bilibili.com/x/web-interface/view?cid={}&bvid={}".format(cid, bvid))
    res_json = res.json()
    # aid = res_json['data']['aid']
    view_s = res_json['data']['stat']['view']
    # duration = res_json['data']['duration']
    session.close()
    print(f"当前视频{bvid}")
    return view_s

3. 播放量增加

代码如下:

def start_visit(start_url, proxy):
    session = requests.Session()
    session.proxies = proxy
    url = f'{start_url}/'
    res = session.get(url=url)
    result = re.findall(r"window.__INITIAL_STATE__=(.+);\(function", res.text)
    result = json.loads(result[0])
    aid = result["aid"]
    bvid = result["bvid"]
    cid = result["videoData"]["cid"]
    ftime = int(time.time()) - random.randint(100, 500)
    stime = int(time.time())
    buvid3_dic = res.cookies.get_dict()
    buvid3 = buvid3_dic["buvid3"]
    session.cookies.set("buvid3", buvid3) 
    # 获取时间戳
    a1 = hex(int(time.time()*1000))[2:].upper()
 
    b_lsid = ""
    for i in range(8):
        v1 = math.ceil(16 * random.uniform(0,1))
        v2 = hex(v1)[2:].upper()
        b_lsid += v2
    a2 = b_lsid.rjust(8,"0")
    b_lsid = a1 + "_" + a2
    session.cookies.set("b_lsid", b_lsid)
    # _uuid
    u = str(uuid.uuid4())
    time_sec = (str(int(time.time() * 1000) % 1e5)).strip(".0")
    time_sec = time_sec.rjust(5, "0")
    _uuid = u + time_sec + "infoc"
    session.cookies.set("_uuid", _uuid)
    # buvid4
    res = session.get(url="https://api.bilibili.com/x/frontend/finger/spi")
    dic = res.text
    dic = json.loads(dic)
    buvid4 = dic["data"]["b_4"]
    session.cookies.set("buvid4", buvid4)
    # sid
    b3 = buvid3_dic["buvid3"]
    cookies = {
        "buvid3":b3,
        "CURRENT_BLACKGAP": "1",
        "CURRENT_FNVAL": "4048"
    }
    resp = session.get(url="https://api.bilibili.com/x/player/v2?aid=385535851&cid=761767676")
    sid_dic = resp.cookies.get_dict()
    sid = sid_dic["sid"]
    session.cookies.set("sid", sid)
    session.cookies.set("CURRENT_FNVAL", "4048")
 
    url_add = "https://api.bilibili.com/x/click-interface/click/web/h5"
    data = {
        "aid": aid,
        "cid": cid,
        "bvid": bvid,
        "part": "1",
        "lv": "0",
        "ftime": ftime,
        "stime": stime,
        "jsonp": "jsonp",
        "type": "3",
        "sub_type": "0",
        "from_spmid": "333.1073.sub_channel.latest_video.click",
        "auto_continued_play": "0",
        "refer_url": "",
        "bsource": "",
        "spmid": "333.788.0.0"
    }
    session.post(url=url_add, data=data)
    print('增加播放量完成')

4. 完整代码

完整代码如下:

import requests
import json
import random
import math
import uuid
from lxml import etree
import re
import time
 
 
# 获取代理IP
def get_prox():
    url = 'https://www.xiaoxiangdaili.com/free/4360'    # 可更改
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Language': 'zh-CN,zh;q=0.9'
    }
    res = requests.get(url, headers=headers)
    ip_list = []
    if res.status_code == 200:
        result = etree.HTML(res.text)
        all_ip = result.xpath('//div[@class="freeProxyInfo"]/table/tbody/tr')
        for tr in all_ip:
            ip_data = tr.xpath('.//td/text()')
            ip = ip_data[0]
            port = ip_data[1]
            ip_port = f"http://{ip}:{port}"
            ip_list.append(ip_port)
    else:
        print(res.status_code)
    return ip_list
 
 
def start_visit(start_url, proxy):
    session = requests.Session()
    session.proxies = proxy
    url = f'{start_url}/'
    res = session.get(url=url)
    result = re.findall(r"window.__INITIAL_STATE__=(.+);\(function", res.text)
    result = json.loads(result[0])
    aid = result["aid"]
    bvid = result["bvid"]
    cid = result["videoData"]["cid"]
    ftime = int(time.time()) - random.randint(100, 500)
    stime = int(time.time())
    buvid3_dic = res.cookies.get_dict()
    buvid3 = buvid3_dic["buvid3"]
    session.cookies.set("buvid3", buvid3) 
    # 获取时间戳
    a1 = hex(int(time.time()*1000))[2:].upper()
 
    b_lsid = ""
    for i in range(8):
        v1 = math.ceil(16 * random.uniform(0,1))
        v2 = hex(v1)[2:].upper()
        b_lsid += v2
    a2 = b_lsid.rjust(8,"0")
    b_lsid = a1 + "_" + a2
    session.cookies.set("b_lsid", b_lsid)
    # _uuid
    u = str(uuid.uuid4())
    time_sec = (str(int(time.time() * 1000) % 1e5)).strip(".0")
    time_sec = time_sec.rjust(5, "0")
    _uuid = u + time_sec + "infoc"
    session.cookies.set("_uuid", _uuid)
    # buvid4
    res = session.get(url="https://api.bilibili.com/x/frontend/finger/spi")
    dic = res.text
    dic = json.loads(dic)
    buvid4 = dic["data"]["b_4"]
    session.cookies.set("buvid4", buvid4)
    # sid
    b3 = buvid3_dic["buvid3"]
    cookies = {
        "buvid3":b3,
        "CURRENT_BLACKGAP": "1",
        "CURRENT_FNVAL": "4048"
    }
    resp = session.get(url="https://api.bilibili.com/x/player/v2?aid=385535851&cid=761767676")
    sid_dic = resp.cookies.get_dict()
    sid = sid_dic["sid"]
    session.cookies.set("sid", sid)
    session.cookies.set("CURRENT_FNVAL", "4048")
 
    url_add = "https://api.bilibili.com/x/click-interface/click/web/h5"
    data = {
        "aid": aid,
        "cid": cid,
        "bvid": bvid,
        "part": "1",
        "lv": "0",
        "ftime": ftime,
        "stime": stime,
        "jsonp": "jsonp",
        "type": "3",
        "sub_type": "0",
        "from_spmid": "333.1073.sub_channel.latest_video.click",
        "auto_continued_play": "0",
        "refer_url": "",
        "bsource": "",
        "spmid": "333.788.0.0"
    }
    session.post(url=url_add, data=data)
    print('增加播放量完成')
 
 
def get_video_data(video_url, proxy):
    session = requests.Session()
    session.proxies = proxy
    bvid = video_url.rsplit('/')[-1]
    res = session.get(url="https://api.bilibili.com/x/player/pagelist?bvid={}&jsonp=jsonp".format(bvid))
    cid = res.json()['data'][0]['cid']
    res = session.get(url="https://api.bilibili.com/x/web-interface/view?cid={}&bvid={}".format(cid, bvid))
    res_json = res.json()
    # aid = res_json['data']['aid']
    view_s = res_json['data']['stat']['view']
    # duration = res_json['data']['duration']
    session.close()
    print(f"当前视频{bvid}")
    return view_s
 
 
if __name__ == "__main__":
    ip_list = get_prox()
    url = input('请输入要访问的B站视频链接, url格式以"https://www.bilibili.com/video/BV1tg4y1b7hY"为例:')
    num = input('输入要访问的次数:')
    for w in range(int(num)):
        print(f'当前第{w+1}次')
        # 设置IP代理
        # ip_proxy = random.choice(ip_list)
        # proxy = {"http": ip_proxy}                # 注意取消注释,替换正常可用的IP代理平台
        proxy = {"http": "61.216.156.222:60808"}    # 该IP仅为示例    
        try:
            views = get_video_data(url, proxy)
            print(views)
            start_visit(url, proxy)
            time.sleep(random.randint(10, 30))
        except Exception as e:
            print(e)

最后,笔者补充几点:

1. 程序运行的时候,需要输入对应的视频url,格式如下:

url = f'https://www.bilibili.com/video/{对应视频ID}'

2. 需要输入访问视频的次数,这里必须携带IP代理;

3. 每次请求之间,需加入时间等待缓存,切勿进行频繁请求。

4. 如需要将数据保存,可查阅相关方法或者笔者在专栏“爬虫实战进阶”里面有详细介绍过很多方法,可参考。

如果还想了解爬虫的更多知识,后面我会持续分享,记得收藏并关注,后面的python干货在等着你。

如果喜欢本文或者本文对你有帮助的话,记得关注并点个赞哟,有问题和需求欢迎留言私信

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/547775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】从数据结构角度深入探究队列

队列是计算机科学中的一种基本数据结构,用于存储和管理数据。在计算机程序中,队列被广泛应用于任务调度、进程管理等场景。本文将介绍队列的概念、特点、常见操作以及应用。 文章目录 队列的概念队列的应用队列的存储结构队列接口的实现队列的初始化队尾…

plt.plot(x,y,color,linestyle,marker)函数参数详解

一、plt.plot()函数详解 plt.plot()函数是matplotlib库中用于绘制线条图的函数,它有多个参数可以控制绘图的各个方面。以下是常用的一些参数及其作用: x: x轴数据的列表或数组y: y轴数据的列表或数组linewidth: 线条的宽度,从0到无穷大的浮…

( 动态规划) 115. 不同的子序列 ——【Leetcode每日一题】

❓115. 不同的子序列 难度:困难 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数。 题目数据保证答案符合 32 位带符号整数范围。 示例 1: 输入:s “rabbbit”, t “rabbit” 输出:3 解释&…

智能变电站远程监控解决方案

智能变电站远程监控解决方案 一、项目背景 变电站是改变电压、控制和分配电能的场所,为了加强对变电站的监管力度,抓好供电作业的动态管理,及时、实时的掌握变电站的安全隐患的整改消除情况,确保安全生产贯穿于供电的全过程&…

如何禁用烦人的“insert”键

在我们日常的电脑使用中,有些按键可能会让我们感到非常烦恼,其中最常见的就是“insert”键。这个键位于键盘的右上角,通常会在我们不经意间被按下,导致我们的输入出现了一些奇怪的问题。如果你也曾经遇到过这个问题,那…

在网络安全领域中,主要有哪些技术方向?

入门Web安全、安卓安全、二进制安全、工控安全还是智能硬件安全等等,每个不同的领域要掌握的技能也不同。 当然入门Web安全相对难度较低,也是很多人的首选。主要还是看自己的兴趣方向吧。 本文就以下几个问题来说明网络安全大致学习过程👇 网…

Vue3项目初始配置(更新中ing)

文章目录 别名路径联想配置方法 element plus按需引入并使用风格定制 eslint文件名不强制检测编辑.eslintrc.cjs 别名路径联想 在编写代码的过程中,一旦 输入 / , VSCode会立刻 联想出src下的所有子目录和文件, 统一文件路径访问不容易出 配置方法 在项目的根目…

相亲交友App开发解决方案及功能框架

相亲APP开发功能 1、注册登录:相亲APP开发平台是一款真实的交友软件,所以需要用户提交身份信息进行注册认证,也是为了保障用户的安全! 2、搜索功能:在线、新注册、距离近、同城老乡、星族速配等,都可以在相亲APP内进行…

详解GitHub

详解GitHub 什么是GitHub?GitHub能干什么?1.托管代码、历史版本管理2.搜索开源项目3.分享的同时会得到社区的回馈4.使用Github Pages服务,你可以免费搭建一个博客网站5.学习,能力提升6.提升自己的影响力 GitHub和Git的关系与区别敲…

MySQL基础(三十八)数据库备份与恢复

1 物理备份与逻辑备份 物理备份:备份数据文件,转储数据库物理文件到某一目录。物理备份恢复速度比较快,但占用空间比较大,MySQL中可以用 xtrabackup 工具来进行物理备份。 逻辑备份:对数据库对象利用工具进行导出工作…

Android如何自定义输入文本对话框?

文章目录 0.引言1.创建示例工程2.输入文本对话框布局和功能设计3.主程序调用输入文本对话框 0.引言 笔者研究的课题涉及到安卓软件开发,在开发过程中,发现普通的显示消息对话框一般可以调用android自带包实现,而要通过文本框输入交互&#xf…

代码随想录算法训练营第十一天|20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

今天的题目都是对栈的经典应用。 有效的括号 题目链接:力扣 解题思路:基于栈结构的特殊性,其非常适合做对称匹配类问题,其实如果知道了要用栈解这道题,在脑中模拟一遍,接下来的思路就是自然而然能够想到…

STM32 多路ADC同时扫描采样

背景 在项目实际应用中,刚好有需求需要使用多路ADC同时采样,这里就选择STM32 ADC多路ADC同时采样,这里简单说明下配置过程,以及使用步骤 原理图 如下图所示,使用四路ADC输入 ADC_Voltage -> 电压信号的采样&…

如何查看linux分区挂载在哪个目录?

一,简介 在linux系统中,如何查看磁盘分区是挂载在哪个目录呢?今天介绍一种方法,供参考。 二,图形化界面查看分区挂载方法 2.1 打开disk工具 2.2 点击查看对应的分区 看一个分区: 如上图所示&#xff0…

百度地图网页设计

一、百度地图api 1、百度搜索——百度地图API 进入——开放平台——开发文档——JavaScript API JavaScript API 首先是GL版本,是三维的效果,我们一般使用二维,选择下面v3.0版本 2、开发指南——注册账号 跟着提示来申请密钥就可。 二、…

Linux基本指令【下】

目录 一、时间相关指令 date显示 时间戳 二、cal指令 三、find指令 (重要)-name 四、grep指令 五、zip\unzip指令 六、tar指令:打包/解压,不打开它,直接看内容 七、bc指令 八、uname -r指令 九、几个重要…

ConstrainLayout(约束布局)属性详解

layout_constraintLeft_toLeftOf layout_constraintRight_toRightOf 这两个基本上用不上因为 layout_constraintStart_toStartOf就相当于layout_constraintLeft_toLeftOf layout_constraintEnd_toEndOf就相当于layout_constraintRight_toRightOf app:layout_constraintBottom_t…

【VMware】Ubantu 22.04配置静态IP

文章目录 一、VMware 虚拟网络配置VMnet8 网络设置注意 关于取消勾选使用本地DHCP服务将IP地址分配给虚拟机VMnet8 NAT设置 网关IP 二、虚拟机 网络适配器三、启动虚拟机 配置网络查看网卡名设置静态IP Reference 一、VMware 虚拟网络配置 VMnet8 网络设置 子网IP子网掩码 编…

22 外部排序

外部排序 外部排序的基本内容 前面介绍过的排序方法都是在内存中进行的(称为内部排序)。外部排序是一种无法全部装入内存的大规模数据集的排序算法。与在内存中处理数据的内部排序相比,外部排序要复杂的多,主要因为是其需要解决…

【c语言】二进制文件的读写操作

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…