听说小破站新上一批“高质量”的视频,于是怀揣着“学习”的目的,我用Python将他们全部采集了下来

news2024/11/19 0:22:41

事情是这样的,昨晚室友悄咪咪的拉着我去他的电脑,说带我欣赏一点高雅的作品,于是这一坐下,便是一晚上…

作为一个乐于分享的博主,本来我是决定直接分享的,但是转念一想,授人以鱼不如授人以渔,我还是直接出教程方便大家以后遇到了喜欢的,也能及时下载保存。

一、准备一下

开发环境

Pycharm
python 3.8
ffmpeg

模块的使用

requests
re
subprocess

二、基本思路流程

1、明确需求

采集下破站视频数据
通过开发者工具进行抓包分析,分析破站视频数据的来源。

开发者工具的使用

打开方式:

  1. 鼠标右键点击检查选择Network
  2. F12
  3. ctrl + shift + i

想要开发者工具中有数据加载, 需要 刷新网页。

通过元素(Element)面板,我们能查看到想抓取页面渲染内容所在的标签、使用什么 CSS 属性(例如:class=“middle”)等内容。例如我想要抓取我知乎主页中的动态标题,在网页页面所在处上右击鼠标,选择“检查”,可进入 Chrome 开发者工具的元素面板。

网络(Network)面板记录页面上每个网络操作的相关信息,包括详细的耗时数据、HTTP 请求与响应标头和 Cookie,等等。这就是我们通常说的抓包。

Requests Table参数:

all:所有请求数据(图片、视频、音频、js代码、css代码)

XHR:XMLHttpRequest 的缩写,是ajax技术的核心,动态加载完成经常分析的一个内容

CSS: css样式文件

JS:JavaScript文件,js解密是常分析的一个页面

Img: Images 图片文件

Font: 字体文件(字体反扒)

DOC : Document,文档内容

WS: WebSocket,web端的socket数据通信,一般用于一些实时更新的数据

Requests详情:

请求头

Headers 是显示 HTTP 请求的 Headers,我们通过这个能看到请求的方式,以及携带的请求参数等。

  • General

    Request url :实际请求的网址

    Request Method: 请求方法

    Status Code: 状态码,成功时为 200

  • Response Headers

    服务器返回时设置的一些数据,例如服务器更新的cookie数据最新是在这里出现修改。

  • Requests Headers

    请求体,请求不到数据的原因一般出在这里,反扒也是反扒请求体里面的数据。

    Accept:服务器接收的数据格式(一般忽略)

    Accept-Encoding: 服务器接收的编码(一般忽略)

    Accept-Language: 服务器接收的语言(一般忽略)

    Connection: 保持连接(一般忽略)

    Cookies: cookies信息,是身份信息,爬取VIP资源是需要携带身份信息。

    Host: 请求的主机地址

    User-Agent: 用户身份代理,服务器根据这个判断用户的大概信息。

    Sec-xxx-xxx: 其他信息,可能没用,可能是反扒,具体情况具体分析。

预览

Preview 是请求结果的预览。一般用来查看请求到的图片,对于抓取图片网站比较给力。

响应体

Response 是请求返回的结果。一般的内容是整个网站的源代码。如果该请求是异步请求,返回的结果内容一般是 Json 文本数据。

此数据与浏览器展示的网页可能不一致,因为浏览器是动态加载的。

2、数据来源分析

所以可以根据里面的参数在开发者工具里面进行搜索


通过结果可得 playurl 就是我们想要的数据


既然我们知道了, 数据的来源, 接下来就要分析, 这个数据包url中有那些参数是我们需要去找寻分析的…

因为我们这个只是找到一个B站视频的数据, 如果想要获取多个那肯定是需要分析的。



通过请求参数对比, 我们现在所需要找的参数就是 cid , bvid , session

同样可以直接在开发者工具里面搜索 这些参数来源 bvid 就是B站视频对应的ID

**cid / session 在网页源代码里面就可以获取的 **

3、总结

通过以上分析可得:

  1. 首先获取 cid session 这两个参数, 顺带在获取视频标题
  2. 把cid session 以及 bv号 传入数据包内
  3. 最后再获取 音频数据 以及 视频画面数据

三、代码实现步骤

可以发现, 关于python爬虫的流程思路分析, 所涉及的知识点还是比较多的。

  1. 发送请求, 对于视频详情页url地址发送请求
  2. 获取数据, 获取响应体的文本数据 response.text
  3. 解析数据, 通过正则表达式提取数据内容: 视频标题 cid session
  4. 发送请求, 对于视频内容数据包url发送请求
  5. 获取数据, 获取响应体的json字典数据 response.json()
  6. 解析数据, 通过字典键值对取值, 提取音频url 视频url
  7. 保存数据, 对于音频url 视频url发送请求 获取响应体二进制数据 response.content
  8. 合成数据, 把音频内容以及视频画面内容合成为一个完整的mp4文件

四、代码实现

1、发送请求

import requests
import re
import subprocess

headers = {
    'referer': 'https://www.****.com',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36',
}


def get_response(html_url):
    """发送请求"""
    response = requests.get(url=html_url, headers=headers)
    return response

2、获取视频标题/cid/session

def get_video_info(html_url):
    """获取 cid session 视频标题"""
    response = get_response(html_url)
    cid = re.findall('"cid":(\d+),', response.text)[0]
    session = re.findall('"session":"(.*?)"', response.text)[0]
    title = re.findall('<h1 title="(.*?)" class="video-title">', response.text)[0].replace(' ', '')
    video_info = [cid, session, title]
    return video_info

3、获取音频url/视频url

def get_video_content(cid, session, bvid):
    """获取音频内容以及视频内容"""
    index_url = 'https://api.****.com/x/player/playurl'
    data = {
        'cid': cid,
        'qn': '80',
        'type': '',
        'otype': 'json',
        'fourk': '1',
        'bvid': bvid,
        'fnver': '0',
        'fnval': '976',
        'session': session,
    }
    json_data = requests.get(url=index_url, params=data, headers=headers).json()
    audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
    video_url = json_data['data']['dash']['video'][0]['baseUrl']
    video_content = [audio_url, video_url]
    return video_content

4、保存数据

def save(name, audio_url, video_url):
    """保存数据"""
    audio_content = get_response(audio_url).content
    video_content = get_response(video_url).content
    with open(name + '.mp3', mode='wb') as a:
        a.write(audio_content)
    with open(name + '.mp4', mode='wb') as v:
        v.write(video_content)
    print(name, '保存成功')

5、合成视频

def merge_data(video_name):
    """数据的合并"""
    print('视频合成开始:', video_name)
    cmd = f"ffmpeg -i {video_name}.mp4 -i {video_name}.mp3 -c:v copy -c:a aac -strict experimental {video_name}output.mp4"
    # print(cmd)
    subprocess.run(cmd, shell=True)
    print('视频合成结束:', video_name)

好了,今天的分享就到这结束了,咱们下次见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/563056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何看待 30 岁学云计算,转行做云计算运维这件事?

作为IT培训行业的从业人员&#xff0c;30岁学云计算转行不算什么的&#xff0c;还有38岁想学云计算的呢&#xff01;最主要的是个人兴趣和意向&#xff0c;当然这个年龄阶段还会考虑的一点就是目前的收入与家庭支出的问题。不过这位38岁的“大龄”学员学习的主要目的不是说去找…

不是吧,交换机坏了你还只会这么排查?

又见面了&#xff0c;我的网工朋友 上次给你分享了交换机和路由器的对接上网配置案例&#xff0c;还记得吗&#xff1f; 今天这篇&#xff0c;和你聊聊交换机接口故障。 接口故障这件事&#xff0c;对咱们网工来说其实算是家常便饭了。 工作到现在&#xff0c;你复盘一下&a…

卷积、相关、匹配滤波、脉冲压缩以及模糊函数

文章目录 【 1. 卷积 】连续卷积离散卷积 【 2.相关 】自相关互相关 【 3.匹配滤波 】滤波器模型有色噪声 时滤波器的特性白噪声 时滤波器的特性 【 4.脉冲压缩】时域脉冲压缩频域脉冲压缩 【 5.模糊函数 】【 6.四者之间的关系 】相关和卷积之间的关系 【 7.参考文献 】 【 1.…

day10 - 使用canny算子进行人像勾勒

本期主要介绍canny算子&#xff0c;了解canny算子的流程以及各个流程的原理和实现。 ​ 完成本期内容&#xff0c;你可以&#xff1a; 了解canny算子的流程和应用 若要运行案例代码&#xff0c;你需要有&#xff1a; 操作系统&#xff1a;Ubuntu 16 以上 或者 Windows10 工…

Kubernetes(k8s)集群安装部署

一. 环境说明 名称IP系统配置主控节点192.168.136.11Rocky9.22核4G工作节点1192.168.136.12Rocky9.22核4G工作节点2192.168.136.13Rocky9.22核4G 二. 系统先决条件配置(所有节点&#xff09; 2.1 关闭防火墙 防火墙可能会导致重复的防火墙规则和破坏kube-proxy&#xff0c;…

如何编写一个测试方案?---她是这样做的!

1、背景 工作上的项目规范要求&#xff1a;测试排期大于3D的项目要编写测试方案。调研了部分同学的情况&#xff0c;在此流程规范要求的基础上&#xff0c;对于需求的逻辑复杂或技术实现复杂等情况也会准备测试方案。 我个人主要负责OMS系统测试&#xff0c;它是整个履约流转中…

HTTPS的加密技术——中间人攻击

HTTPS的加密技术 文章目录 HTTPS的加密技术认识HTTPS对称加密和非对称加密①只使用对称加密方式②只使用非对称加密③两种加密算法联合使用&#x1f9db;‍♂️中间人攻击&#x1f4d6;引入证书总结https加密技术&#x1f431;‍&#x1f464; http和 https之间相差一个字母&a…

基于springboot+mybatis-plus+mysql+vue在线考试系统

基于springbootMybatis-plusmysqlvue在线考试系统 一、系统介绍1.系统主要功能&#xff1a;2.涉及技术框架&#xff1a;3.本项目所用环境&#xff1a; 二、功能展示三、其它系统四、获取源码 一、系统介绍 1.系统主要功能&#xff1a; 权限控制 本系统存在三个不同的角色&…

Linux 提权前信息搜集

linux前期提权也是要信息搜集 linux信息搜集可以使用软件进行&#xff0c;这里写四个脚本 (我们拿到webshell或者普通用户时&#xff0c;上传第三方软件的目录应该是Linux的tmp目录&#xff0c;tmp目录是临时目录&#xff0c;每次linux重启后该目录内容就会清除&#xff0c;而…

Dubbo源码篇05---SPI神秘的面纱---使用篇

Dubbo源码篇05---SPI神秘的面纱---使用篇 引言Jdk提供的SPI机制基本流程缺陷 Dubbo的SPI机制实例演示 Dubbo VS JDK SPI 小结Adaptive自适应扩展点demo演示如何做到动态适配的 按条件批量激活扩展点小结 引言 SPI全称是Service Provider Interface&#xff0c;其中服务提供者定…

全面提升测试效率,一键实现多文件、多Sheet的WEB自动化测试!

目录 前言&#xff1a; 设计目标 框架结构 实现 总结 前言&#xff1a; 在WEB开发中&#xff0c;自动化测试框架是一个不可或缺的组件。封装一个既能支持多文件&#xff0c;又能支持多Sheet的WEB自动化框架&#xff0c;将会极大地提升我们的开发效率。下面我将会详细介绍…

GPT-4平替版:MiniGPT-4,支持图像理解和对话,现已开源

项目地址&#xff1a;https://minigpt-4.github.io/ 论文链接&#xff1a;https://github.com/Vision-CAIR/MiniGPT-4/blob/main/MiniGPT_4.pdf 代码&#xff1a;https://github.com/Vision-CAIR/MiniGPT-4 视频&#xff1a;https://youtu.be/__tftoxpBAw 数据集&#xff…

el-dialog 关闭再打开后窗口内容不刷新问题

页面中有增加和编辑两个功能,由于弹窗样式都是一样的,于是将它拆分成一个子组件,父组件把状态传给子组件,子组件根据这个状态判断是做编辑操作还是新增操作. 编辑 添加 问题一:但是这样遇到了一个问题,在编辑时&#xff0c;只有第一次点编辑时&#xff0c;回显的数据才能正确显…

大学生就业工资低,想转行IT?0基础培训班学习半年云计算出来可以就业吗?挑战高薪职业!

大学生就业工资低&#xff0c;想转行IT&#xff1f;0基础学习云计算可以就业吗&#xff1f; 大学生就业工资低&#xff0c;想转行IT&#xff1f;0基础培训班学习半年云计算出来可以就业吗&#xff1f;这是一个很常见的问题&#xff0c;也是很多大学毕业生关心的话题。根据我了解…

探索2023年海外网红营销合作方式:提升品牌曝光度的创新策略

随着社交媒体的崛起和用户对网红的追捧&#xff0c;海外网红营销已经成为品牌推广的不可忽视的一部分。在2023年&#xff0c;有7种最火爆的海外网红营销合作方式备受瞩目。本文Nox聚星将和大家一起来详细了解这7种方式&#xff0c;为品牌提供更多营销灵感和策略。 1、跨平台合作…

Codeforces Round 834 (Div. 3)

题集链接 Codeforces Round 834 A. Yes-Yes?B. Lost PermutationC. Thermostat A. Yes-Yes? Example input 12 YES esYes codeforces es se YesY esYesYesYesYesYesYe seY Yess sY o Yesoutput NO YES NO YES NO YES YES NO NO YES NO YES题意&题解&#xff1a; 其实就…

Windows环境下安装及部署Nginx教程(含多个站点部署)

目录 一、下载安装Nginx 二、部署Nginx 三、多站点部署的情况 1、nginx域名解析&#xff0c;虚拟主机&#xff1a; 四、带https的站点如何部署&#xff0c;与http的有何不同点&#xff1f; 一、下载安装Nginx 1、官网下载地址&#xff1a;https://nginx.org/en/download.h…

2022 年第四届河南省 CCPC 大学生程序设计竞赛vp补题

Dashboard - 2022 CCPC Henan Provincial Collegiate Programming Contest - Codeforces Problem B. Hash 思路&#xff1a; 发现31的次幂取模的答案&#xff0c;所以如果一段太长肯定不如拆成2段。首先如果一段长度为7,那么无论他的开头是a,eh,n的谁,都有val>31^6887503…

0基础学习VR全景平台篇第29章:场景功能-音乐解说

本期为大家带来蛙色VR平台&#xff0c;场景管理模块-音乐功能&#xff01; 功能位置示意 一、本功能将用在哪里&#xff1f; 优秀VR全景作品不仅注重视觉的体验&#xff0c;接入契合场景的背景音乐与解说&#xff1b; 可将音乐与解说进行全局播放或进行分场景播放&#xff0…

前端学习--Vue(4) 生命周期

一、组件的生命周期 一个组件从创建-运行-销毁的真个阶段&#xff0c;强调的是一个时间段 1.1 生命周期函数 1.1.1 创建 &#xff08;只执行一次&#xff09; created() 阶段任务&#xff1a;最早可以使用methods中的方法发起ajax请求获取数据&#xff0c;并将数据挂载到d…