首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python爬虫实战:如何利用代理IP高效爬取Bilibili视频评论数据(附完整代码)

Python爬虫实战:如何利用代理IP高效爬取Bilibili视频评论数据(附完整代码)

原创
作者头像
阿秋数据采集
修改于 2025-05-29 08:15:57
修改于 2025-05-29 08:15:57
18400
代码可运行
举报
运行总次数:0
代码可运行

在当今时代,Bilibili(哔哩哔哩)作为国内知名的弹幕视频网站,以内容创作为载体,拥有海量活跃的用户,其评论数据也承载了用户的真实观看体验,这些评论数据对于了解用户喜好、分析内容创作趋势以及进行市场调研具有重要价值。但众所周知,Bilibili的反爬虫机制较为严格,有用相对完善的反爬虫体系(如IP检测、频率限制及登录验证等),一旦爬取任务超出阈值,IP很容易被限制或封禁。

为了高效、稳定获取Bilibili评论数据,本文将为你详细介绍如何利用代理IP结合Python爬虫技术,搭配多线程处理机制,突破反爬限制,实现对Bilibili评论数据的抓取。

一、目标与数据背景

明确目标

咱们这次的目标是B站某个视频下面的评论,想抓取的数据有:

  • 用户昵称
  • 评论内容
  • 点赞数量
  • 评论发布时间

遇到的坑

  1. IP限制:Bilibili对频繁访问的行为可是很敏感的,一不小心IP就被封禁了。
  2. 分页加载:评论数据是分页显示的,需要从接口动态加载,想要获取完整数据,就得合并多个分页。
  3. 安全性要求:在采集数据的时候,得确保采集的Bilibili公开数据,不影响平台运行。
  4. 高效采集:评论数据量大,页面又多,想要大批量爬取,速度和稳定性都得跟上。

解决方案

代理IP,搭配多线程处理,我们可以动态调整IP,突破访问频率限制,同时加速爬取速度并提高任务成功率。

二、爬取Bilibili评论数据的实现步骤

1. 环境配置

爬虫开发前,得先装好这些Python库:

代码语言:bash
AI代码解释
复制
pip install requests
pip install pandas
pip install lxml

2. 分析评论网页结构

通过浏览Bilibili视频页面,我们了解到评论数据是通过Ajax异步加载的。可以通过分析网络请求,找到评论数据的API接口。

可以发现,API链接格式为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://api.bilibili.com/x/v2/reply/main?oid={video_id}&type=1&next={page}
  • video_id:视频的唯一ID。
  • next:从分页1开始,用于表示当前页的评论数据。
  • type:评论类型(通常是1)
  • mode:排序模式(通常是3,按热度排序)
  • 返回数据为JSON格式,其中评论内容存储在data.replies字段里。

3. 获取代理IP

调用青果网络代理IP,通过动态IP轮换解决Bilibili的频率限制问题:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
def get_ip():
    url = "https://share.proxy.qg.net/get?key=yourkey&num=1&area=&isp=0&format=txt&seq=\r\n&distinct=false"
    while 1:
        try:
            r = requests.get(url, timeout=10)
        except:
            continue

        ip = r.text.strip()
        if '请求过于频繁' in ip:
            print('IP请求频繁')
            time.sleep(1)
            continue
        break
    proxies = {
        'https': '%s' % ip
    }

    return proxies

4. 单页爬取函数

实现抓取指定视频ID和页码下的评论数据:

代码语言:python
代码运行次数:1
运行
AI代码解释
复制
import requests
from lxml import etree
import json
def crawl_comments(video_id, page, proxies):
    """爬取指定视频的评论数据"""
    url = "https://api.bilibili.com/x/v2/reply/main"
    params = {
        "oid": video_id,
        "type": 1,
        "mode": 3,
        "next": page
    }
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
    }
    try:
        response = requests.get(url, params=params, headers=headers, proxies=proxies, timeout=10)
        response.raise_for_status()
        data = response.json()
        comments = data.get("data", {}).get("replies", [])
        result = []
        for comment in comments:
            content = comment.get("content", {}).get("message", "")
            nickname = comment.get("member", {}).get("uname", "")
            timestamp = comment.get("ctime", "")
            likes = comment.get("like", 0)
            result.append({
                "评论内容": content,
                "用户昵称": nickname,
                "评论发布时间": timestamp,
                "点赞数量": likes
            })
        return result
    except Exception as e:
        print(f"Error fetching comments for page {page}: {e}")
        return []

5. 多线程池并行抓取

通过ThreadPoolExecutor创建线程池,实现多线程并发抓取多个分页数据:

代码语言:python
代码运行次数:1
运行
AI代码解释
复制
from concurrent.futures import ThreadPoolExecutor, as_completed
import pandas as pd
import time
def main(video_id):
    max_pages = 20  # 需要爬取的评论页数
    thread_count = 10  # 最大并行线程数量
    all_comments = []
    # 初始化青果网络代理池
    proxies = get_proxy()
    with ThreadPoolExecutor(max_workers=thread_count) as executor:
        futures = [executor.submit(crawl_comments, video_id, page, proxies) for page in range(1, max_pages + 1)]
        for future in as_completed(futures):
            try:
                comments = future.result()
                all_comments.extend(comments)
            except Exception as e:
                print(f"Error in thread:{e}")
    # 存储数据到Excel
    df = pd.DataFrame(all_comments, columns=["用户昵称", "评论内容", "点赞数量", "评论发布时间"])
    df.to_excel(f"Bilibili视频_{video_id}_评论数据.xlsx", index=False)
    print(f"爬取完成!")

6. 程序运行

运行主函数,采集Bilibili指定视频下的评论数据:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
if __name__ == "__main__":
    start_time = time.time()
    video_id = "xxxxx"  # 替换为目标视频的ID
    main(video_id)
    end_time = time.time()
    print(f"总耗时:{round(end_time - start_time, 2)} 秒")

三、运行结果

程序跑完后,评论数据会自动存到Excel文件里,用户昵称、评论内容、点赞数、发布时间都有,格式清晰,方便后续分析处理。

四、总结

爬Bilibili视频的评论方法就到这了。通过试用优质的代理IP,动态切换IP和业务分池技术能让我们实际操作过程中成功率更高,这种整合代理IP和多线程池的方案,不仅适用于爬Bilibili,也同样适用于其他的项目。

如果如果你正在进行类似任务的业务开发,或者需要高质量的代理IP,可以试一试青果网络的,目前都有6小时免费测试时间,用来测试还是很香的。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、目标与数据背景
    • 明确目标
    • 遇到的坑
    • 解决方案
  • 二、爬取Bilibili评论数据的实现步骤
    • 1. 环境配置
    • 2. 分析评论网页结构
    • 3. 获取代理IP
    • 4. 单页爬取函数
    • 5. 多线程池并行抓取
    • 6. 程序运行
  • 三、运行结果
  • 四、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档