我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【Python】使用Python做简易爬虫爬取B站评论

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【Python】使用Python做简易爬虫爬取B站评论

目录

一、前言

二、分析网页

三、代码

1.头

2.获取根评论

3.获取子评论

四、总代码

五、总结


一、前言

        B站评论没有查找功能,就随手写了一个爬虫爬取B站评论存储到本地txt中

        首先需要安装python的request库,和beautifulsoup库

pip install requests

pip install bs4

        出现successfully就代表安装成功了

        下面就是所需的所有库

import requestsfrom bs4 import BeautifulSoupimport reimport jsonfrom pprint import pprintimport time

二、分析网页

        示例网页        兰音『探窗』BV18T411G7xJ

        我们在页面中查看源代码,发现源代码中并没有有关评论的信息。我们继续往下滑到评论的位置,发现评论是需要加载一会才出现,这时候我就猜测需要抓包才能获取到评论的信息。

        打开F12,在network中查询reply有关选项,查找到了评论信息。

         我提取出URL,查看里面的各项数据

      

         不知道为什么这里的URL需要删除掉Callback后面的数据才能正常查看

         在Edge里下载Json Formatter可以更好的查看。

        发现一个包并不能显示所有的评论,我们继续往下滑,在F12寻找有关reply的数据,提取出URL

        发现只有next会改变,那么next=1是什么?实践发现next=1和next=0的数据一样,所以我们编程序的时候可以直接从1开始。

        但是我们又发现这里面只有根评论没有子评论,怀疑子评论在另一个包中,查看其中一个评论的子评论,我们又在F12中抓到了一个新包。

        同样我们提取URL,观察replies就是所需要的子评论。同样一页也不能显示完所有回复,观察后发现,各个评论只有pn不一样。

         那么子评论和根评论是怎么联系在一起的呢?

        观察URL,发现子评论的URL有root这项,我们就去研究了根和子的一致,发现根的rpid就是子的root,这样我们就找到了关系。

         最后在写代码的时候还发现有个问题,就是有些根评论不需要展开,那么子评论的包中replies这一项就是空的,而这些评论的信息存在梗评论的包中,我们只需要简单判断一下就可以了。

        了解完结构后,编程就简单多了。

三、代码

1.头

#网页头headers = {    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36",    "referer" : "https://www.bilibili.com/"}

2.获取根评论

def get_rootReply(headers):    num = 1    replay_index = 1    while True:        URL = (f"https://api.bilibili.com/x/v2/reply/main?&jsonp=jsonp&next={num}&type=1&oid=470113786&mode=3&plat=1&_=1680096302818")   #获得网页源码        respond = requests.get(URL , headers = headers) # 获得源代码 抓包        # print(respond.status_code)        reply_num = 0        if(respond.status_code == 200): # 如果响应为200就继续,否则退出            respond.encoding = "UTF-8"            html = respond.text            json_html = json.loads(html)    # 把格式转化为json格式 一个是好让pprint打印,一个是好寻找关键代码                        if json_html['data']['replies'] is None or len(json_html['data']['replies']) == 0 :                break            for i in range(0,len(json_html['data']['replies'])):   #一页只能读取20条评论                reply = json_html['data']['replies'][reply_num]['content']['message']                root = json_html['data']['replies'][reply_num]['rpid']                reply = reply.replace('\n',',')                # print(reply)                file.write(str(replay_index) + '.' + reply + '\n')                if json_html['data']['replies'][reply_num]['replies'] is not None:                    if(get_SecondReply(headers,root) == 0):                        for i in range(0,len(json_html['data']['replies'][reply_num]['replies'])):reply = json_html['data']['replies'][reply_num]['replies'][i]['content']['message']reply = reply.replace('\n',',')file.write("        " + reply + '\n')                reply_num += 1                 replay_index += 1            num += 1                        time.sleep(0.5)        else :            print("respond error!")            break    file.close()

3.获取子评论

def get_SecondReply(headers,root):    pn = 1    while True:        URL = (f"https://api.bilibili.com/x/v2/reply/reply?jsonp=jsonp&pn={pn}&type=1&oid=824175427&ps=10&root={root}&_=1679992607971")        respond = requests.get(URL , headers = headers) # 获得源代码 抓包        reply_num = 0        if(respond.status_code == 200):            respond.encoding = "UTF-8"            html = respond.text            json_html = json.loads(html)                        if json_html['data']['replies'] is None:                if(pn == 1):                    return 0                else :                    return 1                        for i in range(0,len(json_html['data']['replies'])):                if json_html['data']['replies'] is None:                    break                reply = json_html['data']['replies'][reply_num]['content']['message']                reply = reply.replace('\n',',')                # print(reply)                reply_num += 1                file.write("        " + reply + '\n')            pn += 1            time.sleep(0.5)        else:            print("Sreply error!")            exit(-1)

这样各个模块就集齐了

四、总代码

import requestsfrom bs4 import BeautifulSoupimport reimport jsonfrom pprint import pprintimport time#网页头headers = {    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36",    "referer" : "https://www.bilibili.com/"}file = open('lanyin.txt', 'w',encoding='utf-8')def get_SecondReply(headers,root):    pn = 1    while True:        URL = (f"https://api.bilibili.com/x/v2/reply/reply?jsonp=jsonp&pn={pn}&type=1&oid=824175427&ps=10&root={root}&_=1679992607971")        respond = requests.get(URL , headers = headers) # 获得源代码 抓包        reply_num = 0        if(respond.status_code == 200):            respond.encoding = "UTF-8"            html = respond.text            json_html = json.loads(html)                        if json_html['data']['replies'] is None:                if(pn == 1):                    return 0                else :                    return 1                        for i in range(0,len(json_html['data']['replies'])):                if json_html['data']['replies'] is None:                    break                reply = json_html['data']['replies'][reply_num]['content']['message']                reply = reply.replace('\n',',')                # print(reply)                reply_num += 1                file.write("        " + reply + '\n')            pn += 1            time.sleep(0.5)        else:            print("Sreply error!")            exit(-1)    def get_rootReply(headers):    num = 1    replay_index = 1    while True:        URL = (f"https://api.bilibili.com/x/v2/reply/main?&jsonp=jsonp&next={num}&type=1&oid=470113786&mode=3&plat=1&_=1680096302818")   #获得网页源码        respond = requests.get(URL , headers = headers) # 获得源代码 抓包        # print(respond.status_code)        reply_num = 0        if(respond.status_code == 200): # 如果响应为200就继续,否则退出            respond.encoding = "UTF-8"            html = respond.text            json_html = json.loads(html)    # 把格式转化为json格式 一个是好让pprint打印,一个是好寻找关键代码                        if json_html['data']['replies'] is None or len(json_html['data']['replies']) == 0 :                break            for i in range(0,len(json_html['data']['replies'])):   #一页只能读取20条评论                reply = json_html['data']['replies'][reply_num]['content']['message']                root = json_html['data']['replies'][reply_num]['rpid']                reply = reply.replace('\n',',')                # print(reply)                file.write(str(replay_index) + '.' + reply + '\n')                if json_html['data']['replies'][reply_num]['replies'] is not None:                    if(get_SecondReply(headers,root) == 0):                        for i in range(0,len(json_html['data']['replies'][reply_num]['replies'])):reply = json_html['data']['replies'][reply_num]['replies'][i]['content']['message']reply = reply.replace('\n',',')file.write("        " + reply + '\n')                reply_num += 1                 replay_index += 1            num += 1                        time.sleep(0.5)        else :            print("respond error!")            break    file.close()if __name__ == '__main__':    get_rootReply(headers)    print("sucessful")

五、总结

        自己随手写的代码,比较垃圾,欢迎大佬指正。

来源地址:https://blog.csdn.net/ClushioAqua/article/details/129834114

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【Python】使用Python做简易爬虫爬取B站评论

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用Python爬虫爬取网站图片

这篇文章主要介绍了如何使用Python爬虫爬取网站图片,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。此次python3主要用requests,解析图片网址主要用beautif
2023-06-22

使用python怎么爬取微博评论

今天就跟大家聊聊有关使用python怎么爬取微博评论,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端
2023-06-14

使用Python爬虫怎么避免频繁爬取网站

这期内容当中小编将会给大家带来有关使用Python爬虫怎么避免频繁爬取网站,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python的数据类型有哪些?python的数据类型:1. 数字类型,包括int(整
2023-06-15

怎么使用Python爬取网易云歌曲评论实现词云图

这篇文章主要讲解了“怎么使用Python爬取网易云歌曲评论实现词云图”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Python爬取网易云歌曲评论实现词云图”吧!环境使用Python
2023-06-30

如何用Python网络爬虫抓取百度贴吧评论区图片和视频

如何用Python网络爬虫抓取百度贴吧评论区图片和视频,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。百度贴吧是全球最大的中文交流平台,你是否跟我一样,有时候看到评论区的图片
2023-06-01

如何使用Python爬虫实现抓取电影网站信息并入库

这篇文章主要介绍如何使用Python爬虫实现抓取电影网站信息并入库,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一.环境搭建1.下载安装包访问 Python官网下载地址:https://www.python.org/
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录