python爬虫实战案例——某站视频爬虫

前言

今天突然发现,某站的视频在电脑上是不能下载的。于是乎,就打算在电脑上爬取一下某站的视频。让大家在电脑上也能看,

准备

某站的视频是音频和视频分开的,我在网上搜了一下,要用到一个叫ffmpeg的音视频合成的库,网上教程很多,大家搜一下就可以找到了,我就不在此赘述了。

开始正题

还是老规矩——抓包。对某站进行抓包,非常幸运,某站还是很和蔼可亲的并没有对视频进行加密,一下就可以找到视频链接。

74e74b71c152463fb485b4254aac9aa5.png

 大家记得点一下左下角的格式化,不然并不能一眼就看到视频链接。

在这里我踩坑了,因为这里的视频链接实在是太多了

7f3dd749e5d949ad9f96771dde46f3ab.png

于是乎我刚开始是有点不确定这是不是我要找的视频的链接的,那验证这个链接的最好的办法是什么?没错,就是复制这个链接,然会在搜索栏搜索一下。但是这个链接是搜索不到任何东西的,这也正是我踩的坑。 当时我就直接把这个数据包给丢了,去找别的数据包了,不找还好,一找我就开始捉摸是不是某站加密了,(因为是自学爬虫,最近刚好学到js解密,觉得很有意思,所以一到找不到数据包的时候,满脑子就是被加密了。狗头保命)怎么找不到视频链接。

然后,后面实在是没找着,只能上网搜索大佬们的文章了。然后一看,满脸不可置信,这个链接明明什么都搜不到啊。于是,带着不屑的表情,看戏的心理(狗头保命),把大佬们的代码复制粘贴,看看能不能下载下来视频。哎哟我去,还真下下来了,用的就是我丢掉的那个数据包的第一个url。于是我又把这链接放到浏览器搜索了一遍,还是什么都搜不到,但是它确实可以下载下来视频。到现在我还是没搞清楚是怎么回事,希望有大佬可以给我解答一下。但是我明白了,以后要是再碰到这种链接,直接上代码干它就完了(狗头保命)。

然后,就到了Ctrl+C和Ctrl+V的环节了。开玩笑的,然后就到了敲代码的环节了。前面的请求的部分其实都是一样的。

# url = input("视频链:")
url = 'https://www.bilibili.com/video/BV1614y1z7yr/?spm_id_from=333.1007.tianma.8-4-30.click&vd_source=19577052a287f6b91b30d9f7ecbda428'
# def get_proxy():
#     json_data = requests.get("http://demo.spiderpy.cn/get/").json()
#     proxies = {
#         'http' : 'http://{}'.format(json_data['proxy']),
#         'https' : 'https://{}'.format(json_data['proxy'])
#     }
#     return proxies
headers = {
    'referer': 'https://www.bilibili.com/',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.42'
}
response = requests.get(url=url, headers=headers)

大家要用的话直接注释掉url,然后把url=input点亮就可以了,然后直接输入你要下载视频的链接。然后哪个更get_proxy方法是简单的说就是获取IP地址的,github上的一个代理池项目,因为我很怕会查封我的ip,毕竟爬虫学的好,牢饭少不了,虽然我学的不好(狗头保命)。就是一个反爬参数,但有时候获取的是国外的ip,但是请求不到数据,我就注释掉了。然后就是headers里面的参数,referer一定要带上,你得告诉它你是从某站来的,后面请求视频的时候才能请求得到,不然是请求不到视频的。可能是我在搜索链接的时候没有加上这个,所以我搜索不到,等下再去搜一下链接看看。

然后请求数据做完以后,我又和视频清晰度杠上了,还是因为有那么多的链接,我想搞清楚哪个链接哪个清晰度的视频,最后找了好久,也没有找出哪里是视频清晰度的标识。于是索性我把前面几个链接的视频全部请求下来了,得到的区别如下图

66c603427ea14fce984a8bae3dd64f1a.png

这个数据速率和总比特率是个啥,我也不知道,但文件最大的就是最清晰的(狗头保命)。总体看下来,前面那个width和height一样的链接,请求到的视频的清晰度都是最好的,且视频清晰度区别不大,至少我肉眼是分不出来的。 

接下来就是对数据进行解析了

ex1 = '<title data-vue-meta="true">(.*?)_.*?</title>'
ex2 = '<script>window.__playinfo__=(.*?)</script>'
title = re.findall(ex1, response.text, re.S)[0]
data = re.findall(ex2, response.text, re.S)
for i in title:
    if (i in "[\/:*?<>|]"):
        title = title.replace(i, '')
json_data = json.loads(data[0])
video_url = json_data['data']['dash']['video'][0]['baseUrl']
audio_url = json_data['data']['dash']['audio'][0]['baseUrl']

video_cotent = requests.get(url=video_url, headers=headers).content
audio_cotent = requests.get(url=audio_url, headers=headers).content

两个正则表达式,一个获取视频的标题,一个获取视频和音频。一个for循环,去掉存在保存为文件名会报错的标点符号,就是要符合windows的文件命名规范,然后将包含视频、音频链接的文本json化,这样我们可以得到一个字典,可以根据键来取得链接,当然这种转化数据是要分情况的,正好这里可以这么做。然后就是套娃,一层一层的通过键来获取我们想要的值,得到我们的视频和音频链接。

最后,就是以二进制文件保存,视频和音频了,我这里统统保存为了mp4和mp3了。有其他格式需求的小伙伴,可以进行更改,最后保存。

with open(title + '.mp4', 'wb') as f :
    f.write(video_cotent)
with open(title + '.mp3', 'wb') as f :
    f.write(audio_cotent)

d3735172cbc64ddfb68eba6a1f1d0438.png

到这里就全部结束了。

踩坑总结 

第一点

第就是链接在浏览器搜索栏搜索不到东西,但是用代码可以请求到视频,可能是没有带上referer里面的参数。

第二点

就是视频的清晰度,只要是width和hright参数值相同的链接,视频清晰度就相差不到,还有就是排在最前面的链接,基本上就是这个视频的最高分辨率的请求链接了。

此文章仅用于学习,请勿用于违法犯罪。

猜你喜欢

转载自blog.csdn.net/qq_64241302/article/details/132245825
今日推荐