b站直接用BV号爬虫抓取评论
b站的评论由js加载,所以我们有两种方法获取,
第一种用selenium,拖拽导航条,刷新出评论再抓取(效率低且代码量大)
第二种直接找到js接口去获取数据
先说下我一开始的思路
我刚开始不确定是xhr还是js,所以现在xhr中找,发现并没有,于是搜索了js,发现在这个接口里
page代表页数和评论数量,replies是所有评论的内容
于是我们开始分析这个接口的参数
刚开始我以为callback是js加密,后来发现这个参数加不加效果是一样的,
多次试验后发现只有pn,type,oid,sort是必须的
pn是当前页数
type默认为1,作用未知
oid是视频的id
sort是排序
我这边直接上代码
import requests
from bs4 import BeautifulSoup
import json
headers={'User-Agent': 'XXXX'
}
#视频id
oid = 36613746
#评论页数
pn = 1
#排序种类 0是按时间排序 2是按热度排序
sort = 2while True:url =f'https://api.bilibili.com/x/v2/reply?pn={pn}&type=1&oid={oid}&sort={sort}'reponse = requests.get(url,headers=headers)a = json.loads(reponse.text)if pn==1:count = a['data']['page']['count']size = a['data']['page']['size']page = count//size+1print(page)for b in a['data']['replies']:print(b['content']['message'])print('-'*10)if pn!=page:pn += 1else:break
这里会直接打印出oid为36613746视频里的所有评论(不包括子评论),如果要保存数据,自己选择打印出文件或者存入数据库。
现在唯一的问题是不能用视频网址直接弄出评论,还要f12去看oid,如果有谁有好的想法,请评论告诉我一下。谢谢
--------------------------4.21更新如下-------------------------
我在评论的提示下发现,oid和视频av号是一样的,只是b站在3月已经将av参数变成了BV参数,所以我们需要将视频url的BV转成av。
知乎大佬已经给出了转换的算法
[https://www.zhihu.com/question/381784377?rf=381829319]
table='fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'
tr={}
for i in range(58):tr[table[i]]=i
s=[11,10,3,8,4,6]
xor=177451812
add=8728348608def dec(x):r=0for i in range(6):r+=tr[x[s[i]]]*58**ireturn (r-add)^xordef enc(x):x=(x^xor)+addr=list('BV1 4 1 7 ')for i in range(6):r[s[i]]=table[x//58**i%58]return ''.join(r)print(dec('BV17x411w7KC'))
print(dec('BV1Q541167Qg'))
print(dec('BV1mK4y1C7Bz'))
print(enc(170001))
print(enc(455017605))
print(enc(882584971))作者:mcfx
链接:https://www.zhihu.com/question/381784377/answer/1099438784
这个原理我并没有搞懂,就直接用大佬的成果吧
然后我重新写了一下我的代码
import requests
from bs4 import BeautifulSoup
import json
headers={'User-Agent': 'XXX'
}
#视频bv
bv = 'BV18t411y7a6'
#评论页数
pn = 1
#排序种类 0是按时间排序 2是按热度排序
sort = 2i=1
panduan=0#bv,av互换算法
table='fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'
tr={}
for i in range(58):tr[table[i]]=i
s=[11,10,3,8,4,6]
xor=177451812
add=8728348608def dec(x):r=0for i in range(6):r+=tr[x[s[i]]]*58**ireturn (r-add)^xordef enc(x):x=(x^xor)+addr=list('BV1 4 1 7 ')for i in range(6):r[s[i]]=table[x//58**i%58]return ''.join(r)#bv转换成oid
oid = dec(bv)fp = open('comment.txt',"w",encoding="UTF-8")
while True:url =f'https://api.bilibili.com/x/v2/reply?pn={pn}&type=1&oid={oid}&sort={sort}'reponse = requests.get(url,headers=headers)a = json.loads(reponse.text)if pn==1:count = a['data']['page']['count']size = a['data']['page']['size']page = count//size+1print(page)for b in a['data']['replies']:panduan = 0str1=''str_list = list(b['content']['message'])for x in range(len(str_list)):if str_list[x]=='[':panduan=1if panduan!=1:str1 = str1+str_list[x]if str_list[x] == ']':panduan=0fp.write(str(i)+'、'+str1+'\n'+'-'*10+'\n')print(str1)print('-'*10)i = i + 1if pn!=page:pn += 1else:fp.close()break
这个新代码可以直接用BV号来下载评论了,而不用去F12找oid的,这里要感谢评论区的大佬提醒
这里我屏蔽了类似[小电视]这种表情文字,如果不需要可以直接用最上面的代码
b站直接用BV号爬虫抓取评论相关推荐
- python爬取百度贴吧中的所有邮箱_使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号...
原标题:使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号 不知道大家过年都是怎么过的,反正栏主是在家睡了一天,醒来的时候登QQ发现有人找我要一份贴吧爬虫的源代码,想起之前练手的时候写过一个抓 ...
- C#网络爬虫抓取小说
C#网络爬虫抓取小说 2017-09-05DotNet (点击上方蓝字,可快速关注我们) 来源:苍 cnblogs.com/cang12138/p/7464226.html 阅读目录 1.分析html ...
- 基于Thinkphp5+phpQuery 网络爬虫抓取数据接口,统一输出接口数据api
TP5_Splider 一个基于Thinkphp5+phpQuery 网络爬虫抓取数据接口 统一输出接口数据api.适合正在学习Vue,AngularJs框架学习 开发demo,需要接口并保证接口不跨 ...
- python爬虫微信朋友圈怎么发文字_如何利用Python网络爬虫抓取微信朋友圈的动态(上)...
今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...
- python抓取微信朋友圈动态_2018最全如何利用Python网络爬虫抓取微信朋友圈的动态...
今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...
- python爬虫抓取网站技巧总结
不知道为啥要说是黑幕了??哈哈哈-..以后再理解吧 python爬虫抓取网站的一些总结技巧 学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛 ...
- Python网络爬虫抓取彩票排列3全部历史数据
之前学了福彩3D网络爬虫技术,然后我研究了一天时间,写了一个体彩排列3爬虫抓取程序,为了感谢网友们的贡献,我决定分享代码 首先找一家比较大型的网站,500彩票网,因为是美国上市公司,轻易不会黄,这样写 ...
- 2018最全如何利用Python网络爬虫抓取微信朋友圈的动态
今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...
- 如何利用Python网络爬虫抓取微信朋友圈的动态(上)
今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...
最新文章
- Android模拟器学framework和driver之传感器篇1(linux sensor driver)
- 数据挖掘实验报告-关联规则算法实验
- 用最简单的例子理解策略模式(Strategy Pattern)
- javascript 表达式和运算符 (二)
- Linux shell编程学习笔记-----第十六章
- python的setup()与py2exe
- php怎么创建进程,在php中为长时间运行的进程创建后台进程
- 让php来搞定一切!,ubuntu安装和配置php5
- 基于 Redis3.2.4 集群搭建说明
- tde数据库加密_如何将TDE加密的用户数据库添加到Always On可用性组
- IO多路复用之select、poll、epoll介绍
- 实操教程:Android部署Nanodet模型完成实时高效的物体检测
- 新路嘉机器人_嘉懿学子在2019年上海市中小学机器人竞赛中喜获佳绩
- 没中奖的花花卡不要扔,还有用!
- 墙后的全部姿势,全被“瞎眼”AI透视
- 【PHP MySQL】数据库专题 第八课 表连接
- MATLAB数字图像水印
- 几个在线画图的工具,以备偷懒之需
- 【21天python打卡】第2天 python预备知识(2)
- python 请假审批系统_基于工作流的请假审批系统设计与实现