使用网络爬虫爬取视频

  学习网络爬虫有一定的时间了,但都仅限于爬取文字信息或者说是图片,还未爬取过一些流文件,这几天想试试从某个网站上爬取视频文件,折腾了一个下午总算是搞好了。

一. 以 m3u8 与 ts 的方式传输的视频文件

  通过 m3u8 的方式合成视频的组件有三个部分,首先是 .m3u8 文件,这个文件就像是一个将军,指挥不同的 .ts 文件按照其命名进行有序地结合,其次是 .ts 文件,就像是一个个士卒,装载着视频的主要部分,而最后的 key 文件则像是士卒的身份,在加密情况下无法解开每一个 .ts 文件格式的内容,因此需要使用key来进行解码。

1.1 获取 m3u8 文件

  首先还是要分析网页信息,受朋友委托就以 jable.tv 网站为例,首先打开想要爬取的视频所在的网页,按下 F12 分析网络元素,点击network来到图(1-1-1)所示的界面,对于这个网页的一系列元素,最值得关注的是它发送视频的形式,即 .m3u8 文件,这里通过直接访问这个网页浏览器就可以将 .m3u8 文件下载下来,将该文件放到想要生成视频的文件目录下。

图(1-1-1)

1.2 获取 .ts 文件

  接下来便是要通过 requests.get 函数来获取这一系列的 .ts 文件了,url 的开头与 .m3u8 的 url 开头类似,这里可以参考图(1-1-1)所示的右半部分的 Request URL,它们怎么请求我们就跟着怎么请求,对于每一个 .ts 文件,我们将原来的 .m3u8 的最后一部分:/18201.m3u8 更改为 /18201x.ts 即可获取相对应的文件了,这里的 x 是需要在 .m3u8 文件中查看的,对于这一部影片而言可以由图(1-2-1)看出,它的 x 是从0开始一直到1817即发出请求的 url 最后一部分是从 /182010.ts 按照从小到大一直到 /182011817.ts 因此便可以通过循环来不断获取这些 .ts 文件片段。

图(1-2-1)

  但仅仅在 get 中写下目标网址的 url 仍然无法获取我们想要的内容,第一个原因是这个网站是一个外网,无法通过国内的有效途径进行访问,这时候就需要科学上网,但对于我自己而言,仅仅通过科学上网仍然会收获一个 ProxyError: HTTPSConnectionPool... ,第二个原因是没有添加请求头导致会返回403,因此需要对函数进行一些设置,局部代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from tqdm import tqdm
import requests

proxies = {
'http': '127.0.0.1:1080',
'https': '127.0.0.1:1080'
} # 如果是使用本地的科学上网软件进行的就这样设置代理

def get_ts_seq():
headers = {
"authority": "asutin-billion.mushroomtrack.com",
"method": "GET",
"scheme": "https",
"accept": "*/*",
"accept-encoding": "gzip, deflate, br",
'accept-language': "zh-CN,zh;q=0.9,en-US;q =0.8,en;q=0.7",
"origin": "https://jable.tv",
"referer": "https://jable.tv/",
"sec-ch-ua": '".Not/A)Brand";v="99","Google Chrome";v="103","Chromium";v="103"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
"user-agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}
for i in tqdm(range(0, 1818), desc='trying to get the ts'):
url = f'https://master-piece.alonestreaming.com/hls/byXOfDRH1PCfgEDy05eZmQ/1656697252/18000/18201/18201{i}.ts'
res = requests.get(url=url, headers=headers, proxies=proxies)
data = res.content
with open(f'./MIAA-465/18201{i}.ts', 'ab+') as f: # 这里保存的文件名格式一定要与m3u8中的一样,如182011817.ts
f.write(data)
代码(1-2-2)

1.3 获取key文件

  key 文件的位置是在 .m3u8 文件中能够获取的,如图(1-3-1)可以看到 key 中的 URI 文件也是以 .ts 为后缀,将类似于代码(1-2-2)所示的那样 url 的后部分由/18201{i}.ts 更改为图(1-3-1)中的URI 28c4a1a4c547a9ae.ts ,并将其直接复制到网页上访问即可让浏览器下载 key 文件,将该文件放到同 .m3u8 的文件目录下。这样便总共有了 .m3u8 文件,.ts 文件和 key 文件。

图(1-3-1)

1.4 使用ffmpeg合成视频

  当一切都准备就绪的情况下通过 ffmpeg 合成这三种文件,得到最后的 .mp4 文件,这里的 {m3u8filename} 是之前通过代码得到的 .m3u8 文件名,{videoname} 则是想要为视频命的名字

ffmpeg -allowed_extensions ALL -i {m3u8filename} -c copy {videoname}.mp4

  • Copyrights © 2022 Tanthen

请我喝杯咖啡吧~

支付宝
微信