【Python学习】网络爬虫-爬取斗鱼车模视频
一、实现目标
爬取斗鱼车模视频,目标地址:“https://v.douyu.com/show/2Bj8vGmyG9eMObnd”
二、实现步骤
2.1 网页分析
使用google浏览器访问视频地址,右键打开检查,选择network功能,通过观察我们发现,在视频播放的过程中出现了大量的前缀为transcode的请求,检查其Content-Type参数值为
video/mp2t,它对应的是一种扩展名为.ts的视频格式,很多视频网站为了反爬和提高网站速度,将完整的视频文件拆分成很多个.ts格的片段进行传输,这些片段就是我们要爬取的内容。
下面我们先来验证一下我们的猜测是否正确。这些transcode请求都是get方法,我们复制一个url地址到浏览器中进行访问。
可以看到有.ts的文件被下载,用播放器进行播放,确实是我们想要爬取的视频,但时长只有10s钟,说明有多个.ts需要下载。
我们截取几个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格式,这种格式不常用,该如何将它转化为其它常用的格式呢?二是这次我们只爬取了一个视频,如何批量爬取视频呢?我们下次再研究。
更多推荐
所有评论(0)