【爬虫】基于requests的B站直播实时弹幕爬取

​​​​​​

      1. 网页分析

进入Network在众多响应中寻找和弹幕相关的API,

图3-1 B站直播房间页面的开发者工具界面preview

 

图3-2 

在3-2展示的页面中可以查看到URL中有参数roomid,

在获取到url、相关参数以及headers后,通过requests.post()获取解析直播间弹幕。结果如图3-3:

图3-3 获取的部分弹幕

     

import requests

import time

import io,sys

 

  • 定义Danmu类

其中包含了url,请求头headers,POST传递的参数以及get_danmu()方法。在headers中可以增加更多header中的参数,增加不被反爬机制发现的可能性。关键代码如下:

 

    def __init__(self):

        # 弹幕url

        self.url = 'https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory'

        # 请求头

        self.headers = {

            'Host': 'api.live.bilibili.com',

            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0',

        }

        # 定义POST传递的参数

        self.data = {

            'roomid': ' 21396545',

            'csrf_token': '',

            'csrf': '',

            'visit_id': '',

        }

 

  • 构造get_danmu()方法

 

def get_danmu(self):

# 获取直播间弹幕

html = requests.post(url=self.url, headers=self.headers, data=self.data).json()

# 解析弹幕列表

for content in html['data']['room']:

# 获取昵称

nickname = content['nickname']

# 获取发言

text = content['text']

# 获取发言时间

timeline = content['timeline']

# 记录发言

msg = timeline + ' ' + nickname + ': ' + text

    print(msg)

 

# -*- encoding: utf-8 -*-
#@time:  2020/11/15 22:54
#@author: chenTao
#@file:  dnmu.py

import requests
import time
import io,sys
# import
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')


class Danmu():
    def __init__(self):
        # 弹幕url
        self.url = 'https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory'
        # 请求头
        self.headers = {
            'Host': 'api.live.bilibili.com',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0',
        }
        # 定义POST传递的参数
        self.data = {
            'roomid': '21396545',
            'csrf_token': '',
            'csrf': '',
            'visit_id': '',
        }

    def get_danmu(self):
        # 获取直播间弹幕
        html = requests.post(url=self.url, headers=self.headers, data=self.data).json()
        # 解析弹幕列表
        for content in html['data']['room']:
            # 获取昵称
            nickname = content['nickname']
            # 获取发言
            text = content['text']
            # 获取发言时间
            timeline = content['timeline']
            # 记录发言
            msg = timeline + ' ' + nickname + ': ' + text
            print(msg)

if __name__ == '__main__':
    # 创建bDanmu实例
    bDanmu = Danmu()
    i = 1
    while i < 10:
        i += 1
        # 暂停0.5防止cpu占用过高
        time.sleep(0.5)
        # 获取弹幕
        bDanmu.get_danmu()

 

### 使用 Python 抓取 B 评论和弹幕数据 为了实现这一目标,可以采用多种方法来获取所需的数据。通常情况下,直接访问网页并解析 HTML 不是最有效的方式;相反,利用 API 接口能够更高效地获得结构化的 JSON 数据。 #### 一、准备工作 在开始之前,确保安装了必要的库: ```bash pip install requests beautifulsoup4 pymongo pandas matplotlib seaborn jieba wordcloud ``` 这些工具可以帮助处理 HTTP 请求、HTML 解析以及后续的数据分析工作。 #### 二、抓取弹幕数据 对于 B 而言,其弹幕是以 XML 或者 JSON 形式存储于特定 URL 中。可以通过发送 GET 请求到相应的接口地址来取得实时或历史弹幕记录[^1]。 下面是一个简单的例子展示如何从指定视频 ID 下载弹幕文件: ```python import json import time from datetime import timedelta, date import requests def get_danmaku(cid, start_date, end_date): """ 获取某段时间内的所有弹幕 参数: cid (str): 视频 CID 值. start_date (date): 开始日期. end_date (date): 结束日期. 返回值: list: 所有符合条件的弹幕列表. """ danmakus = [] current_day = start_date while current_day <= end_date: url = f"https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid={cid}&date={current_day.strftime('%Y-%m-%d')}" response = requests.get(url) if 'no data' not in str(response.content): content = response.text # 处理返回的内容... danmakus.extend(parse_xml_to_list(content)) else: break current_day += timedelta(days=1) return danmakus def parse_xml_to_list(xml_string): """将XML字符串转换成包含每条弹幕文本的列表""" from xml.etree.ElementTree import fromstring as et_fromstring root = et_fromstring(xml_string.encode('utf-8')) result = [] for child in root.findall('./d'): text = child.text.strip() result.append(text) return result ``` 需要注意的是,在实际操作过程中可能遇到诸如反爬机制等问题,因此建议适当调整请求频率,并考虑加入代理池等功能以提高稳定性[^2]。 #### 三、保存与预处理 收集到原始数据之后,下一步就是对其进行清理和整理以便进一步的研究。这一步骤涉及到去除重复项、过滤无关字符等内容。此外还可以根据需求选择合适的数据库(如 MongoDB)来进行持久化管理。 #### 四、数据分析与可视化 最后阶段是对提取出来的信息做深入挖掘,比如统计高频词汇、绘制词云图等。这里推荐使用 `pandas` 和 `matplotlib/seaborn` 库完成表格创建及图表制作任务。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值