爬取B站评论:Python技术实现详解

引言

在当今信息爆炸的互联网时代,用户生成的内容不断涌现,其中包括了各种各样的评论。而B站作为一个充满活力的视频分享平台,其评论区更是一个充满了各种各样精彩评论的宝藏地。那么,有没有一种简单的方法可以将这些评论收集起来呢?答案是肯定的!本文将介绍如何使用Python编写一个爬虫程序,轻松实现爬取B站视频的评论,为我们探索互联网数据的奥秘带来便利。

什么是爬虫?

在开始之前,我们先来了解一下什么是爬虫。爬虫,又称网络爬虫、网络蜘蛛,是一种按照一定的规则,自动地获取万维网信息的程序或脚本。简单来说,就是通过编写代码,让计算机自动地从网页上抓取需要的信息。而Python作为一种简洁、易学的编程语言,非常适合用来编写爬虫程序。

准备工作

在开始爬取B站评论之前,我们需要做一些准备工作:

  1. Python环境:确保你的电脑上已经安装了Python,并且能够正常运行。
  2. 编辑器:推荐使用VS Code、PyCharm等编辑器来编写Python代码,方便调试和管理。
  3. 第三方库:我们将使用requests库发送HTTP请求,以及beautifulsoup4库解析HTML页面。你可以使用以下命令来安装这两个库:

编写爬虫程序

第一步:获取评论页面URL

首先,我们需要找到要爬取评论的视频页面,并获取其评论页面的URL。通常,B站视频的评论页面URL格式为https://www.bilibili.com/video/avXXXXXX/#reply,其中avXXXXXX是视频的av号。我们可以通过拼接URL的方式来构造评论页面的URL。

第二步:发送HTTP请求获取页面内容

有了评论页面的URL之后,我们就可以使用requests库发送HTTP请求,获取页面的HTML内容。
第三步:完整代码实现

import requests
import json
import os
import pickle
from bs4 import BeautifulSoup
import time

# 设置请求头部信息,伪装成浏览器访问
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

# 设置代理信息
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"
proxyMeta = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"

# 登录B站后获取的cookies,用于自动登录
cookies_file = 'cookies.pkl'

# 保存进度的文件名
progress_file = 'progress.txt'

# 保存评论的文件夹名
comment_dir = 'comments'

# 创建保存评论的文件夹
if not os.path.exists(comment_dir):
    os.makedirs(comment_dir)

# 加载cookies
if os.path.exists(cookies_file):
    with open(cookies_file, 'rb') as f:
        cookies = pickle.load(f)
else:
    cookies = None


def login():
    """手动登录B站,获取cookies"""
    print("请手动登录B站,并复制cookies到cookies.pkl文件中。")


def get_video_id(url):
    """从视频网址中提取视频ID"""
    return url.split('/')[-1]


def get_comments(video_url):
    """爬取视频的评论"""
    video_id = get_video_id(video_url)
    comment_file = os.path.join(comment_dir, f'{video_id}.csv')
    if os.path.exists(comment_file):
        print(f"评论文件 {comment_file} 已存在,跳过该视频。")
        return

    # 请求视频页面,获取评论接口
    response = requests.get(video_url, headers=headers, cookies=cookies, proxies={"http": proxyMeta, "https": proxyMeta})
    soup = BeautifulSoup(response.text, 'html.parser')
    script = soup.find('script', attrs={'type': 'application/ld+json'})
    video_data = json.loads(script.text)
    api_url = video_data['comment']['embedUrl']

    # 循环获取评论,直到获取完所有评论
    page = 1
    comments = []
    while True:
        api = f'{api_url}&pn={page}&type=1'
        response = requests.get(api, headers=headers, cookies=cookies, proxies={"http": proxyMeta, "https": proxyMeta})
        data = response.json()
        if 'data' in data and data['data']['replies']:
            comments.extend(data['data']['replies'])
            page += 1
            time.sleep(1)  # 避免请求过于频繁被封IP
        else:
            break

    # 保存评论到CSV文件
    with open(comment_file, 'w', encoding='utf-8') as f:
        f.write('一级评论计数,隶属关系,被评论者昵称,被评论者ID,评论者昵称,评论者用户ID,评论内容,发布时间,点赞数\n')
        for comment in comments:
            content = comment['content']['message']
            content = content.replace('\n', ' ')
            like = comment['like']
            publish_time = comment['ctime']
            f.write(f'1, , , , , ,"{content}",{publish_time},{like}\n')
            if 'replies' in comment:
                for reply in comment['replies']:
                    content = reply['content']['message']
                    content = content.replace('\n', ' ')
                    like = reply['like']
                    publish_time = reply['ctime']
                    f.write(f'2,{comment["mid"]},{reply["member"]["uname"]},{reply["member"]["mid"]},'
                            f'{reply["member"]["uname"]},{reply["member"]["mid"]},"{content}",{publish_time},{like}\n')
    print(f"成功爬取视频 {video_id} 的评论,保存在 {comment_file} 中。")


def main():
    # 读取视频列表
    with open('video_list.txt', 'r') as f:
        video_urls = f.readlines()

    # 批量爬取视频评论
    for url in video_urls:
        url = url.strip()
        get_comments(url)


if __name__ == '__main__':
    if cookies is None:
        login()
    main()

总结

  • 批量爬取多个视频的评论:只需将要爬取的视频网址写入video_list.txt文件中,程序会自动遍历网址列表,爬取每个视频的评论,并保存到以视频ID命名的CSV文件中。
  • 只需一次登录:手动登录B站一次后,程序会自动保存cookies,下次运行程序时无需再次登录,确保持续爬取评论数据。
  • 断点续爬:程序支持断点续爬功能,如果中断了爬虫,下次运行时会根据progress.txt文件中的进度继续爬取评论,并且已经写入一半的CSV文件也会继续写入,避免数据丢失。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5月1日江苏某厂冷却塔清洗工作汇报-智渍洁

日期:5月1日 施工人员:张能超,张伟,刘平,曾巧 地点:江苏**** 事项:空冷器清洗 今日工作:设备安装完成,泡了三台 5月1日江苏某厂冷却塔清洗工作汇报 - 重庆智渍洁环保科技…

二进制,八进制,十六进制转十进制 c++

紧接着十进制转二进制,八进制,十六进制-CSDN博客这篇文章 输入一个二进制,八进制的数,怎样能转化为十进制呢? 原理如下: K进制转十进制 按权相加法展开成一个多项式,每项是该位的数码与相应…

【kettle006】kettle访问华为openGauss高斯数据库并处理数据至execl文件(已更新)

1.一直以来想写下基于kettle的系列文章,作为较火的数据ETL工具,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下华为openGauss高斯数据库相关知识体系 3.欢迎批评指正,跪谢…

2024年汉字小达人活动还有5个月开赛:来做18道历年选择题备考吧

距离2024年第11届汉字小达人比赛还有四个多月的时间,如何利用这段时间有条不紊地备考呢?我的建议是两手准备:①把小学1-5年级的语文课本上的知识点熟悉,重点是字、词、成语、古诗。②把历年真题刷刷熟,这对了解汉字小达…

任何人都可做的兼职副业,一单29.9元,利润70%的怀旧游戏项目

偶然发现一个博主正在直播玩一款经典的俄罗斯方块游戏机。这款游戏机年代久远,勾起了我对学生时代的无尽回忆。 那时,看到同学们玩这款游戏,我总是心生羡慕。为了能拥有一台自己的游戏机,我曾节衣缩食,悄悄攒钱购买。…

C++类定义时成员变量初始化

在C11中允许在类定义时对成员变量初始化。 class A { public:A() { }void show(){cout << "m_a " << m_a << endl;cout << "m_b " << m_b << endl;} private:int m_a 10;//类定义时初始化int m_b; //没有初始化…

CP,FT,WAT有什么区别?

‍ 知 识星球&#xff08;星球名&#xff1a; 芯片制造与封测社区&#xff0c;星球号&#xff1a; 63559049&#xff09;里的学员问&#xff1a; CP,FT,WAT都是与 芯片的测试有关&#xff0c;他们有什么区别呢&#xff1f; 如何区‍分&#xff1f; ‍ ‍ CP,FT,WAT分别…

MySQL LRU算法(冷热数据分离)

背景 MySQL中使用的InnoDB存储引擎采用了一种特别的最近最少使用&#xff08;LRU, Least Recently Used&#xff09;算法来管理其Buffer Pool中的页&#xff08;包括数据页和索引页&#xff09;。Buffer Pool是InnoDB用来缓存数据&#xff0c;以减少磁盘I/O操作的内存区域。正…

python数据分析中数据可视化简单入门

1.折线图表 首先引入相关包pyecharts&#xff0c;如果没下载可以先下载 pip install pyecharts from pyecharts.charts import Lineline Line() # 添加x轴 line.add_xaxis([呱了个呱,羊村,牟多,蜂地,喵帕斯]) # 添加y轴 line.add_yaxis("GDP",[50,30,40,34,63,22])…

Jrebel 最新的 2023.4 、 2024.1 激活方法

Idea Jrebel 插件安装 在线激活 &#xff08;推荐&#xff09; 访问&#xff1a; https://www.jpy.wang/page/jrebel.html 在jrebel激活的时候填写相应的地址

逻辑漏洞:修改Response状态值导致的逻辑漏洞

目录 1、什么是respone状态值&#xff1f; 2、利用原理 3、PHPYUN人才招聘系统靶场演示 今天还是继续学习逻辑漏洞相关的知识&#xff0c;今天的主题是“修改Response状态值导致的逻辑漏洞”&#xff0c;今天的内容还是参考别的大佬总结好的&#xff0c;我只是在这里进行学习…

Linux系统配置JAVA环境

一、jar包下载 官网:https://www.oracle.com/java/technologies/downloads 二、文件上传 上传到linux服务器 解压 下面是解压的路径 三、修改profile文件 修改etc下的profile文件&#xff0c;添加以下内容 vim /etc/profileexport JAVA_HOME/root/java/jdk-17.0.11 expo…

ttkbootstrap界面美化系列之Meter(六)

Meter是计量表控件&#xff0c;在大数据统计类的界面设计中使用较多&#xff0c;本文将介绍ttk中的Meter控件 一&#xff1a;Meter接口 print(help(ttk.Meter)) Help on class Meter in module ttkbootstrap.widgets:class Meter(tkinter.ttk.Frame)| Meter(masterNone, bo…

半监督节点分类:标签传播和消息传递

基础概念回顾 传统图机器学习的特征工程——节点层面&#xff0c;连接层面&#xff0c;全图层面 节点层面&#xff1a;信用卡欺诈 连接层面&#xff1a;推荐可能认识的人 全图层面&#xff1a;预测分子结构 半监督节点分类 半监督节点分类&#xff1a;用已知标签节点预测未…

推荐书单|提升境界、思维能力

1、《别做正常的傻瓜》 豆瓣评分&#xff1a;8.1 通过揭示人们在日常生活中常见的非理性行为&#xff0c;引导读者认识并克服这些行为&#xff0c;从而做出更明智的决策。 2、《活法》 豆瓣评分&#xff1a;8.1 稻盛和夫分享其人生哲学和经营哲学的著作&#xff0c;强调了正确…

【MATLAB】解决不同版本MATLAB出现中文乱码的问题

解决不同版本MATLAB出现中文乱码的问题 方法1&#xff1a;更改保存类型为GBK方法2&#xff1a;记事本打开方法3&#xff1a;Notepad参考 低版本matlab打开高版本Matlab的.m文件时&#xff0c;出现中文乱码问题。比如下图&#xff1a; 出现原因为&#xff1a; 编码格式不统一问…

深度学习之基于Unet肺部CT图像分割项目

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 肺部CT图像分割在医学诊断中占据重要地位&#xff0c;它有助于医生快速、准确地识别和分析肺部病变。…

关于 Vue.js 双向数据绑定基本实现认知

写在前面 很早的一篇博客&#xff0c;整理了部分&#xff0c;蹭假期整理完博文内容涉及:双向数据绑定 实现方式简单介绍基于发布订阅、数据劫持的双向数据绑定两种不同实现(ES5/ES6) Demo&#xff0c;以及代码简单分析Object.defineProperty && Proxy API 介绍以及特性…

如何配置X86应用程序启用大地址模式(将用户态虚拟内存从2GB扩充到3GB),以解决用户态虚拟内存不够用问题?(项目实战案例解析)

目录 1、概述 2、为什么不直接将程序做成64位的&#xff1f; 3、进程内存不足导致程序发生闪退的案例分析 3.1、问题说明 3.2、将Windbg附加到程序进程上进行动态调试 3.3、动态调试的Windbg感知到了中断&#xff0c;中断在DebugBreak函数调用上 3.4、malloc或new失败的…

企业微信主体能不能修改?

企业微信变更主体有什么作用&#xff1f;当我们的企业因为各种原因需要注销或已经注销&#xff0c;或者运营变更等情况&#xff0c;企业微信无法继续使用原主体继续使用时&#xff0c;可以申请企业主体变更&#xff0c;变更为新的主体。企业微信变更主体的条件有哪些&#xff1…
最新文章