深度模拟用户行为:用Playwright爬取B站弹幕与评论数据

💡 引言:B站数据为何如此"难爬"?

B站(Bilibili)作为国内最受欢迎的视频弹幕网站之一,页面采用大量JavaScript渲染 ,数据接口绑定复杂的登录验证和加密参数 ,直接使用 requests 等传统方式已难以满足爬虫需求。

如果你想:

  • 获取某视频的弹幕内容(实时滚动弹幕)
  • 获取评论区的真实用户评论(分页加载 + 登录校验)
  • 绕过浏览器检测机制,模拟真实用户行为访问网页

那么,Playwright 是一个极具威力的自动化武器,远胜Selenium,性能更好,支持无头模式,适配Chromium/Firefox/WebKit。深度模拟用户行为:用Playwright爬取B站弹幕与评论数据

一、准备工作:环境安装与配置

1. 安装Playwright

python 复制代码
pip install playwright
playwright install

二、目标与思路

我们将实现以下目标:

功能 实现方式
打开B站视频页面 Playwright模拟用户访问
自动登录(可选) 账号Cookie复用
提取视频弹幕 调用https://comment.bilibili.com/{cid}.xml接口
提取视频评论 模拟滚动评论区 + 接口抓取

三、实战步骤详解

1. 获取 cid(弹幕接口的关键参数)

每个视频的 cid 可以通过接口获取:

python 复制代码
import requests

def get_cid(bvid):
    api = f'https://api.bilibili.com/x/player/pagelist?bvid={bvid}'
    resp = requests.get(api)
    json_data = resp.json()
    return json_data['data'][0]['cid']

2. 获取弹幕内容(XML)

python 复制代码
from xml.etree import ElementTree

def get_danmaku(cid):
    url = f'https://comment.bilibili.com/{cid}.xml'
    response = requests.get(url)
    response.encoding = 'utf-8'
    root = ElementTree.fromstring(response.text)

    print("弹幕列表:")
    for d in root.findall('d'):
        print(d.text)

3. 获取评论内容(Playwright模拟浏览器)

python 复制代码
import asyncio
from playwright.async_api import async_playwright
import json

async def fetch_comments(bvid):
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)  # 设为True为无头模式
        context = await browser.new_context()
        page = await context.new_page()
        
        url = f"https://www.bilibili.com/video/{bvid}"
        await page.goto(url)
        await page.wait_for_timeout(5000)  # 等待页面加载
        await page.mouse.wheel(0, 5000)  # 滚动到底部加载评论

        # 拦截评论请求数据包
        comments = []

        async def handle_response(response):
            if "main?oid" in response.url and response.status == 200:
                try:
                    json_data = await response.json()
                    replies = json_data['data']['replies']
                    for r in replies:
                        comments.append(r['content']['message'])
                except:
                    pass

        page.on("response", handle_response)

        await page.wait_for_timeout(5000)  # 等待评论加载
        print("评论内容:")
        for c in comments:
            print(" -", c)

        await browser.close()

# 示例调用
asyncio.run(fetch_comments("BV1Kb4y1D7hq"))

四、可选:Cookie登录绕过账号验证

B站部分评论或视频需登录后才能访问,推荐使用已登录账号的Cookie导入方式

python 复制代码
ookies = [     {"name": "SESSDATA", "value": "你的值", "domain": ".bilibili.com", "path": "/"},     
# 可添加其他字段如 bili_jct、buvid3 等 ]  # Playwright上下文中注入Cookie await context.add_cookies(cookies) 

五、进阶建议:模拟人类行为

为了防止Playwright被检测为自动化工具,可引入以下策略:

  • 1.加载图片/视频内容,减少"无头痕迹"
  • 2.随机鼠标移动、滚动时间间隔
  • 3.使用 playwright-stealth 插件
  • 4.使用 undetected_chromedriver 替代方案

六、爬虫工具推荐

爬虫在线转换: 爬虫工具箱 - 在线爬虫与数据处理工具

相关推荐
FL16238631295 小时前
窗户干净脏污分类窗户清洁状态分类数据集3299张2类别已划分训练验证测试集
人工智能·分类·数据挖掘
Quincy_Freak5 小时前
银河麒麟aarch64如何高效做数据分析?分享一款内网离线数据分析利器
大数据·数据库·数据挖掘·数据分析·aarch64
计算机安禾12 小时前
【算法分析与设计】第21篇:回溯法的状态空间树与剪枝函数设计
大数据·人工智能·算法·机器学习·数据挖掘·剪枝
Smartdaili China1 天前
OpenClaw赋能AI智能体:实时联网与网页抓取
人工智能·爬虫·ai·爬取·openclaw·open claw
IP搭子来一个1 天前
爬虫使用代理 IP 频繁失效,该如何定位问题?
网络·爬虫·tcp/ip
DisonTangor1 天前
跃阶星辰开源Step 3.7 Flash:原生多模态,最高生成速度400 Tokens/s
人工智能·语言模型·数据挖掘·开源·aigc
weixin_468466851 天前
图像分类技术落地应用与实战指南
人工智能·深度学习·ai·分类·数据挖掘·图像分类·模型部署
春日见1 天前
强化学习方法分类:
人工智能·机器学习·分类·数据挖掘·强化学习
搞科研的小刘选手1 天前
【大数据方向专题研讨会】第三届大数据与数字化管理国际学术会议(ICBDDM 2026)
大数据·信息安全·数据挖掘·云计算·可视化·供应链·信息管理
高洁011 天前
设备故障?数字孪生提前预警
深度学习·机器学习·数据挖掘·transformer·知识图谱