Python爬取B站视频全部评论

本文介绍如何使用Python3爬取B站视频的全部评论,并将其保存为CSV文件。通过输入B站视频的Bvid号,程序会遍历所有评论并存储。注意,总评论数可能包括评论和回复,而此代码仅爬取评论部分。

Python3爬取B站视频全部评论

1.为什么有这篇文章

最近受朋友委托需要爬取B站视频下的评论作为他的分析数据,我上网查了很多相关教程和文章都没有爬取全部的评论,不能满足朋友的需求,只好自己动手,在此分享一下实现代码供大家学习交流。

2.相关代码

通过输入B站视频Bvid号,可以将视频下的评论全部保存到csv文件中。(说明一下:输出显示 总评论数 > 当前评论数,这并不是BUG,而是总评论数包含评论和回复,这里只是爬取了评论。)

import requests
import re
import time
import csv

#消息头信息
header={'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
        }

#获取评论API
original_url = 'https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next={}&type=1&oid={}&mode=3'

#时间戳转换成日期
def get_time(ctime):
    timeArray = time.localtime(ctime)
    otherStyleTime = time.strftime("%Y.%m.%d", timeArray)
    return str(otherStyleTime)

#获取aid
def get_oid(bvid):
    video_url = 'https://www.bilibili.com/video/' + bvid
    page = requests.get(video_url, headers=header).text
    aid = re.search(r'"aid":[0-9]+', page).group()[6:]
    return aid

#边爬取评论边保存文件
def online_save(Bvid):
    all_count = 0
    oid = get_oid(Bvid)
    page = 1
    url = original_url.format(page, oid)
    html = requests.get(url, headers=header)
    data = html.json()
    count = int(data['data']['cursor']['all_count'])
    fname = Bvid + '_评论.csv'
    with open(fname, 'w+', newline='', encoding='utf_8_sig') as f:
        csv_writer=csv.writer(f)
        csv_writer.writerow(["时间", "点赞", "评论"])
        for i in data['data']['replies']:
            message=i['content']['message']
            message = re.sub('\s+', '', message)
            ctime=get_time(i['ctime'])
            like=i['like']
            csv_writer.writerow([ctime,str(like),message])
            all_count = all_count + 1
        print('总评论数:{},当前评论数:{},爬取Page{}完毕。'.format(count, all_count, page))
        time.sleep(5)
        while all_count < count:
            page += 1
            url = original_url.format(page, oid)
            try:
                html = requests.get(url, headers=header)
                data = html.json()
                for i in data['data']['replies']:
                    message = i['content']['message']
                    ctime = get_time(i['ctime'])
                    like = i['like']
                    csv_writer.writerow([ctime, str(like), message])
                    # f.write(ctime+'\t' + str(like) + '\n')
                    # f.write(message)
                    # f.write('\n------------------------\n')
                    all_count = all_count + 1
                print('总评论数:{},当前评论数:{},爬取Page{}完毕。'.format(count, all_count, page))
                time.sleep(5)
            except:
                break
        f.close()

if __name__=='__main__':
    Bvid=input('输入视频Bvid:')
    online_save(Bvid)
    print('完成!')



运行结果如下:

运行结果
爬取结果-csv文件

分享完毕,希望可以帮到有需要的朋友。

### 如何使用 Python 爬取 B 视频评论并保存为 JSON 格式 要实现爬取 B 视频评论并将数据保存为 JSON 文件的目标,可以通过以下方法完成: #### 1. 准备工作 在开始之前,需要安装必要的库来处理 HTTP 请求和解析 JSON 数据。常用的库包括 `requests` 和 `json`。 ```bash pip install requests ``` #### 2. 获取 API 接口 B 评论通常通过其官方接口提供。对于特定视频 ID (avid),可以访问如下 URL 来获取评论数据: ``` https://api.bilibili.com/x/v2/reply?jsonp=jsonp&pn={page}&type=1&oid={video_id}&sort=2 ``` 其中: - `{page}` 是页码参数,用于分页加载更多评论。 - `{video_id}` 是目标视频的 AV 号或者 BV 号对应的 oid 值[^1]。 #### 3. 编写代码逻辑 以下是完整的代码示例,展示如何抓取指定视频评论数据,并将其存储到本地文件中。 ```python import json import requests def fetch_bilibili_comments(video_id, page_count=10): base_url = "https://api.bilibili.com/x/v2/reply" all_data = {"replies": []} headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", "Referer": f"https://www.bilibili.com/video/{video_id}" } for pn in range(1, page_count + 1): params = { 'jsonp': 'jsonp', 'pn': str(pn), 'type': '1', # 类型固定为1表示视频 'oid': video_id, 'sort': '2' # 按热度排序 } response = requests.get(base_url, headers=headers, params=params) data = response.json() if not data['data']['replies']: break all_data["replies"].extend(data['data']['replies']) return all_data def save_to_json(filename, data): with open(filename, 'w', encoding='utf-8') as file: json.dump(data, file, ensure_ascii=False, indent=4) if __name__ == "__main__": video_id = input("请输入视频ID(AV号或BV号):").strip() comments_data = fetch_bilibili_comments(video_id) output_filename = f"{video_id}_comments.json" save_to_json(output_filename, comments_data) print(f"评论已成功保存至 {output_filename}") ``` 上述脚本实现了以下功能: - 使用 `fetch_bilibili_comments` 方法动态请求多个页面的数据。 - 将所有回复 (`replies`) 合并成单一列表。 - 调用 `save_to_json` 方法将最终结果导出为 JSON 文件[^2]。 #### 4. 注意事项 - **反爬机制**:频繁调用可能导致 IP 被封禁,建议设置合理的延时时间或代理池。 - **合法性**:确保遵守网的服务条款以及相关法律法规,在未经授权的情况下不得滥用爬虫技术。 - **错误处理**:增加异常捕获模块以应对网络波动或其他不可预见的情况。 ---
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wshinng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值