Python实现B站视频数据信息内容采集

嗨喽,大家好呀~这里是爱看美女的茜茜呐

环境使用:

  • Python 3.10

  • Pycharm

模块使用:

  • import datetime

  • import time

  • import requests

  • import hashlib

  • import csv

如何安装python第三方模块:

  1. win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车

  2. 在pycharm中点击Terminal(终端) 输入安装命令


👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~

python源码、视频教程、插件安装教程、资料我都准备好了,直接在文末名片自取就可


爬虫实现基本流程

一. 数据来源分析

  1. 明确需求

    明确采集的网站以及数据内容

    网址: https://search.bilibili.com/all?keyword=昏君体�%A

    A%8C%E5%8D%A1&from_source=webtop_search&spm_id_from=333.1007&search_source=

    5

    数据: 视频相关信息: 标题 / 播放量 / 弹幕量 / 评论 / 作者...

  2. 抓包分析 (浏览器中进行操作)

    通过浏览器自带工具 (开发者工具) 进行数据抓包: 分析我们需要数据可以请求那个网址能够得到

    • 打开开发者工具

      F12 / 右键点击检查选择 network (网络)

    • 刷新网页 / 点击下一页查看数据

      点击第二页 / 点击下一页 (爬虫批量采集数据, 进行翻页操作)

    • 通过关键字搜索找到对应数据包链接(位置)

      关键字: 我们需要的数据 (标题)

    请求网址: https://api.bilibili.com/x/web-interface/wbi/search/type

    请求方法: GET

二. 代码实现步骤

导入的模块

python 复制代码
import requests
# 导入格式化输出模块 (内置模块, 无需安装)
from pprint import pprint
# 导入日期转化模块 (内置模块, 无需安装)
import datetime
# 导入csv模块 (内置模块, 无需安装)
import csv
# 导入哈希模块
import hashlib
# 导入时间模块
import time
1. 发送请求 (基本内容可以复制)

模拟浏览器对于url地址发送请求

  • 模拟浏览器 (字典接收参数内容)

    主要是使用开发者工具中: 请求标头 参数内容

    常用: cookie / referer / host / User-Agent (UA)

  • 请求网址

  • 发送请求 (请求方法&请求参数)

python 复制代码
def GetResponse(url, data):
    """发送请求
    - def: 定义函数的关键字
    - GetResponse: 自定义的函数名 (自定义变量名)
    - url / data: 形式参数 --> 如果调用这个函数的时候, 需要传入参数
        url: 请求网址
        data: 请求参数
    """
    # 模拟浏览器 (伪装)
    headers = {
        # User-Agent 用户代理, 表示浏览器基本身份信息/设备信息
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
    }
    # 发送请求
    response = requests.get(url=url, params=data, headers=headers)
    # 返回内容
    return response
2. 获取数据
  • response.text 获取响应文本数据

    其实除了 获取json / content 以外都可以用text

  • response.json() 获取响应json数据

    响应数据返回内容 {} / [{}] 类似这样的形式 就直接获取json()

  • response.content 获取响应二进制数据

    保存 图片/音频/视频/特定格式文件 的时候, 获取content 表示获取二进制数据

python 复制代码
def GetInfo(page, offset, wts, w_rid):
    """获取视频数据
    GET请求: 查询参数 (链接问号后面的内容)
    """
    # 请求网址
    url = 'https://api.bilibili.com/x/web-interface/wbi/search/type'
    # 请求参数 (代码折叠)
    data = {
        'category_id': '',
        'search_type': 'video',
        'ad_resource': '5654',
        '__refresh__': 'true',
        '_extra': '',
        'context': '',
        'page': page,
        'page_size': '42',
        'from_source': '',
        'from_spmid': '333.337',
        'platform': 'pc',
        'highlight': '1',
        'single_column': '0',
        'keyword': '昏君体验卡',
        'qv_id': '0I7bwAusbLfoEYY25kUrqvU9NodT7Ktq',
        'source_tag': '3',
        'gaia_vtoken': '',
        'dynamic_offset': offset,
        'web_location': '1430654',
        'w_rid': w_rid,
        'wts': wts,
    }
    # data = {...}
    # 发送请求 + 获取数据
    JsonData = GetResponse(url=url, data=data).json()
3. 解析数据

解析方法选择根据你获取到数据情况来的

  • re
  • xpath
  • css
  • bs4 / lxml / parsel /...

json字典数据: 可以根据键值对取值

键值对取值: 根据冒号左边的内容[键], 提取冒号右边的内容[值] (一层一层往下提取)

python 复制代码
    # 解析数据, 提取视频信息列表
    result = JsonData['data']['result']
    # for 循环遍历, 提取列表里面元素
    for index in result:
        # 提取具体数据内容, 保存字典里面
        send_date = index['senddate'] # 时间戳
        # 把时间戳转成日期
        date = str(datetime.datetime.fromtimestamp(send_date))
        dit = {
            '标题': index['title'].replace('<em class="keyword">', '').replace('</em>', ''),
            'Up': index['author'],
            '播放': index['play'],
            'BV号': index['bvid'],
            '弹幕': index['danmaku'],
            '时长': index['duration'],
            '评论': index['review'],
            '日期': date,
        }
        # 写入字典数据
        csv_writer.writerow(dit)
        print(dit)


def Hash(page, offset, wts):
    """解密w_rid参数"""
    bn = [
        "__refresh__=true",
        "_extra=",
        "ad_resource=5654",
        "category_id=",
        "context=",
        f"dynamic_offset={offset}",
        "from_source=",
        "from_spmid=333.337",
        "gaia_vtoken=",
        "highlight=1",
        "keyword=%E6%98%8F%E5%90%9B%E4%BD%93%E9%AA%8C%E5%8D%A1",
        f"page={page}",
        "page_size=42",
        "platform=pc",
        "qv_id=0I7bwAusbLfoEYY25kUrqvU9NodT7Ktq",
        "search_type=video",
        "single_column=0",
        "source_tag=3",
        "web_location=1430654",
        f"wts={wts}"
    ]
    jn = '&'.join(bn)
    string = jn + "ea1db124af3c7062474693fa704f4ff8"
    MD5 = hashlib.md5()
    MD5.update(string.encode('utf-8'))
    w_rid = MD5.hexdigest()
    return w_rid
4. 保存数据
python 复制代码
if __name__ == '__main__':
    """保存数据(固定写法)
    open() 内置函数, 用于文件操作(保存/读取)
        - file='data.csv': 保存路径以及文件名/格式
        - mode='w': 模式(保存方式) w写入数据
        - encoding='utf-8': 编码
            如果你保存csv表格使用utf-8乱码了 --> 换成utf-8-sig
        - newline='': 换成符
    csv.DictWriter(): csv模块中字典写入方式
        - f: 通过open函数创建的文件对象
        - fieldnames: 字段名(表头), 表格文件中第一行内容,表示后续数据是什么东西
    """
    f = open(file='data.csv', mode='w', encoding='utf-8', newline='')
    csv_writer = csv.DictWriter(f, fieldnames=[
        '标题',
        'Up',
        '播放',
        'BV号',
        '弹幕',
        '时长',
        '评论',
        '日期',
    ])
    # 写入表头
    csv_writer.writeheader()
    for page in range(1, 29):
        print(f'=============正在采集第{page}页面的数据内容=============')
        offset = (page - 1) * 36
        wts = int(time.time())
        w_rid = Hash(page=page, offset=offset, wts=wts)
        GetInfo(page=page, offset=offset, wts=wts, w_rid=w_rid)

尾语

感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

相关推荐
没枕头我咋睡觉几秒前
【大语言模型_1】VLLM部署Qwen模型
python·语言模型
数据蛙苹果恢复专家20 分钟前
无损转换:严选4个视频mkv转mp4格式的方法
音视频
lkasi21 分钟前
python文字转wav音频
开发语言·python
EasyCVR22 分钟前
视频存储EasyCVR视频监控汇聚管理平台设备录像下载报错404是什么原因?
音视频·视频监控·监控视频接入·视频质量诊断·视频诊断
白茶等风1213831 分钟前
C#_封装详解
开发语言·c#
程序员阿鹏40 分钟前
ArrayList 与 LinkedList 的区别?
java·开发语言·后端·eclipse·intellij-idea
哦豁灬44 分钟前
NCNN 学习(2)-Mat
深度学习·学习·ncnn
Bruce小鬼1 小时前
最新版本TensorFlow训练模型TinyML部署到ESP32入门实操
人工智能·python·tensorflow
Length-vision1 小时前
Linux入门学习:Linux调试器gdb使用
linux·学习
白如意i1 小时前
如何在 Ubuntu 16.04 服务器上安装 Python 3 并设置编程环境
linux·python·ubuntu