深度模拟用户行为:用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 替代方案

六、爬虫工具推荐

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

相关推荐
Lululaurel1 天前
一文详解回归分析的探索、分析、检验阶段,以Stata和SPSS为例
数据挖掘·数据分析·回归·统计
Nue.js1 天前
最新b站加密关键字段的逆向(视频和评论爬取)
爬虫·python·安全
小羊在睡觉1 天前
Go语言爬虫:爬虫入门
数据库·后端·爬虫·golang·go
中杯可乐多加冰1 天前
【AI落地应用实战】利用亚马逊云科技 Step Functions 集成现有系统快速实现个性化邮件触达
大数据·人工智能·数据挖掘·数据分析·推荐系统·亚马逊云科技·step function
拉拉拉拉拉拉拉马1 天前
DINOv3详解+实际下游任务模型使用细节(分割,深度,分类)+ Lora使用+DINOv1至v3区别变换分析(可辅助组会)
人工智能·分类·数据挖掘
Tiger Z1 天前
文献阅读 | iMetaMed | FigureYa:一个标准化可视化框架,用于增强生物医学数据解释和研究效率
信息可视化·数据挖掘·数据分析
APIshop1 天前
Python爬虫+数据分析:电商平台数据采集与分析
爬虫·python·数据分析
摩羯座-185690305942 天前
VVIC 平台商品详情接口高效调用方案:从签名验证到数据解析全流程
java·前端·数据库·爬虫·python
love_and_hope2 天前
Num3:Prompt工程
人工智能·pytorch·深度学习·神经网络·数据挖掘
I'm a winner2 天前
第十四章:数据分析基础库NumPy(二)
数据挖掘·数据分析·numpy