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

news/2024/9/25 11:16:37/

引言

在当今信息爆炸的互联网时代,用户生成的内容不断涌现,其中包括了各种各样的评论。而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 = Nonedef 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 = 1comments = []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 += 1time.sleep(1)  # 避免请求过于频繁被封IPelse: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.ppmy.cn/news/1453975.html

相关文章

OpenCV如何在图像中寻找轮廓(60)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV如何模板匹配(59) 下一篇 :OpenCV检测凸包(61) 目标 在本教程中,您将学习如何: 使用 OpenCV 函数 cv::findContours使用 OpenCV 函数 cv::d rawContours …

[QNX] mmap+cache/nocache+memcpy/asm_memcpy速度对比

mmap nocache介绍 以linux系统的nocache介绍: 在Linux系统中,使用mmap映射文件到内存时可以指定不使用缓存。这可以通过在调用mmap时将MAP_NOCACHE标志传递给mmap函数来实现。 MAP_NOCACHE标志告诉内核不要将映射的内存页缓存到文件系统缓存中&#xff…

设置UIProgressView的样式

UIProgressView是UIKit框架中的一个控件,用于显示任务的完成进度。你可以使用UIProgressView来展示任务的完成情况,例如下载文件、上传数据等。 要设置UIProgressView的样式,包括粗细、颜色等,你可以使用UIProgressView的一些属性…

Android 安装过程三 MSG_ON_SESSION_SEALED、MSG_STREAM_VALIDATE_AND_COMMIT的处理

Android 安装过程一 界面跳转 知道,在InstallInstalling Activity中,PackageInstallerSession对象创建之后,接着会打开它,然后将安装文件进行拷贝,拷贝完成之后,会对Session对象确认。   从Session对象确…

QT-QTCreator环境配置

准备工作: 下载QT: 链接:https://pan.baidu.com/s/1prJcsC4DGqhKiXvLuPQFVA?pwd60b3 提取码:60b3下载WindowsKits: 链接:https://pan.baidu.com/s/1QNiS3HpbH5M5kXx5AhkqnQ?pwde2h8 提取码:e2h8安装的…

微信小程序实现九宫格

微信小程序使用样式实现九宫格布局 使用微信小程序实现九宫格样式,可以直接使用样式进行编写,具体图片如下:1、js代码: Page({/*** 页面的初始数据*/data: {current: 4},// 监听activeClick(e) {let index e.currentTarget.dat…

Linux磁盘逻辑卷LVM丢失

一.原因:服务器异常断电,重启服务器之后,服务所在的磁盘丢失,逻辑卷也不存在。 二.解决方法: 2.1)执行以下命令查看lvm配置文件备份内容: more /etc/lvm/backup/datavg01 datavg是之前使…

C# WinForm —— 12 ListBox绑定数据

ListBox加载大量数据时,避免窗体闪烁的方法: 在加载语句的前后分别加上 BeginUpdate()方法 和 EndUpdate()方法 指定一个集合为绑定的数据源 1. 首先,右键项目,添加类 2. 在新建的类文件中添加属性值信息 3. 构建初始化的对象…