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号爬虫抓取评论相关推荐

  1. python爬取百度贴吧中的所有邮箱_使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号...

    原标题:使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号 不知道大家过年都是怎么过的,反正栏主是在家睡了一天,醒来的时候登QQ发现有人找我要一份贴吧爬虫的源代码,想起之前练手的时候写过一个抓 ...

  2. C#网络爬虫抓取小说

    C#网络爬虫抓取小说 2017-09-05DotNet (点击上方蓝字,可快速关注我们) 来源:苍 cnblogs.com/cang12138/p/7464226.html 阅读目录 1.分析html ...

  3. 基于Thinkphp5+phpQuery 网络爬虫抓取数据接口,统一输出接口数据api

    TP5_Splider 一个基于Thinkphp5+phpQuery 网络爬虫抓取数据接口 统一输出接口数据api.适合正在学习Vue,AngularJs框架学习 开发demo,需要接口并保证接口不跨 ...

  4. python爬虫微信朋友圈怎么发文字_如何利用Python网络爬虫抓取微信朋友圈的动态(上)...

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  5. python抓取微信朋友圈动态_2018最全如何利用Python网络爬虫抓取微信朋友圈的动态...

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  6. python爬虫抓取网站技巧总结

    不知道为啥要说是黑幕了??哈哈哈-..以后再理解吧 python爬虫抓取网站的一些总结技巧 学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛 ...

  7. Python网络爬虫抓取彩票排列3全部历史数据

    之前学了福彩3D网络爬虫技术,然后我研究了一天时间,写了一个体彩排列3爬虫抓取程序,为了感谢网友们的贡献,我决定分享代码 首先找一家比较大型的网站,500彩票网,因为是美国上市公司,轻易不会黄,这样写 ...

  8. 2018最全如何利用Python网络爬虫抓取微信朋友圈的动态

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  9. 如何利用Python网络爬虫抓取微信朋友圈的动态(上)

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

最新文章

  1. Android模拟器学framework和driver之传感器篇1(linux sensor driver)
  2. 数据挖掘实验报告-关联规则算法实验
  3. 用最简单的例子理解策略模式(Strategy Pattern)
  4. javascript 表达式和运算符 (二)
  5. Linux shell编程学习笔记-----第十六章
  6. python的setup()与py2exe
  7. php怎么创建进程,在php中为长时间运行的进程创建后台进程
  8. 让php来搞定一切!,ubuntu安装和配置php5
  9. 基于 Redis3.2.4 集群搭建说明
  10. tde数据库加密_如何将TDE加密的用户数据库添加到Always On可用性组
  11. IO多路复用之select、poll、epoll介绍
  12. 实操教程:Android部署Nanodet模型完成实时高效的物体检测
  13. 新路嘉机器人_嘉懿学子在2019年上海市中小学机器人竞赛中喜获佳绩
  14. 没中奖的花花卡不要扔,还有用!
  15. 墙后的全部姿势,全被“瞎眼”AI透视
  16. 【PHP MySQL】数据库专题 第八课 表连接
  17. MATLAB数字图像水印
  18. 几个在线画图的工具,以备偷懒之需
  19. 【21天python打卡】第2天 python预备知识(2)
  20. python 请假审批系统_基于工作流的请假审批系统设计与实现

热门文章

  1. 如何用直线画出好看的花瓶
  2. Java创建文件并写入字符串
  3. 互联网公司的抗疫情行动!
  4. 电竞显示器什么牌子好?这三款才是我的菜!
  5. 【高烧39°考研上岸】23上交819考研经验分享
  6. 小米的人事调整颇为特别,被击败的前对手高管纷纷担任小米高管
  7. golang实现线程安全的map
  8. 华三路由器做端口映射配置
  9. 巨噬细胞膜包封的抗菌纳米颗粒|巨噬细胞膜包被乳腺癌靶向纳米粒(齐岳生物)
  10. 江苏卫视的一站到底,这个节目还不错,粉丝网也做得很专业