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


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

    环境使用:

    模块使用:

    • 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=%E6%98%8F%E5%90%9B%E4%BD%93%E9%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

    二. 代码实现步骤

    导入的模块

    import requests
    # 导入格式化输出模块 (内置模块, 无需安装)
    from pprint import pprint
    # 导入日期转化模块 (内置模块, 无需安装)
    import datetime
    # 导入csv模块 (内置模块, 无需安装)
    import csv
    # 导入哈希模块
    import hashlib
    # 导入时间模块
    import time
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 发送请求 (基本内容可以复制)

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

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

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

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

    • 请求网址

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

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    2. 获取数据
    • response.text 获取响应文本数据


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

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

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

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

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

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    3. 解析数据

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

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

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

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

        # 解析数据, 提取视频信息列表
        result = JsonData['data']['result']
        # for 循环遍历, 提取列表里面元素
        for index in result:
            # 提取具体数据内容, 保存字典里面
            send_date = index['senddate'] # 时间戳
            # 把时间戳转成日期
            date = str(datetime.datetime.fromtimestamp(send_date))
            dit = {
                '标题': index['title'].replace('', '').replace('', ''),
                '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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    4. 保存数据
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    尾语

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

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

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

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

  • 相关阅读:
    vm options、program arguments、environment property
    [C4(NEim)2][Br]2双子型离子液体1,4-双(1-氰乙基咪唑諭基)丁烷二溴盐
    git提交设置忽略指定文件,文件夹
    如果有些字段不想进行序列化怎么办?
    Java--异常/Exception--try/catch/finally的return顺序
    docker安装es单节点设置密码(加ik分词器)
    【你不知道的javascript上】对象,可迭代对象,for in和for of的区别
    STM32使用PWM+DMA方式驱动WS2812灯珠
    Qt入门(八)——Qt打包(将Qt文件可以在别的Windows系统下运行)
    【SpringBoot】Redission 的使用与介绍
  • 原文地址:https://blog.csdn.net/m0_72282564/article/details/136233816