获取哔站评论

一、文章立论

哔哩哔哩(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", ""))

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-表

存储在表中的数据是一种类型的数据&#xff0c;不同类型的数据应放到不同的表中&#xff0c;否则会使以后的检索和访问很困难。数据库中的每个表都有一个名字&#xff0c;用来标识自己。此名字是唯一的&#xff0c; 这表示数据库中没有其他表具有相同的名字。表由一个或多个列组…

【UCB CS 61B SP24】Lecture 21: Data Structures 5: Priority Queues and Heaps 学习笔记

本文介绍了优先队列与堆&#xff0c;分析了最小堆的插入与删除过程&#xff0c;并用 Java 实现了一个通用类型的最小堆。 1. 优先队列 1.1 介绍 优先队列是一种抽象数据类型&#xff0c;其元素按照优先级顺序被处理。不同于普通队列的先进先出&#xff08;FIFO&#xff09;&…

DeepSeek-R2:AI大模型新纪元的破晓之光

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列十五DeepSeek大模型技术系列十五》DeepS…

UniApp+Vue3实现高性能无限滚动卡片组件:垂直滑动、触摸拖拽与动态导航的完美结合

引言 在移动应用开发中&#xff0c;流畅且吸引人的用户界面对于提升用户体验至关重要。本文将详细介绍如何使用UniApp和Vue3框架构建一个具有垂直方向无限滚动卡片、触摸拖拽支持、同步导航栏和平滑动画效果的高级UI组件。我们将通过代码分析每个功能的实现细节&#xff0c;帮助…

LeetCode 热题 100----1.两数之和

LeetCode 热题 100----1.两数之和 题目描述 我的解法 语言&#xff1a;js 思路就是&#xff1a;用双重循环去找哪两个数字相加等于target&#xff0c;目前的时间复杂度为O(n2)&#xff0c;之后右优化思路再更新。

华为云 | 快速搭建DeepSeek推理系统

DeepSeek&#xff08;深度求索&#xff09;作为一款国产AI大模型&#xff0c;凭借其高性能、低成本和多模态融合能力&#xff0c;在人工智能领域崛起&#xff0c;并在多个行业中展现出广泛的应用潜力。 如上所示&#xff0c;在华为云解决方案实践中&#xff0c;华为云提供的快速…

本地部署阿里万象2.1文生视频模型(Wan2.1-T2V)完全指南

在生成式AI技术爆发式发展的今天,阿里云开源的万象2.1(Wan2.1)视频生成模型,为创作者提供了从文字/图像到高清视频的一站式解决方案。本文针对消费级显卡用户,以RTX 4060 Ti 16G为例,详解本地部署全流程与性能调优方案,涵盖环境配置、多模型选择策略、显存优化技巧及实战…

FPGA标准库-Open Logic

在现代技术发展的浪潮中&#xff0c;开源项目已经成为了推动技术创新和发展的核心力量。无论是人工智能、区块链、云计算&#xff0c;还是传统的嵌入式开发、操作系统&#xff0c;开源项目都在其中扮演着至关重要的角色。它们不仅促进了技术的快速迭代&#xff0c;也为全球开发…

React antd的datePicker自定义,封装成组件

一、antd的datePicker自定义 需求&#xff1a;用户需要为日期选择器的每个日期单元格添加一个Tooltip&#xff0c;当鼠标悬停时显示日期、可兑换流量余额和本公会可兑流量。这些数据需要从接口获取。我需要结合之前的代码&#xff0c;确保Tooltip正确显示&#xff0c;并且数据…

【算法题解答·一】二分法

【算法题解答一】二分法 接上文 【算法方法总结一】二分法的一些技巧和注意事项 二分法相关题目如下&#xff1a; 34.在排序数组中查找元素第一和最后一个位置 使用 左闭右闭&#xff0c;[left,right]关键在于 nums[mid] target 的部分找 第一个 target 的过程中&#xff0…

Non-Homophilic Graph Pre-Training and Prompt Learning

Non-Homophilic Graph Pre-Training and Prompt Learning KDD25 ​#paper/⭐#​ 目的&#xff1a;对异配图进行prompt ‍ ​​ 方法 邻居节点的综合嵌入 s v 1 ∣ V ( S v ) ∣ ∑ u ∈ V ( S v ) h u ⋅ s i m ( h u , h v ) , \mathbf{s}_{v}\frac{1}{|V(S_{v})|}\su…

BUU44 [BJDCTF2020]ZJCTF,不过如此1 [php://filter][正则表达式get输入数据][捕获组反向引用][php中单双引号]

题目&#xff1a; 我仿佛见到了一位故人。。。也难怪&#xff0c;题目就是ZJCTF 按要求提交/?textdata://,I have a dream&filenext.php后&#xff1a; ......不太行&#xff0c;好像得用filephp://filter/convert.base64-encode/resourcenext.php 耶&#xff1f;那 f…

掌握 findIndex、push 和 splice:打造微信小程序的灵活图片上传功能✨

文章目录 ✨ 掌握 findIndex、push 和 splice&#xff1a;打造微信小程序的灵活图片上传功能 &#x1f31f;示例场景&#xff1a;小程序图片上传&#x1f33c; 认识 findIndex定义语法在代码中的应用示例当前行为 &#x1f680; 认识 push定义语法在代码中的应用示例特点 ✂️ …

山西青年杂志山西青年杂志社山西青年编辑部2025年第3期目录

青年争鸣 教师发展中心行动转向的价值意蕴分析框架研究与启示 于宝证;李军红;郑钰莹;何易雯; 产教融合视角下职业本科工商管理专业人才培养模式探析 杜芯铭; 青年教育研究 教育数字化背景下高职院校的课堂教学研究 张晨; 统筹职业教育、高等教育、继续教育协同…

神经网络:AI的网络神经

神经网络&#xff08;Neural Networks&#xff09;是深度学习的基础&#xff0c;是一种模仿生物神经系统结构和功能的计算模型。它由大量相互连接的节点&#xff08;称为神经元&#xff09;组成&#xff0c;能够通过学习数据中的模式来完成各种任务&#xff0c;如图像分类、语音…

计算机视觉|ViT详解:打破视觉与语言界限

一、ViT 的诞生背景 在计算机视觉领域的发展中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;一直占据重要地位。自 2012 年 AlexNet 在 ImageNet 大赛中取得优异成绩后&#xff0c;CNN 在图像分类任务中显示出强大能力。随后&#xff0c;VGG、ResNet 等深度网络架构不…

储油自动化革命,网关PROFINET与MODBUS网桥的无缝融合,锦上添花

储油行业作为能源供应链的关键环节&#xff0c;其自动化和监控系统的可靠性和效率至关重要。随着工业4.0的推进&#xff0c;储油设施越来越多地采用先进的自动化技术以提高安全性、降低成本并优化运营。本案例探讨了如何通过使用稳联技术PROFINET转MODBUS模块网关网桥&#xff…

解锁Egg.js:从Node.js小白到Web开发高手的进阶之路

一、Egg.js 是什么 在当今的 Web 开发领域&#xff0c;Node.js 凭借其事件驱动、非阻塞 I/O 的模型&#xff0c;在构建高性能、可扩展的网络应用方面展现出独特的优势 &#xff0c;受到了广大开发者的青睐。它让 JavaScript 不仅局限于前端&#xff0c;还能在服务器端大展身手&…

python:pymunk + pygame 模拟六边形中小球弹跳运动

向 chat.deepseek.com 提问&#xff1a;编写 python 程序&#xff0c;用 pymunk, 有一个正六边形&#xff0c;围绕中心点缓慢旋转&#xff0c;六边形内有一个小球&#xff0c;六边形的6条边作为墙壁&#xff0c;小球受重力和摩擦力、弹力影响&#xff0c;模拟小球弹跳运动&…

学习 Wireshark 分析 Android Netlog

Android 设备抓取的日志中,netlog 文件夹包含.cap文件可以使用Wireshark工具查看网络日志。 Wireshark 分析 DNS 步骤 在使用Wireshark分析网路日志时,要检查DNS解析是否正常,可以按照以下步骤操作: 识别DNS查询和回应 使用过滤器 udp.port == 53 来查看所有DNS相关的流量…