博客
关于我
Python每日一练(9)-批量爬取B站小视频
阅读量:111 次
发布时间:2019-02-25

本文共 3042 字,大约阅读时间需要 10 分钟。

批量爬取哔哩哔哩小视频:从基础到进阶实践

哔哩哔哩(B站)作为年轻用户的文化社区,拥有丰富多样的视频内容。通过Python爬虫技术,我们可以实现批量爬取小视频的功能。本文将从基础到进阶详细介绍实现过程,包括视频下载、动态JSON数据获取、浏览器头部信息随机生成以及实时进度打印等多个实用功能。

一、批量爬取B站小视频

首先,我们需要获取B站小视频的URL地址。通过分析浏览器控制台,可以发现视频列表的URL包含动态参数 next_offsetpage_size。我们可以通过循环发送请求,逐步获取所有小视频的信息。

爬虫程序的核心逻辑如下:

  • 发送HTTP请求,获取JSON数据
  • 解析JSON数据,提取视频标题和播放地址
  • 根据视频标题和播放地址下载视频文件
  • 二、获取动态JSON数据

    在批量爬取过程中,除了视频标题和播放地址外,我们还需要获取更多视频信息,如发布时间、用户名称和观看人数。这些信息通常位于视频的JSON数据中。

    通过对B站视频数据的进一步分析,可以发现每个视频信息包含以下关键字段:

    • upload_time:视频发布时间
    • name:用户名称
    • watched_num:观看人数

    三、随机生成浏览器头部信息

    为了避免被网站反爬技术拦截,我们需要为每次请求生成不同的浏览器头部信息。通过安装 fake_useragent 模块,可以随机伪造用户代理信息,模拟不同浏览器和操作系统。

    四、获取视频文件大小

    在下载视频时,了解视频的文件大小可以帮助我们更好地控制下载进度。通过分析HTTP响应头部,可以获取视频的总大小,并在下载过程中实时打印下载进度。

    五、实时打印文件下载进度

    通过设置回调函数,可以在视频下载过程中实时打印下载进度。具体实现方法是:

  • 获取视频总大小
  • 在下载过程中记录已下载的大小
  • 计算下载进度并打印

  • 代码示例

    import requests
    import os
    import time
    import re
    import random
    from fake_useragent import UserAgent
    # B站小视频JSON数据获取URL
    json_url = "https://api.vc.bilibili.com/board/v1/ranking/top?page_size=10&next_offset={}1&tag=埃及昆虫&platform=pc"
    class MySpider:
    def __init__(self):
    self.headers = {
    "User-Agent": UserAgent(path="fake_useragent.json").random
    }
    def get_json(self, url):
    response = requests.get(url, headers=self.headers)
    if response.status_code == 200:
    return response.json()
    else:
    print("获取JSON信息的请求失败")
    def download_video(self, url, video_name):
    headers = {
    "User-Agent": UserAgent(path="fake_useragent.json").random
    }
    response = requests.get(url, headers=headers, stream=True)
    if not os.path.exists("video"):
    os.mkdir("video")
    if response.status_code == 200:
    content_size = int(response.headers["content-length"])
    print(f"视频文件大小:{content_size / (1024 * 1024)}MB")
    with open(f"video/{video_name}.mp4", "wb") as file:
    for data in response.iter_content(chunk_size=1024):
    file.write(data)
    file.flush()
    size += len(data)
    print(f"下载进度:{size / content_size * 100}% ({size / (1024 * 1024)}MB/{content_size / (1024 * 1024)}MB)")
    else:
    print("视频下载失败")
    if __name__ == "__main__":
    spider = MySpider()
    ranking = 0
    for i in range(10):
    json = spider.get_json(json_url.format(i))
    video_infos = json["data"]["items"]
    for video_info in video_infos:
    ranking += 1
    title = video_info["item"]["description"]
    comp = re.compile("[^A-Za-z0-9\u4e00-\u9fa5]")
    title = comp.sub("", title)
    video_url = video_info["item"]["video_playurl"]
    print(f"正在下载排名第{ranking}的视频")
    print(f"视频标题:{title}")
    print(f"视频地址:{video_url}")
    spider.download_video(video_url, title)
    time.sleep(random.randint(3, 6))

    实施总结

    通过以上代码示例,我们可以实现以下功能:

  • 批量爬取B站小视频的标题和播放地址
  • 获取视频的发布时间、用户名称和观看人数
  • 随机生成不同的浏览器头部信息
  • 实时打印视频下载进度
  • 下载并保存视频文件到本地
  • 通过对上述实现的深入理解和实践,我们可以更高效地完成爬虫任务,同时避免被网站反爬机制拦截。

    转载地址:http://ncj.baihongyu.com/

    你可能感兴趣的文章
    mysql 排序id_mysql如何按特定id排序
    查看>>
    Mysql 提示:Communication link failure
    查看>>
    mysql 插入是否成功_PDO mysql:如何知道插入是否成功
    查看>>
    Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
    查看>>
    mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
    查看>>
    mysql 数据库备份及ibdata1的瘦身
    查看>>
    MySQL 数据库备份种类以及常用备份工具汇总
    查看>>
    mysql 数据库存储引擎怎么选择?快来看看性能测试吧
    查看>>
    MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
    查看>>
    MySQL 数据库的高可用性分析
    查看>>
    MySQL 数据库设计总结
    查看>>
    Mysql 数据库重置ID排序
    查看>>
    Mysql 数据类型一日期
    查看>>
    MySQL 数据类型和属性
    查看>>
    mysql 敲错命令 想取消怎么办?
    查看>>
    Mysql 整形列的字节与存储范围
    查看>>
    mysql 断电数据损坏,无法启动
    查看>>
    MySQL 日期时间类型的选择
    查看>>
    Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
    查看>>
    MySQL 是如何加锁的?
    查看>>