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

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

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

一、准备一下

开发环境

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)

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值