梦想还是要有的, 万一实现了呢?

用Python获取亚马逊商品页面的m3u8格式视频

Python 拈花古佛 853℃ 0评论 繁體

上篇博客写了亚马逊产品页视频在线下载小工具:亚马逊Amazon页面产品视频在线下载方法

这里分享下底层的代码逻辑,其实用python爬虫代码(网上有m3u8视频抓取代码)即可实现,一起来看看吧。

 

用Python获取亚马逊商品页面的m3u8格式视频

打开视频页面:

https://www.amazon.com/vdp/06ef28070ddf4d40b6460b4e10918191?ref=dp_vse_rvc_0

使用浏览器抓包发现,这个视频是m3u8格式的。m3u8是苹果公司推出的视频播放标准,是m3u的一种,只是编码格式采用的是UTF-8。

用Python获取亚马逊商品页面的m3u8格式视频

找到Url:

https://m.media-amazon.com/images/S/vse-vms-transcoding-artifact-us-east-1-prod/367b6f18-ec99-49d0-b2a5-46eb032fd886/default.jobtemplate.hls.m3u8

打开内容如下:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=1070623,AVERAGE-BANDWIDTH=893710,CODECS="avc1.4d401f,mp4a.40.5",RESOLUTION=854x480,FRAME-RATE=29.970
default.jobtemplate.hls480.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1838472,AVERAGE-BANDWIDTH=1496383,CODECS="avc1.4d401f,mp4a.40.5",RESOLUTION=1280x720,FRAME-RATE=29.970
default.jobtemplate.hls720.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3698764,AVERAGE-BANDWIDTH=2984822,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=29.970
default.jobtemplate.hls1080.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=702464,AVERAGE-BANDWIDTH=587543,CODECS="avc1.77.30,mp4a.40.5",RESOLUTION=640x360,FRAME-RATE=29.970
default.jobtemplate.hls360.m3u8

可以看到它包含几种清晰度的视频:360, 480, 720, 1080.  我们选择 1080版本的m3u8文件, 把上面的url替换成1080的链接:

https://m.media-amazon.com/images/S/vse-vms-transcoding-artifact-us-east-1-prod/367b6f18-ec99-49d0-b2a5-46eb032fd886/default.jobtemplate.hls.m3u8

下载,编辑器打开如下:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:6,
default.jobtemplate.hls1080_00001.ts
#EXTINF:6,
default.jobtemplate.hls1080_00002.ts
#EXTINF:6,
default.jobtemplate.hls1080_00003.ts
#EXTINF:6,
default.jobtemplate.hls1080_00004.ts
#EXTINF:6,
default.jobtemplate.hls1080_00005.ts
#EXTINF:6,
default.jobtemplate.hls1080_00006.ts
#EXTINF:6,
default.jobtemplate.hls1080_00007.ts
#EXTINF:6,
default.jobtemplate.hls1080_00008.ts
#EXTINF:6,
default.jobtemplate.hls1080_00009.ts
#EXTINF:6,
default.jobtemplate.hls1080_00010.ts
#EXTINF:6,
default.jobtemplate.hls1080_00011.ts
#EXTINF:6,
default.jobtemplate.hls1080_00012.ts
#EXTINF:6,
default.jobtemplate.hls1080_00013.ts
#EXTINF:5,
default.jobtemplate.hls1080_00014.ts
#EXT-X-ENDLIST

m3u8 是一种又 .ts 音视频片段拼凑而成的文件,当浏览器加载 .m3u8 文件时,我们可以看到后台 ajax 是分一段一段加载的, 也就是看到哪加载到哪。

其实关于m3u8格式的视频下载,网上已经有很多教程了,也有人做出了小工具,可以直接拿过来用,也是非常卷了!这里使用【PY-GZKY】写的小教程来演示。

【PY-GZKY】的小教程链接:https://github.com/PY-GZKY/python-automation-docs/blob/master/docs/%E7%88%AC%E8%99%AB/m3u8%E9%9F%B3%E8%A7%86%E9%A2%91%E6%8B%BC%E6%8E%A5.md

下载m3u8视频的代码可以借鉴修改一下来使用,核心代码如下:

import time
import os
import requests
import re


# 查找m3u8文件中的ts路径列表
def get_ts_urls(url):
    # 请求视频页面,获取m3u8网址
    r = requests.get(url)
    data = r.text
    # 正则匹配出m3u8网址
    m3u8_urls = re.findall('"videoURL":"(.*?)"', data)
    m3u8_url = m3u8_urls[0]
    # 替换为1080
    m3u8_url = m3u8_url.replace('hls.m3u8', 'hls1080.m3u8')
    # 获取m3u8文件内容
    meu8_data = requests.get(m3u8_url).text
    # 查找ts文件的行, 并且补全成完整url链接
    url_base = m3u8_url.replace('default.jobtemplate.hls1080.m3u8', '')
    urls = []
    lines = meu8_data.split("\n")
    for line in lines:
        if line.endswith(".ts"):
            # print(line)
            urls.append(url_base + line)
    return urls


def download(ts_urls, download_path):
    if not os.path.exists(download_path):
        os.makedirs(download_path)
    for i in range(len(ts_urls)):
        ts_url = ts_urls[i]
        file_name = ts_url.split("/")[-1]
        print("开始下载 %s" % file_name)
        try:
            response = requests.get(ts_url, stream=True)
        except Exception as e:
            print("异常请求:%s" % e.args)
            return

        ts_path = download_path + "/{0}.ts".format(i)
        with open(ts_path, "wb+") as file:
            for chunk in response.iter_content(chunk_size=1024):
                if chunk:
                    file.write(chunk)
        time.sleep(.56)


def file_walker(path):
    file_list = os.listdir(path)
    # file_list.sort()
    file_list.sort(key=lambda x: int(x[:-3]))
    file_list_ = []
    for fn in file_list:
        # print(fn)
        p = str("tsfiles" + '/' + fn)
        file_list_.append(p)

    print(file_list_)
    return file_list_


def combine(ts_path, file_name):
    file_list = file_walker(ts_path)
    file_path = file_name + '.mp4'
    with open(file_path, 'wb+') as fw:
        for i in range(len(file_list)):
            fw.write(open(file_list[i], 'rb').read())


if __name__ == '__main__':
    url = 'https://www.amazon.com/vdp/06ef28070ddf4d40b6460b4e10918191?ref=dp_vse_rvc_0'
    urls = get_ts_urls(url)
    download(urls, "tsfiles")
    combine("tsfiles", "toys")

依次下载的ts文件,都是一个个几秒的小视频文件

几秒的小视频文件

之后使用combine()函数对这些ts文件进行合并,得到一个mp4文件,如下图所示:

用Python获取亚马逊商品页面的m3u8格式视频

转载请注明:拈花古佛 » 用Python获取亚马逊商品页面的m3u8格式视频

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址