翼度科技»论坛 编程开发 python 查看内容

使用Python采集某网站视频,实现音视频自动合成!

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
 

一、准备一下

开发环境
  1. Pycharm
  2. python 3.8
  3. ffmpeg
复制代码
模块的使用
  1. requests
  2. re
  3. subprocess
复制代码
二、基本思路流程

1、明确需求

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

  • 鼠标右键点击检查选择Network
  • F12
  • 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详情:
  1. 请求头
复制代码
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、总结

通过以上分析可得:

  • 首先获取 cid session 这两个参数, 顺带在获取视频标题
  • 把cid session 以及 bv号 传入数据包内
  • 最后再获取 音频数据 以及 视频画面数据
三、代码实现步骤

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

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

1、发送请求
  1. import requests
  2. import re
  3. import subprocess
  4. headers = {
  5.     'referer': 'https://www.bilibili.com',
  6.     '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',
  7. }
  8. def get_response(html_url):
  9.     """发送请求"""
  10. # 完整源码+视频讲解 都放在这个扣裙了 708525271
  11.     response = requests.get(url=html_url, headers=headers)
  12.     return response
复制代码
 
2、获取视频标题/cid/session
  1. def get_video_info(html_url):
  2.     """获取 cid session 视频标题"""
  3.     response = get_response(html_url)
  4.     cid = re.findall('"cid":(\d+),', response.text)[0]
  5.     session = re.findall('"session":"(.*?)"', response.text)[0]
  6.     title = re.findall('<h1 title="(.*?)" >', response.text)[0].replace(' ', '')
  7.     video_info = [cid, session, title]
  8.     return video_info
复制代码
 
3、获取音频url/视频url
  1. def get_video_content(cid, session, bvid):
  2.     """获取音频内容以及视频内容"""
  3.     index_url = 'https://api.bilibili.com/x/player/playurl'
  4.     data = {
  5.         'cid': cid,
  6.         'qn': '80',
  7.         'type': '',
  8.         'otype': 'json',
  9.         'fourk': '1',
  10.         'bvid': bvid,
  11.         'fnver': '0',
  12.         'fnval': '976',
  13.         'session': session,
  14.     }
  15.     json_data = requests.get(url=index_url, params=data, headers=headers).json()
  16.     audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
  17.     video_url = json_data['data']['dash']['video'][0]['baseUrl']
  18.     video_content = [audio_url, video_url]
  19.     return video_content
复制代码
 
4、保存数据
  1. def save(name, audio_url, video_url):
  2.     """保存数据"""
  3.     audio_content = get_response(audio_url).content
  4.     video_content = get_response(video_url).content
  5.     with open(name + '.mp3', mode='wb') as a:
  6.         a.write(audio_content)
  7.     with open(name + '.mp4', mode='wb') as v:
  8.         v.write(video_content)
  9.     print(name, '保存成功')
复制代码
 
5、合成视频
  1. def merge_data(video_name):
  2.     """数据的合并"""
  3.     print('视频合成开始:', video_name)
  4.     cmd = f"ffmpeg -i {video_name}.mp4 -i {video_name}.mp3 -c:v copy -c:a aac -strict experimental {video_name}output.mp4"
  5.     # print(cmd)
  6.     subprocess.run(cmd, shell=True)
  7.     print('视频合成结束:', video_name)
复制代码
 
好了,今天的分享就到这结束了,咱们下次见!

来源:https://www.cnblogs.com/hahaa/p/17428275.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具