B站评论采集

2023-11-05

B站评论采集

打开目标网址

哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

image.png

找到爬取得剧的评论,打开浏览器抓包工具进行抓包分析:

image.png

这里爬取鬼灭之刃第一季的评论数据,
分析网页

打开评论页面,可以看到分为短评(128702)和长评(639)条。常规操作直接F12打开网络观察发送的请求数据。

在评论页面往下翻几下就可以看到有个url是“list?“开头的,点开预览果然就是哔哩哔哩评论的api了。找到了api就很好办了,直接分析一下api的组成和需要传递的参数。

分析b站api
 复制代码 隐藏代码
https://api.bilibili.com/pgc/review/short/list?media_id=22718131&ps=20&sort=0&cursor=83215035767195

观察一下链接,有个short字段,这个就是对应的短评,如果换成long就是长评。

”ps=20“就是一页的数据。”media_id=22718131“就是番剧的id。

”cursor“字段就是数据的地址,每次请求数据返回的json数据都会有下一页的cursor。

image.png

下面就是用requests进行请求写代码

先导入库:

import requests
import json
import time
import csv

爬取代码:

def levels_get(mid, proxies):

    url = f'https://api.bilibili.com/x/space/wbi/acc/info?mid={str(mid)}'
    header = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
        'cookie': "_uuid=B31794AC-389B-5ABE-431A-4A457532710F563197infoc; buvid3=90E810B6-24C7-0FD9-FCEB-FFAAD82CE42266124infoc; b_nut=1666688064; buvid4=C5894024-2549-4CC5-B6CC-4CE4F3C6025F66124-022102516-ueloTil9hhszmIQpPi1hPg==; buvid_fp_plain=undefined; i-wanna-go-back=-1; nostalgia_conf=-1; rpdid=|(u))umkR)l|0J'uYY)Y~lkkl; bsource=search_google; LIVE_BUVID=AUTO2616698028069789; is-2022-channel=1; CURRENT_BLACKGAP=0; CURRENT_FNVAL=4048; CURRENT_QUALITY=120; fingerprint=5fdc996e8cc80fd6b9c56ffc54ce7181; sid=8dtevv76; bp_video_offset_83512806=744605732851155000; buvid_fp=5fdc996e8cc80fd6b9c56ffc54ce7181; b_lsid=F72104910B_18557CE9216; b_ut=7; innersign=1; PVID=8",
    }
    try:
        rs = requests.get(url, headers=header,proxies=proxies)
    except:
        proxies = gengxin()

        rs = requests.get(url, headers=header, proxies=proxies, timeout=10)
    datad = json.loads(rs.text)
    try:
        return datad['data']['level']
    except:
        return 'Nah'

cursor = 78670930957092
while cursor != '老6':
    url = f'https://api.bilibili.com/pgc/review/long/list?media_id=22718131&ps=20&sort=0&cursor={cursor}'
    print(url)
    while True:
        try:
            r = requests.get(url, timeout=5)
            data = json.loads(r.text)
            break
        except:
            print('请求超时')
            time.sleep(1)

    for i in data['data']['list']:
        uname = i['author']['uname']#用户昵称
        userid = i['author']['mid']#用户id
        score = i['score']#用户评分
        content = i['content']#用户评论内容
        time_unix = int(i['mtime'])
        times = timefun(time_unix)
        # middd = levels_get(userid, proxies)
        middd = 'Nah'
        print(times, uname, userid, middd, score, content)
        with open("test.csv", "a", newline='',encoding='UTF8') as csvfile:
            writer = csv.writer(csvfile)
            # 写入多行用writerows
            writer.writerow([times, uname, userid, middd, score, content])

    cursor = data['data']['next']
    print(f'下一个页面{cursor}')

完整代码:

import requests
import json
import time
import csv

'''包括评分用户id及会员等级、具体评分星级、长评以及短评的评论内容、评分时间,'''

def timefun(time1):
    time1 = int(time1)
    timeArray = time.localtime(time1)
    times = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)  # 时间
    return times

def levels_get(mid, proxies):

    url = f'https://api.bilibili.com/x/space/wbi/acc/info?mid={str(mid)}'
    header = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
        'cookie': "_uuid=B31794AC-389B-5ABE-431A-4A457532710F563197infoc; buvid3=90E810B6-24C7-0FD9-FCEB-FFAAD82CE42266124infoc; b_nut=1666688064; buvid4=C5894024-2549-4CC5-B6CC-4CE4F3C6025F66124-022102516-ueloTil9hhszmIQpPi1hPg==; buvid_fp_plain=undefined; i-wanna-go-back=-1; nostalgia_conf=-1; rpdid=|(u))umkR)l|0J'uYY)Y~lkkl; bsource=search_google; LIVE_BUVID=AUTO2616698028069789; is-2022-channel=1; CURRENT_BLACKGAP=0; CURRENT_FNVAL=4048; CURRENT_QUALITY=120; fingerprint=5fdc996e8cc80fd6b9c56ffc54ce7181; sid=8dtevv76; bp_video_offset_83512806=744605732851155000; buvid_fp=5fdc996e8cc80fd6b9c56ffc54ce7181; b_lsid=F72104910B_18557CE9216; b_ut=7; innersign=1; PVID=8",
    }
    try:
        rs = requests.get(url, headers=header,proxies=proxies)
    except:
        proxies = gengxin()

        rs = requests.get(url, headers=header, proxies=proxies, timeout=10)
    datad = json.loads(rs.text)
    try:
        return datad['data']['level']
    except:
        return 'Nah'

cursor = 78670930957092
while cursor != '老6':
    url = f'https://api.bilibili.com/pgc/review/long/list?media_id=22718131&ps=20&sort=0&cursor={cursor}'
    print(url)
    while True:
        try:
            r = requests.get(url, timeout=5)
            data = json.loads(r.text)
            break
        except:
            print('请求超时')
            time.sleep(1)

    for i in data['data']['list']:
        uname = i['author']['uname']#用户昵称
        userid = i['author']['mid']#用户id
        score = i['score']#用户评分
        content = i['content']#用户评论内容
        time_unix = int(i['mtime'])
        times = timefun(time_unix)
        # middd = levels_get(userid, proxies)
        middd = 'Nah'
        print(times, uname, userid, middd, score, content)
        with open("test.csv", "a", newline='',encoding='UTF8') as csvfile:
            writer = csv.writer(csvfile)
            # 写入多行用writerows
            writer.writerow([times, uname, userid, middd, score, content])

    cursor = data['data']['next']
    print(f'下一个页面{cursor}')

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

B站评论采集 的相关文章

  • tensorflow Protobuf编译问题

    我想为 google 对象检测 API 编译 protobuf 库 我按照官方教程输入protoc object detection protos proto python out 然后我得到的是 object detection prot
  • 如何有效地从连续字符串中提取文字单词? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将没有空格的文本拆分为单词列表 https stackoverflow com questions 8870261 how to split text without spaces into li
  • 只使用 Django 的某些部分?

    我喜欢 Django 但对于一个特定的应用程序 我只想使用它的一部分 但我对 Django 的内部工作原理还不够熟悉 所以也许有人可以指出我必须做什么的正确方向查看 具体来说 我想使用 模型和数据库抽象 The 缓存API http doc
  • Pandas 字符串提取所有匹配项

    我正在学习 pandas 系列字符串方法中的正则表达式操作 我能够从字符串中提取第一个数字 但我的正则表达式与第二个数字不匹配 如何捕获这两个数字 注意第二行 第二个元素在这里是 NAN CODE import pandas as pd d
  • 如何为 Intellij/PyCharm 设置 PYTHONSTARTUP 脚本

    我尝试添加PYTHONSTARTUP环境变量 我还尝试了自定义启动脚本 但更令人惊讶的是 这also没有工作 npa别名无法识别 出于一点绝望 我什至尝试添加到interpreter options 那什么也没做 实际上是什么Interpr
  • pip 安装失败,SSL 证书验证失败 (_ssl.c:833)

    我无法通过 pip install 安装任何外部 python 模块 我已经正确安装了 python 但如果我使用 pip install 它会显示此错误 这是我运行后的代码pip install pytesseract C Users 1
  • Spyder 导入模块出错

    我正在尝试在 Spyder 中使用 sklearn 一开始 当我尝试导入它时 我收到 ImportError No module named sklearn 然后我用 PYTHONPATH 管理器设置 PATH 然后使用工具菜单中的 更新模
  • OpenCV - 我需要将彩色图像插入黑白图像并且

    我用以下代码将黑白图像插入彩色图像 没问题 face grey cv cvtColor face cv COLOR RGB2GRAY for row in range 0 face grey shape 0 for column in ra
  • 检测/删除 Python 2 + GTK 中不成对的代理字符

    在Python 2 7中我可以成功转换Unicode字符串 abc udc34xyz 转换为 UTF 8 结果是 abc xed xb0 xb4xyz 但是当我将 UTF 8 字符串传递给例如时 pango parse markup or
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何在Python中求和

    我想知道如何在 python 中表示总和而不需要像这样的循环here http docs scipy org doc scipy reference tutorial optimize html 我们有 def rosen x The Ro
  • 使用 3d 对象作为 3d 散点图中的标记 - Python

    使用下面的代码 我尝试模拟一个用罐头制成的碗 我希望每个标记都是一个罐头 最好的方法是什么 我真的很感激任何建议 谢谢 import pylab import numpy as np from math import pi sin cos
  • PyCharm 无法识别字典值类型

    我有一个简单的代码片段 其中我将字典值设置为空列表 new dict for i in range 1 13 new dict i 现在 如果在下一行的循环内我会输入new dict i 并添加一个点 我希望 PyCharm 向我显示可用于
  • 根据给定列表中的值替换列中的值[重复]

    这个问题在这里已经有答案了 我在数据框中有一列 仅允许定义列表中存在的值 例如 给定列表 l1 1 2 5 6 如果列表中不存在列中的值 我需要将每个值替换为 0 column Expected column 1 1 5 5 2 2 3 0
  • 如何在数据框中绘制包含三列的无向图,形成 3 种不同类型的节点(三方)?

    我正在尝试使用三个不同的列表绘制网络的可视化 这三个列表形成 3 种类型的节点 下面的代码正在运行 如图所示 需要两个列表 用户 ID 评分 但是 我希望我的图表是三部分的 即 user userId review ratings prod
  • PyCharm - 如何挂起所有线程

    我们使用 PyCharm 5 0 1 进行多线程调试 当它在断点处停止时 只有特定线程停止 而所有其他线程继续 这使得 冻结时刻 和检查参数值以及其他线程的当前状态变得困难 当其中一个线程在断点处停止时 是否可以挂起所有线程 这在最新的 P
  • 检查多个 pd.DataFrame 是否相等

    是否有一种 Pythonic 方式 无循环或递归 来检查是否超过两个pd DataFrames 例如 pd DataFrames 列表 彼此相等吗 就像是 all x equals dfs 0 for x in dfs with dfs数据
  • Pip 突然使用了错误版本的 Python

    在 os x 上使用 pip 时遇到一个奇怪的问题 据我所知 快速查看我的 bash history 似乎可以确认 我最近没有对我的配置进行任何更改 唉 pip 命令似乎突然使用了与以前不同的 python 版本 到目前为止 我使用命令 p
  • 如何配置 Eclipse 在使用 Pydev 插件选择“运行”或“调试”时启动浏览器

    我正在使用 Eclipse Pydev 插件学习 Python 和 Django 当我按 运行 或 调试 时 我希望内部或外部浏览器使用 URL http 127 0 0 1 启动或刷新 我见过用 PHP 插件完成的 但没有用 Pydev
  • 在Python中从CSV文件中获取随机行并找到相应的单词,就像测验一样

    抱歉标题含糊不清 想不出更好的表达方式 我有一个包含德语 英语单词的 CSV 文件 如下所示 Ja Yes Nein No Katze Cat 我希望我的 python 脚本从 CSV 文件中打印一个随机的德语单词 并要求他们输入英语单词

随机推荐

  • 用git,clone依赖的库

    git clone https github com influxdata influxdb java git cd crfasrnn git submodule update init recursive 或 git clone recu
  • 汇编程序debug成功但不能直接运行

    王爽 汇编语言 实验10中的dtoc子程序 运行不了 但是单步调试可以通过并且结果正常 我的代码如下 assume cs code data segment db 10 dup 0 data ends code segment start
  • 标注转换与编辑软件

    标注转换与编辑软件 https github com Fafa DL LabelConvert 1 支持XML转JSON XML转TXT TXT转XML JSON转XML 2 XML JSON类别替换 3 XML JSON类别删除 该Git
  • 《软件测试的艺术》第3章:代码检查、走查与评审

    软件测试的艺术 软件开发人员通常不会考虑到的一种测试形式 人工测试 大多数人认为 因为程序是为了供机器执行而编写的 那么也应由机器来对程序进行测试 这种想法是有问题的 人工测试方法在暴露错误方面是很有成效的 实际上 大多数的软件项目都应使用
  • 100天精通Python(数据分析篇)——第75天:Pandas数据预处理之数据标准化

    文章目录 专栏导读 1 数据标准化是什么 2 数据标准化的作用 3 数据标准化的方法 4 离差标准化 5 标准差标准化 6 小数定标标准化 书籍介绍 专栏导读
  • Python 模块中的变量

    模块 module 其实就是py文件 里面定义了一些函数 类 变量等 包 package 是多个模块的聚合体形成的文件夹 里面可以是多个py文件 也可以嵌套文件夹 库是参考其他编程语言的说法 是指完成一定功能的代码集合 在python中的形
  • 第十四届蓝桥杯模拟赛第一期试题【Java解析】

    目录 A 二进制位数 问题描述 答案提交 参考答案 解析 B 晨跑 问题描述 答案提交 参考答案 解析 C 调和级数 问题描述 答案提交 参考答案 解析 D 山谷 问题描述 答案提交 参考答案 解析 E 最小矩阵 问题描述 答案提交 答案
  • css 栅格布局el-row(xs,sm,md,lg,xl)

    xs 12 24 12 2 所以当屏幕尺寸 lt 768px时 手机 每行展示2个div class com item sm 8 24 8 3 所以当屏幕尺寸 gt 768px时 平板 每行展示3个div class com item md
  • spark.ml支持算法总结

    文章目录 spark支持算法总结 推荐模型 协同过滤 分类模型 1 逻辑回归 2 决策树 3 朴素贝叶斯 4 随机森林 5 梯度提升决策树回归 6 多层感知器分类 7 一对多分类 8 支持向量机 回归模型 1 线性回归 2 广义线性模型 3
  • F1值(F-Measure)、准确率(Precision)、召回率(Recall)简单理解

    准确率与召回率 Precision Recall 准确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值 用来评价结果的质量 准确率 Precision Precision是检测出某类特征的数量与检测出的所有特征数量之间的比率 衡量的
  • 开放-封闭原则(The Open-Closed Principle)

    1 定义 软件实体 类 模块 函数等等 应该是可以扩展的 但是不可修改的 开放 封闭原则主要体现在两个方面 对扩展开放 意味着有新的需求或变化时 可以对现有代码进行扩展 以适应新的情况 对修改封闭 意味着一旦设计完成 就可以独立完成其工作
  • Python编程新手看过来,如何求素数 (Python学习教程)

    本期的Python学习教程是针对新入门Python编程的新手来写的 关于怎么求素数 一 什么是素数 素数就是质数 通俗点说就是只能被1和其本身整数的数就是素数 1除外 举个例子 2 3 4 5 6当中 根据上面的定义 2只能被1整数 因为任
  • JAVA学习笔记(二)浮点数与精确计算

    浮点数分为float 单精度浮点数 和double 双精度浮点数 float取值范围是4字节32位 精度是7到8位 double取值范围是8字节64位 精度是16到17位 数据转化时会有精度的损失 所以通过BigDecimal类将浮点数转化
  • hive 写入mysql 覆盖_一文搞定hive之insert into 和 insert overwrite与数据分区

    版权声明 本文为博主原创文章 未经博主允许不得转载 数据分区 数据库分区的主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间 主要包括两种分区形式 水平分区与垂直分区 水平分区是对表进行行分区 而垂直分区是对列进行分区 一般
  • Android的ListView控件的常用适配器

    ListView的常用适配器 一 ArrayAdapter适配器 1 创建ListView 2 创建用于加载数据的布局 3 java的逻辑代码 使用GridView 以多列的方式排列 处理GridView的逻辑代码 二 SimpleAdap
  • pfx证书转pem、crt、key

    今天测试端的服务器突然不能下载苹果APP了 经查看 发现原来是测试环境的https证书过期了 需要更换证书 于是赶紧从阿里云更新我们的最新证书 我们程序部署在tomcat上 于是下载tomcat版本 下载完成后如下 我们的程序部署在天翼云上
  • adb命令

    adb screenshot2 aapt monitor uiautomatorviewer等命令都在Android SDK的tools platform tools build tools下面 如果希望直接运行命令 不写绝对路径 请把相应
  • TypeScript中的模块与命名空间

    一 模块 在TypeScript中 模块是一种组织和封装代码的方式 模块使得代码可以按照特定的规则划分为不同的文件 并且可以在这些文件之间进行导入和导出 从而实现代码的重用和组织 1 默认导入导出 默认模块导出是一种特殊的导出语法 在一个模
  • 读取串口 :javax.comm 2.0 windows下Eclipse的配置

    javax comm 2 0 windows下Eclipse的配置 要在Windows下 对计算机的串口或并口等进行编程 可以选择使用Java Communication API javax comm 包 现在最新的版本是3 0版本 但是3
  • B站评论采集

    B站评论采集 打开目标网址 哔哩哔哩 干杯 bilibili 找到爬取得剧的评论 打开浏览器抓包工具进行抓包分析 这里爬取鬼灭之刃第一季的评论数据 分析网页 打开评论页面 可以看到分为短评 128702 和长评 639 条 常规操作直接F1