一、实现目标

        爬取斗鱼车模视频,目标地址:“https://v.douyu.com/show/2Bj8vGmyG9eMObnd

二、实现步骤

2.1 网页分析

        使用google浏览器访问视频地址,右键打开检查,选择network功能,通过观察我们发现,在视频播放的过程中出现了大量的前缀为transcode的请求,检查其Content-Type参数值为

video/mp2t,它对应的是一种扩展名为.ts的视频格式,很多视频网站为了反爬和提高网站速度,将完整的视频文件拆分成很多个.ts格的片段进行传输,这些片段就是我们要爬取的内容。

斗鱼车模视频网页分析1

        下面我们先来验证一下我们的猜测是否正确。这些transcode请求都是get方法,我们复制一个url地址到浏览器中进行访问。

斗鱼车模视频网页分析2

        可以看到有.ts的文件被下载,用播放器进行播放,确实是我们想要爬取的视频,但时长只有10s钟,说明有多个.ts需要下载。

斗鱼车模视频网页分析3

         我们截取几个url请求分析可以发现,url中只有"xxx.ts"这一段有区别,它是视频片段的编号,其它参数完全一样,那么我们只需要处理好这个编号,就可以将所有的片段全部下载下来,再进行合并就可以了。

斗鱼车模视频地址分析

2.2 网页请求

        我们先使用如下代码进行一下测试,下载0000001视频片段。

# 使用import导入requests模块
import requests 

# 将User-Agent以字典键对形式赋值给headers
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"}

i = 1
# 可以使用str.format()方法对数字进行补零,将0格式化为0000000。
number = "{:0>7}".format(i)
print(number)
# 定义url
url = f"https://play-tx-ugcpub.douyucdn2.cn/live/high_35942477020210527143254-upload-60a9/transcode_35942477020210527143254-upload-60a9_121264_{number}.ts?cdn=tx&ct=web&d=609aeedb30ff6eb10d5118ca00081701&exper=0&nlimit=5&pt=2&sign=aa0b7e96f564d23d0e43ccc9085a49f5&tlink=6692b5b3&tplay=66934253&u=0&us=609aeedb30ff6eb10d5118ca00081701&vid=21455483"
print(url)
# 使用get()函数请求链接,并且带上headers,赋值给response
res = requests.get(url, headers=headers)
# 获取返回状态
stauts = res.status_code
print(stauts)

        执行状态为200,说明执行没有问题。 

斗鱼车模视频请求

        接下来我们需要爬取所有的视频片段,由于我们不清楚最后个视频片段的编号,我们需要用一个while循环,循环从0开始,当响应状态不是200的时候,我们结束循环,代码如下。

# 初始化变量
i = 0

# 设置一个标志,用于模拟do-while的行为
while_flag = True
 
while while_flag:
    # 可以使用str.format()方法对数字进行补零,将0格式化为0000000。
    number = "{:0>7}".format(i)
    # 定义url
    url = f"https://play-tx-ugcpub.douyucdn2.cn/live/high_35942477020210527143254-upload-60a9/transcode_35942477020210527143254-upload-60a9_121264_{number}.ts?cdn=tx&ct=web&d=609aeedb30ff6eb10d5118ca00081701&exper=0&nlimit=5&pt=2&sign=aa0b7e96f564d23d0e43ccc9085a49f5&tlink=6692b5b3&tplay=66934253&u=0&us=609aeedb30ff6eb10d5118ca00081701&vid=21455483"

    # 使用get()函数请求链接,并且带上headers,赋值给response
    response = requests.get(url, headers=headers)
    # 获取返回状态
    stauts = response.status_code
    print(stauts)
    i += 1
    # 判断响应状态是否为200,如果不是,将while_flag设置为False,结束循环
    if stauts != 200:
        while_flag = False

        执行一下看看效果,循环可以正常结束。

测试循环效果

 2.3 保存数据

        使用with open保存数据,mode参数选择"ab",表示追加写入二进制数据。

with open("D:/学习资料/Python/stest/斗鱼模特.ts","ab") as fp:
            # 写入二进制响应数据
            fp.write(response.content)
        print(f"{number}下载保存完成!")

        执行一下看看效果

        下载的视频时长与原视频时长一致。

斗鱼车模

        最后对代码稍加优化

# 使用import导入requests模块
import requests 

# 将User-Agent以字典键对形式赋值给headers
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"}

def get_douyu(i):
    # 可以使用str.format()方法对数字进行补零,将0格式化为0000000。
    number = "{:0>7}".format(i)
    # 定义url
    url = f"https://play-tx-ugcpub.douyucdn2.cn/live/high_35942477020210527143254-upload-60a9/transcode_35942477020210527143254-upload-60a9_121264_{number}.ts?cdn=tx&ct=web&d=609aeedb30ff6eb10d5118ca00081701&exper=0&nlimit=5&pt=2&sign=aa0b7e96f564d23d0e43ccc9085a49f5&tlink=6692b5b3&tplay=66934253&u=0&us=609aeedb30ff6eb10d5118ca00081701&vid=21455483"

    # 使用get()函数请求链接,并且带上headers,赋值给response
    response = requests.get(url, headers=headers)
    # 获取返回状态
    
    return response

# 初始化变量
i = 0

# 设置一个标志,用于模拟do-while的行为
while_flag = True
 
while while_flag:
    # 调用网页请求
    response = get_douyu(i)
    # 获取返回状态
    stauts = response.status_code
    # 获取二进制返回值
    content = response.content

    i += 1
    # 判断响应状态是否为200,如果不是,将while_flag设置为False,结束循环
    if stauts != 200:
        while_flag = False
    # 如果响应状态是否为200,则保存视频片段
    else:
        with open("D:/学习资料/Python/stest/斗鱼模特.ts","ab") as fp:
            # 写入二进制响应数据
            fp.write(content)
        print(f"{i}下载保存完成!")
print("结束下载")

三、总结

        在本实例中,我们成功的爬取斗鱼车模视频,但是有两个问题,一是我们获得的视频格式是.ts格式,这种格式不常用,该如何将它转化为其它常用的格式呢?二是这次我们只爬取了一个视频,如何批量爬取视频呢?我们下次再研究。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐