获取哔站评论
一、文章立论
哔哩哔哩(B站)是当前年轻人十分喜爱的视频分享平台,以其丰富多样的内容、互动性强的社区氛围以及独特的弹幕文化深受用户喜爱。在该平台上,用户不仅可以观看各种类型的视频,如动画、游戏、科技、生活、影视、音乐等,还可以通过弹幕和评论表达自己的观点,与其他观众进行实时交流。这种互动机制极大地增强了用户的沉浸感和参与感,使得B站成为了一个兼具娱乐性和社交属性的内容生态平台。
由于B站的弹幕与评论系统承载了大量用户的实时反馈和情感表达,对这些文本数据进行深入分析,可以挖掘出许多有价值的信息。例如,通过语义分析可以理解视频的核心立意,以及观众对内容的看法;而情感分析则能揭示用户对于某个视频的情感倾向,是正面、负面还是中立。通过大规模采集和处理这些数据,我们不仅可以研究视频的受欢迎程度,还能分析不同类型视频的受众特征、热点话题的传播规律,甚至洞察某些文化现象的演变趋势。本篇文章将介绍如何利用Python高效地批量获取B站视频的评论信息。
二、爬虫分析
通过浏览器开发者工具捕获获取评论的请求,通过搜素大法找到具体链接——https://api.bilibili.com/x/v2/reply/wbi/main
其载荷参数为
通过搜素发现oid和pagination_str中的session_id是和视频直接相关的,w_rid搜不到,应该是一个加密的密文,wts应该是一个时间戳,转为标准时间后就可以确定其确实就是一个当前时间戳。再请求发现其余参数为固定的。
再去分析其他视频的评论,发现接口是一致的,但是载荷参数不一致。
区别主要是pagination_str字段。
利用搜素大法搜素w_rid,在可疑的地方打上断点,再次请求评论,发现断点断在了
return {w_rid: at(y + a),wts: u.toString()
}
输出 at(y + a)和wts的值,长度与接口参数一致。放开断点看最新请求,加密参数与刚刚输出的一致,即找到了加密位置。其中主要的代码逻辑为:
, o = n.imgKey, i = n.subKey;if (o && i) {for (var a = (t = o + i,r = [],[46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52].forEach((function(e) {t.charAt(e) && r.push(t.charAt(e))})),r.join("").slice(0, 32)), u = Math.round(Date.now() / 1e3), s = Object.assign({}, e, {wts: u}), c = Object.keys(s).sort(), l = [], f = /[!'()*]/g, d = 0; d < c.length; d++) {var p = c[d], h = s[p];h && "string" == typeof h && (h = h.replace(f, "")),null != h && l.push("".concat(encodeURIComponent(p), "=").concat(encodeURIComponent(h)))}var y = l.join("&");return {w_rid: at(y + a),wts: u.toString()}}
通过调试得到e就是请求参数中除去w_rid和wts的一个字典。o和i的值是固定的。为了判断快速at方法,在控制台输出at("123456"),结果为e10adc3949ba59abbe56e057f20f883e,即可判断at方法即为md5算法。至此爬虫分析完毕。
三、爬虫实现
将网页的JavaScript代码扣下来之后,稍微修改,将结果封装为一个方法。
let o = "7cd084941338484aae1ad9425b84077c"
let i = "4932caff0ff746eab6f01bf08b70ac45"
var CryptoJS = require("crypto-js")
function getEncryptedParams(e){for (var a = (t = o + i,r = [],[46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52].forEach((function(e) {t.charAt(e) && r.push(t.charAt(e))})),r.join("").slice(0, 32)), u = Math.round(Date.now() / 1e3), s =Object.assign({}, e, { wts: u }),c = ["cm_from_track_id","mode","oid","pagination_str","plat","seek_rpid","type","web_location","wts"], l = [], f = /[!'()*]/g, d = 0; d < c.length; d++) {var p = c[d], h = s[p];h && "string" == typeof h && (h = h.replace(f, "")),null != h && l.push("".concat(encodeURIComponent(p), "=").concat(encodeURIComponent(h)))}var pagination_str = l[2]var y =CryptoJS.MD5(l.join("&") + a).toString()wts = u.toString()return {y, wts, pagination_str}
}
python代码利用excjs调用上述JavaScript代码文件获得加密结果,并用requests库发送请求获得放回信息。
import execjs
import requestsheaders = {"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.7","accept-language": "zh-CN,zh;q=0.9","upgrade-insecure-requests": "1","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36"
}
def getEncryptedParams(e):js_codes = open("newbilibili.js", "r").read()ctx = execjs.compile(js_codes)return ctx.call("getEncryptedParams", e)params = {"oid": "22661051","type": "1","mode": "3","pagination_str": "{\"offset\":\"{\\\"type\\\":1,\\\"direction\\\":1,\\\"data\\\":{\\\"pn\\\":1}}\"}","plat": "1","web_location": "1315875"
}
encryptedParams = getEncryptedParams(params)
pagination_str = encryptedParams["pagination_str"].replace("pagination_str=", "").replace("%3A", ":")
w_rid, wts = encryptedParams["y"], encryptedParams["wts"]
url = (f"https://api.bilibili.com/x/v2/reply/wbi/main?oid={params['oid']}&type=1&mode=3&pagination_str={pagination_str}"f"&plat=1&web_location=1315875&w_rid={w_rid}&wts={wts}")
text = requests.get(url=url, headers=headers).json()
datas = text["data"]["replies"]
for data in datas:print(data["content"]["message"].replace("\n", ""))
相关文章:
获取哔站评论
一、文章立论 哔哩哔哩(B站)是当前年轻人十分喜爱的视频分享平台,以其丰富多样的内容、互动性强的社区氛围以及独特的弹幕文化深受用户喜爱。在该平台上,用户不仅可以观看各种类型的视频,如动画、游戏、科技、生活、影…...
《当AI生成内容遭遇审核:需求与困境的深度剖析》:此文为AI自动生成
AI 内容审核:数字时代的守门人 在当今数字技术迅猛发展的浪潮中,AI 在内容生成领域取得了令人瞩目的成就,成为了推动创新与变革的核心力量。以 AI 绘画为例,从早期简单粗糙的图像生成,到如今能够创作出细节丰富、风格多…...
jenkins流程概述
1. 需求场景 代码托管在 GitHub/GitLab需要 自动化构建 Docker 镜像,并部署到 Docker 服务器生产环境使用 Docker Compose 或 Kubernetes(K8s) 2. Jenkins 流程 拉取代码使用 Maven 构建 JAR使用 Docker 构建镜像推送 Docker 镜像到仓库在…...
深入 Vue.js 组件开发:从基础到实践
深入 Vue.js 组件开发:从基础到实践 Vue.js 作为一款卓越的前端框架,其组件化开发模式为构建高效、可维护的用户界面提供了强大支持。在这篇博客中,我们将深入探讨 Vue.js 组件开发的各个方面,从基础概念到高级技巧,助…...
【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(5)
1.问题描述: 提供两套标准方案,可根据体验需求选择: 1.地图Picker(地点详情) 用户体验:①展示地图 ②标记地点 ③用户选择已安装地图应用 接入文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guide…...
C#基础及标准控件的使用,附登录案例
C#基础及标准控件的使用,附登录案例 一、项目整体结构1. 项目结构2. 程序结构二、项目的基础操作三、常用的windows标准控件1. 按钮控件的使用2. 项目资源的配置(如图标)3. 文本控件的使用四、WinForm程序生成及运行调试1. Debug调试模式下生成2. Release发布模式下生成3. 程…...
61. Three.js案例-彩色旋转立方体创建与材质应用
61. Three.js案例-彩色旋转立方体创建与材质应用 实现效果 知识点 WebGLRenderer(WebGL渲染器) 构造器 WebGLRenderer( parameters : Object ) 参数类型描述antialiasBoolean是否执行抗锯齿(默认false)alphaBoolean是否包含alpha通道(默认false)方法 setSize( width…...
CSRF 攻击详解:原理、案例与防御
跨站请求伪造(Cross-Site Request Forgery,简称 CSRF)是一种针对 Web 应用程序的攻击方式。通过 CSRF,攻击者诱导受害者在不知情的情况下,以受害者的身份执行非本意的操作。本文将详细介绍 CSRF 的基本原理、常见攻击方…...
爬虫逆向实战小记——解决captcha滑动验证码
注意!!!!某XX网站实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!! IGh0dHBzOi8vY2FwdGNoYS5ydWlqaWUuY29tLmNuLw 第一步: 分析请求网址和响应内容 (1)通过观察,滑…...
Spring Boot3+Vue3极速整合: 10分钟搭建DeepSeek AI对话系统(进阶)
Spring Boot3Vue3极速整合: 10分钟搭建DeepSeek AI对话系统(进阶) 前言 在上次实战指南《Spring Boot3Vue2极速整合: 10分钟搭建DeepSeek AI对话系统》引发读者热议后,我通过200真实用户反馈锁定了几个问题进行优化进阶处理: 每次对话都需重复上下文背…...
Python 图像处理之 Pillow 库:玩转图片
哈喽,大家好,我是木头左! Pillow 库作为 Python 图像处理的重要工具之一,为提供了便捷且功能丰富的接口,让能够轻松地对图像进行各种操作,从简单的裁剪、旋转到复杂的滤镜应用、图像合成等,几乎无所不能。接下来,就让一起深入探索如何使用 Pillow 库来处理图片,开启一…...
Node.js学习分享(上)
Node.js fs文件系统模块fs.readFile()fs.writeFile() path路径模块路径拼接path.join()获取路径中的文件名path.basename()的语法格式 获取路径中的文件扩展名path.extname()的语法格式 http模块服务器相关概念IP地址域名和域名服务器端口号 创建最基本的web服务器创建web服务器…...
Java 第十一章 GUI编程(2)
目录 GUI 事件处理 基本思路 添加事件监听器 对话框 实例 GUI 事件处理 对于采用了图形用户界面的程序来说,事件控制是非常重要的;到目前为止, 我们编写的图形用户界面程序都仅仅只是完成了界面,而没有任何实际的功能&…...
anaconda 安装geemap配置详细教程
本章教程,主要介绍如何通过anaconda 安装ee 和geemap模块 一、示例代码 创建一个测试文件:geemapTets.ipynb # 导入 Google Earth Engine (GEE) 库,用于处理地理空间数据 import ee # 导入 geemap 库,用于可视化和交互式处理 GEE 数据 import geemap # 创建一个 geemap.M…...
4G工业路由器在公交充电桩中的应用与优势
随着电动公交车的普及,公交充电桩的稳定运行和高效管理是交通营运部门最关心的问题。4G工业路由器凭借其卓越的数据采集和通讯能力,成为实现充电桩智能化管理的关键。 公交充电桩运维管理需求概述: 1.实时性:实时监控充电状态、剩…...
【设计模式】单例模式|饿汉模式|懒汉模式|指令重排序
目录 1.什么是单例模式? 2.如何保证单例? 3.两种写法 (1)饿汉模式(早创建) (2)懒汉模式(缓执行,可能不执行) 4.应用场景 🔥5.多…...
Microsoft.Office.Interop.Excel 的简单操作
Microsoft.Office.Interop.Excel 的简单操作 1、安装 Microsoft.Office.Interop.Excel2、声明引用 Microsoft.Office.Interop.Excel3、简单的新建 EXCEL 操作代码4、将 DataGridView 表数据写到 EXCEL 操作代码5、将 EXCEL 表数据读取到 C# 数据表 DataTable 操作代码 1、安装 …...
说一下redis事务底层原理
Redis事务 1. 事务的基本流程 Redis 事务通过 MULTI、EXEC、WATCH 等命令实现,底层原理可以分为以下几个步骤: (1) MULTI 命令 当客户端发送 MULTI 命令时,Redis 会将客户端标记为“事务模式”。在事务模式下,客户端发送的所有…...
【powerjob】 powerjobserver注册服务IP错误
1、问题:powerjobserver 4.3.6 的服务器上有多个网卡对应多个ip,示例 eth0 :IP1 ,docker0:IP2 和worker 进行通信时 正确的应该时IP1 但是注册显示获取的确实IP2,导致 worker 通过ip2和server通信,网络不通,注册不上 2、解决方案 …...
01. HarmonyOS应用开发实践与技术解析
文章目录 前言项目概述HarmonyOS应用架构项目结构Ability生命周期 ArkTS语言特性装饰器状态管理 UI组件与布局基础组件响应式布局样式与主题 页面路由与参数传递页面跳转参数接收 数据绑定与循环渲染数据接口定义循环渲染 条件渲染组件生命周期最佳实践与性能优化组件复用响应式…...
【NLP 30、文本匹配任务 —— 传统机器学习算法】
目录 一、文本匹配任务的定义 1.狭义解释 2.广义解释 二、文本匹配的应用 1.问答对话 2.信息检索 3.文本匹配任务应用 三、智能问答 1.智能问答的基本思路 依照基础资源划分: 依照答案产出方式划分 依照NLP相关技术划分 四、智能问答的价值 1.智能客服 2.Faq知识库问…...
爬虫Incapsula reese84加密案例:Etihad航空
声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 一、找出需要加密的参数 1.js运行 atob(‘aHR0cHM6Ly93d3cuZXRpaGFkLmNvbS96aC1jbi8=’) 拿到网址,F12打开调试工具,随便搜索航班,切换到network搜索一个时间点可以找…...
【Vue教程】使用Vite快速搭建前端工程化项目 Vue3 Vite Node.js
??大家好!我是毛毛张! ??个人首页: ??今天毛毛张分享的是关于如何快速??♂搭建一个前端工程化的项目的环境搭建以及流程?? 文章目录 1.前端工程化环境搭建?? 1.1 什么是前端工程化1.2 nodejs的简介和安装 1.2.1 什么是Nodejs1.2.2 如何安装…...
如何将飞书多维表格与DeepSeek R1结合使用:效率提升的完美搭档
将飞书的多维表格与DeepSeek R1结合使用,就像为你的数据管理和分析之旅装上一台涡轮增压器。两者的合作,不仅仅在速度上让人耳目一新,更是将智能化分析带入了日常的工作场景。以下是它们如何相辅相成并改变我们工作方式的一些分享。 --- 在…...
算数操作符、赋值操作符、单目操作符、强制类型转换
一、算术操作符(、 -、 *、 /、 %) • - * / %操作符都是双⽬操作符,有**两个操作数**的符号就叫做双目操作符 10 4| || | 操作数1 操作数2// - % / * 以此类推•操作符也被叫做:运算符 1. 符号、符号 - 和 符号* •…...
为AI聊天工具添加一个知识系统 之133 详细设计之74通用编程语言 之4 架构及其核心
本篇继续讨论 通用编程语言。 说明:本阶段的所有讨论都是围绕这一主题展开的,但前面的讨论分成了三个大部分(后面列出了这一段的讨论题目的归属关系)-区别distinguish(各别): 文化和习俗。知识…...
RNN实现精神分裂症患者诊断(pytorch)
RNN理论知识 RNN(Recurrent Neural Network,循环神经网络) 是一种 专门用于处理序列数据(如时间序列、文本、语音、视频等)的神经网络。与普通的前馈神经网络(如 MLP、CNN)不同,RNN…...
私有云基础架构
基础配置 使用 VMWare Workstation 创建三台 2 CPU、8G内存、100 GB硬盘 的虚拟机 主机 IP 安装服务 web01 192.168.184.110 Apache、PHP database 192.168.184.111 MariaDB web02 192.168.184.112 Apache、PHP 由于 openEuler 22.09 系统已经停止维护了ÿ…...
rust学习笔记11-集合349. 两个数组的交集
rust除了结构体,还有集合类型,同样也很重要,常见的有数组(Array)、向量(Vector)、哈希表(HashMap) 和 集合(HashSet)字符串等,好意外呀…...
全栈(Java+vue)实习面试题(含答案)
在广州一个小公司(BOSS标注是0-20人,薪资2-3k),直接面试没有笔试,一开始就直接拿着简历问,也没有自我介绍,问题是结合场景题和八股文、基础。废话不多说,直接分享面试题目个大家做参考。 1、能…...
