admin 管理员组

文章数量: 887016

环境使用

Python 3.10

Pycharm

模块使用

requests -> pip install requests

tqdm -> pip install tqdm (进度条)

re (内置模块无需安装)

实现的基本流程

一、数据来源分析

1.明确需求

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

网址:https://v.qq/x/cover/mzc002006n62s11/e0045s2g2eg.html

数据: 视频内容

2.抓包分析

通过浏览器开发者工具分析对应的数据位置

  • 打开开发者工具
  • F12 / 右键点击检查选择 network (网络)
  • 刷新网页,让本网页的数据内容重新加载一遍通过关键字搜索找到对应数据位置关键字: m3u8进行搜索查找数据位置

二、关于视频数据抓包分析

开发者工具 -> 网络 -> 媒体 -> 查看到对应视频链接地址

  • 再以链接中一段参数为了关键字进行搜索

  •  开发者工具 -> 网络 -> 媒体 -> 并没有发现视频链接地址
  • 开发者工具 -> 网络 -> 全部数据 -> 某些特定链接地址 (xxx.ts)
  • 关键字就以m3u8进行搜索查找把完整的视频内容, 分割成N个是片段(ts链接), 所有视频片段都存在于m3u8文件中。

三、代码实现

1.发送请求

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

import requests

headers = {
    # Referer 防盗链, 告诉服务器请求网址是从哪里跳转过来
    'Referer':'https://v.qq/', # 一般情况如果你遇到403加防盗链大概率是可以的
    # User-Agent 用户代理, 表示浏览器基本身份信息
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
}
# 请求网址
url = 'https://vd6.l.qq/proxyhttp'
# 请求参数 -> 在载荷中查看, 复制
data = {"buid":"vinfoad","vinfoparam":"charge=0&otype=ojson&defnpayver=3&spau=1&spaudio=0&spwm=1&sphls=2&host=v.qq&refer=https%3A%2F%2Fv.qq%2Fx%2Fcover%2Fmzc002006n62s11%2Fe0045s2g2eg.html&ehost=https%3A%2F%2Fv.qq%2Fx%2Fcover%2Fmzc002006n62s11%2Fe0045s2g2eg.html&sphttps=1&encryptVer=9.2&cKey=HMA-vbjiFyK1Ec1Orq2-LnCjnpb8Ocr0cPTfUqfkzEul_f4vOWcoUWJPdcrTurI9OVZAhBMNww1zG4LVGCTZlxo--_XGuZWLjvmpaTXWr2DNOLGAi4iBp92IyLg1odaG2EOurYMK5cQlWCKh6cqchEKDlC2uGzpCCamWfdlZnHB5x6wVJHKsVyf3svRoLvLp4yt5irIvBazTFI6kgUfxQ5MnT7j4qesbrCL5VQPx4hGv33Guy43cmhPLzWjhmAnOh8iWGOKJuIo0jEavue89vusorlzYe0OzgNvu_Fk_WpRgKdae4Yqh86r6hqO9qJwRPIMtjKc7vYT5bP-4i5Rg39FWzYO9drUOOqKqau8Y2MburhYEIDwKwa5SfDsioUEnWuZhdeYdLLA5mNUns78dhvK1O4ua7pu75QWa3oF0j49T2sDFNVPH1vPw4nz9tvBNJbzupHWZQKdEF1Bj9WKL01IUo6vW7UbQeBaOU82fHoEAgficbwMDAyjmDfU&clip=4&guid=4fb545818ef7b591&flowid=f41ae8955abaeded54cf6915285737bd&platform=10201&sdtfrom=v1010&appVer=1.33.12&unid=&auth_from=&auth_ext=&vid=e0045s2g2eg&defn=fhd&fhdswitch=0&dtype=3&spsrt=2&tm=1721133622&lang_code=0&logintoken=%7B%22access_token%22%3A%2249DD5A44977B0D20A8C5030DCEE37C7C%22%2C%22appid%22%3A%22101483052%22%2C%22vusession%22%3A%22buEyP-v7IrAK9bgvcYBnYA.M%22%2C%22openid%22%3A%229C153705A16E637894823004F0EBF065%22%2C%22vuserid%22%3A%22532219188%22%2C%22video_guid%22%3A%224fb545818ef7b591%22%2C%22main_login%22%3A%22qq%22%7D&spvvpay=1&spadseg=3&spav1=15&hevclv=28&spsfrhdr=0&spvideo=0&spm3u8tag=67&spmasterm3u8=3&drm=40","sspAdParam":"{\"ad_scene\":1,\"pre_ad_params\":{\"ad_scene\":1,\"user_type\":2,\"video\":{\"base\":{\"vid\":\"e0045s2g2eg\",\"cid\":\"mzc002006n62s11\"},\"is_live\":false,\"type_id\":3,\"referer\":\"\",\"url\":\"https://v.qq/x/cover/mzc002006n62s11/e0045s2g2eg.html\",\"flow_id\":\"f41ae8955abaeded54cf6915285737bd\",\"refresh_id\":\"f9eee59130c2fd401e981f7be0631b7e_1721133046\",\"fmt\":\"fhd\"},\"platform\":{\"guid\":\"4fb545818ef7b591\",\"channel_id\":0,\"site\":\"web\",\"platform\":\"in\",\"from\":0,\"device\":\"pc\",\"play_platform\":10201,\"pv_tag\":\"\",\"support_click_scan_integration\":true},\"player\":{\"version\":\"1.33.10\",\"plugin\":\"3.5.15\",\"switch\":1,\"play_type\":\"0\"},\"token\":{\"type\":1,\"vuid\":532219188,\"vuser_session\":\"buEyP-v7IrAK9bgvcYBnYA.M\",\"app_id\":\"101483052\",\"open_id\":\"9C153705A16E637894823004F0EBF065\",\"access_token\":\"49DD5A44977B0D20A8C5030DCEE37C7C\"},\"req_extra_info\":{\"now_timestamp_s\":1721133622,\"ad_frequency_control_time_list\":{\"full_pause_short_vip\":{\"ad_frequency_control_time_list\":[1721129198]},\"full_pause_short_bid_forbid_cid\":{\"ad_frequency_control_time_list\":[1721133161]},\"full_pause_short_bid_forbid_vid\":{\"ad_frequency_control_time_list\":[1721133161]},\"full_pause_short_vip_bid\":{\"ad_frequency_control_time_list\":[1721133161]}}},\"extra_info\":{}}}","adparam":"adType=preAd&vid=e0045s2g2eg&sspKey=poje"}
# 发送请求 -> 请求方法根据网站
response = requests.post(url=url, json=data, headers=headers)
2.获取数据

获取服务器返回响应数据

# 获取响应的json数据
json_data = response.json()
3.解析数据

提取我们需要的数据内容简单使用正则

# 根据字典取值(键值对取值)
vinfo = json_data['vinfo']
# 把json字符串转成json字典数据
info_json = json.loads(vinfo)
# 提取m3u8链接地址vl
m3u8_url = info_json['vl']['vi'][0]['ul']['ui'][-1]['url']
print(m3u8_url)
4.保存数据

把视频内容保存本地文件结合本案例具体步骤
第一次请求: 获取m3u8链接
发送请求: 请求网址 -> https://vd6.l.qq/proxyhttp (包含了m3u8链接)
获取数据: 获取服务器返回响应数据
解析数据: 提取我们需要m3u8链接地址第二次请求: 获取所有ts链接 (视频片段)
发送请求: 请求网址 -> m3u8链接 (包含了所有视频片段)
获取数据: 获取服务器返回响应数据解析数据: 提取我们需要 ts链接地址
第三次请求: 获取所有视频片段内容
发送请求: 请求网址 -> ts链接地址获取数据: 获取视频内容
保存数据: 把所有片段内容进行保存并且合并成一个完整的视频内容

第二次发送请求获取数据

"""2.1 发送请求 2.2 获取数据"""
m3u8 = requests.get(url=m3u8_url, headers=headers).text
"""2.3 解析数据"""
# 提取所有ts链接地址
ts_list = re.findall(',\n(.*?)\n#', m3u8)
ts_name = '/'.join(m3u8_url.split('/')[:-1]) + '/'
for循环遍历, 提取列表里面的元素
for ts in tqdm(ts_list):
    # 拼接完整的ts视频链接地址
    ts_url = ts_name + ts

第三次

"""3.1 发送请求 3.2获取数据"""
# 获取视频片段内容
ts_content = requests.get(url=ts_url, headers=headers).content
# 数据保存
with open('video\\练气十万年01话.mp4', mode='ab') as f:
    # 写入数据
    f.write(ts_content)

这就是下载到的电影了

本文标签: 腾讯 视频 python