(2024.9.18更新)新版从b站爬取评论的方式+代码

 引言

        大三的大数据导论老师要求进行爬虫的编写,为接下来的数据处理实验做准备,无奈自学爬虫,成功爬取b站的评论。

        b站的反爬机制没有那么严格(单对于评论),并且还有官方的api接口可以获取(推荐方法),但是能爬还不如自己爬,正好锻炼自己写爬的能力

API接口获取

        b站在2021年左右更新了api接口,从以前的简单的

https://api.bilibili.com/x/v2/reply/

  更新到了新的接口。

使用f12检测如下操作:当向下滚动页面有新的评论出现时,检测网络请求变化

发现这个请求里涉及到了“replay”,可能与”回复“ 或 “评论”有关。

经多次尝试得到请求接口:

url = f'https://api.bilibili.com/x/v2/reply/main?
next=1& 
type=1&
oid=BV1T5411K7Wc&
mode=3'

b站返回的评论都是一页为一个json,默认为10条为一页,next = 1 意味着当前是第一页

type = 1:必须,但是作用未知。

oid:视频的bv号。

值得注意的是,以前的oid需要的是由bv号转化得来的avi号,但是现在的接口不需要了。

mode = 3:返回的api 的版本(最新是3)

User - Agent 获取(必须)

b站的反爬机制很简单,只需要User-agent与其要求格式可以对应即可。

每一次在网页上对网页做出请求时,都会有一个不同的user-agent,这也是想要使用api的必要条件。

获取方法:

打开你想爬取的视频,翻到评论区,右键,检查,打开网络监测页面

不播放视频,将评论区下滑,发现右侧出现了新的请求,打开main开头的请求。

随后在右侧-标头页面,向下滑

在请求标头下找到最下面的user-agent:

直接将其复制。

代码(需要有自己的user-agent)

import requests
import re
import time
import csv
import json
headers = {
    'User-Agent': '使用你自己的user-agent'
}
def fetch_comments(video_id, max_pages=1000):#最大页面数量可调整
    comments = []
    last_count = 0
    for page in range(1, max_pages+1):
        url = f'https://api.bilibili.com/x/v2/reply/main?next=1&type=1&oid={video_id}&mode=3'
        try:
            # 添加超时设置
            response = requests.get(url, headers=headers, timeout=10)
            if response.status_code == 200:
                data = response.json()
                print(page)
                if data['data']['replies'] == None:
                    break
                if data and 'replies' in data['data']:
                    for comment in data['data']['replies']:
                        comment_info = {
                            '用户昵称': comment['member']['uname'],
                            '评论内容': comment['content']['message'],
                            '被回复用户': '',
                            '评论层级': '一级评论',
                            '性别': comment['member']['sex'],
                            '用户当前等级': comment['member']['level_info']['current_level'],
                            '点赞数量': comment['like'],
                            '回复时间': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(comment['ctime']))
                        }
                        comments.append(comment_info)
                if last_count == len(comments):
                    break
                last_count = len(comments)
            else:
                break
        except requests.RequestException as e:
            print(f"请求出错: {e}")
            break
        # 控制请求频率
        time.sleep(1)
    return comments

def save_comments_to_csv(comments, video_bv):
    with open(f'./result/{video_bv}.csv', mode='w', encoding='utf-8',
              newline='') as file:
        writer = csv.DictWriter(file,
                                fieldnames=['用户昵称', '性别', '评论内容', '被回复用户', '评论层级', '用户当前等级',
                                            '点赞数量', '回复时间'])
        writer.writeheader()
        for comment in comments:
            writer.writerow(comment)

video_name = '你想要的视频名字'  # 视频名字
video_bv = '视频的BV号'  # video_bv
print(f'视频名字: {video_name}, video_bv: {video_bv}')
comments = fetch_comments(video_id)
save_comments_to_csv(comments, video_name)# 会将所有评论保存到一个csv文件

爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网造成过大负担或触发反爬虫机制,爬虫需要遵守网的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网的使用政策,并确保对被访问网的服务器负责。
要在MATLAB中爬取B评论,你可以按照以下步骤操作: ### 1. **确定目标API** B评论数据通常通过其官方API获取。你需要找到合适的API端点来请求特定视频或动态的评论数据。 - 访问[B开发者平台](https://open.bilibili.com/)查看是否有公开可用的API文档。 - 如果没有直接提供评论相关的API,可以考虑逆向工程网页版或移动端应用的数据传输协议(HTTP抓包),但这可能涉及到法律风险和技术难度,需谨慎处理。 ### 2. **设置环境与工具箱** MATLAB本身并没有内置专门用于网络爬虫的功能,但可以通过`webread`, `webwrite`等函数发送HTTP请求,并结合JSON解析库提取所需信息。 可能需要安装一些额外的支持包: ```matlab % 安装必要的支持包 matlab.addons.install('jsondecode'); % JSON解码器 ``` ### 3. **编写爬虫脚本** #### 发送HTTP GET 请求 ```matlab % 设置URL及查询参数 url = 'https://api.bilibili.com/x/v2/reply'; % 示例API地址 (具体请参考实际需求) params = struct(... 'oid', 86754901, ... % 视频AV号或其他唯一标识符 'type', 1, % 类型:如1代表普通视频 'sort', 2, % 排序规则,默认按热度排序 'pn', 1, % 当前页数 'ps', 20); % 每页条目数量 options = weboptions('RequestMethod','get',... 'Timeout',30,... 'HeaderFields',{'User-Agent','Mozilla/5.0'}); response = webread(url,params,options); ``` #### 解析返回结果 假设响应体为JSON格式,则继续进行如下操作: ```matlab comments_data = jsondecode(response); % 提取出评论列表部分并显示出来 disp(comments_data.replies); ``` 请注意,在此过程中还需要妥善处理分页、异常情况以及遵守网Robots.txt文件所规定的访问限制等内容;此外频繁地发起大量请求可能会触发点防护机制导致IP被封禁,建议加入适当的延时措施保证程序稳定性的同时也维护良好的互联网生态秩序。
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值