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

六、爬虫工具推荐

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

相关推荐
vx_biyesheji00011 天前
豆瓣电影推荐系统 | Python Django 协同过滤 Echarts可视化 深度学习 大数据 毕业设计源码
大数据·爬虫·python·深度学习·django·毕业设计·echarts
2501_943695331 天前
高职大数据与会计专业,考CDA证后能转纯数据分析岗吗?
大数据·数据挖掘·数据分析
深蓝电商API1 天前
爬虫IP封禁后的自动切换与检测机制
爬虫·python
喵手1 天前
Python爬虫实战:公共自行车站点智能采集系统 - 从零构建生产级爬虫的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集公共自行车站点·公共自行车站点智能采集系统·采集公共自行车站点导出csv
喵手1 天前
Python爬虫实战:地图 POI + 行政区反查实战 - 商圈热力数据准备完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·地区poi·行政区反查·商圈热力数据采集
芷栀夏1 天前
从 CANN 开源项目看现代爬虫架构的演进:轻量、智能与统一
人工智能·爬虫·架构·开源·cann
AAD555888992 天前
YOLO11-EfficientRepBiPAN载重汽车轮胎热成像检测与分类_3
人工智能·分类·数据挖掘
fanstuck2 天前
从0到提交,如何用 ChatGPT 全流程参与建模比赛的
大数据·数学建模·语言模型·chatgpt·数据挖掘
喵手2 天前
Python爬虫实战:HTTP缓存系统深度实战 — ETag、Last-Modified与requests-cache完全指南(附SQLite持久化存储)!
爬虫·python·爬虫实战·http缓存·etag·零基础python爬虫教学·requests-cache