为求实用,提高以后用python下载视频资料的效率,增强下载视频相关知识点在脑海里的可得性,特此记录
此文章会不定时更新,完善
下载与使用
使用
优点
可在终端(cmd)执行,一行代码就是快
下载音乐,短视频极其便捷
实测结果是30个视屏只有9个完整下来了,个中原因先按下不表
you-get https://v.youku.com/v_show/id_XMzk4NDE2Njc4OA==.html?firsttime=0
必要依赖
ffmpeg
用于视频音频合成
指令
选项 | 说明 | 是否使用过 |
---|---|---|
-i | 显示资源信息,比如说格式、清晰度、大小等 | √ |
-u | 指定下载或查看的url,有时候可以省略-u直接加上url | |
-o | 设置输出文件夹,即保存路径,若不指定,则保存在当前工作目录 | √ |
-O | 设置文件名,可采用默认文件名 | √ |
-f | 强制覆盖已存在的文件 | |
-l | 优先下载整个列表 | |
-P | 使用密码(若访问视频需要密码) | |
-t | 设置超时时间,单位是秒 | |
-c | 使用cookie,加载cookies.txt 或者cookies.sqlite |
缺点
可支持平台有限,但不少,主要有b站,优酷视频,豆瓣,网易云,爱奇艺,酷狗
小结
you-get实用、小巧、实用性强,以最小的时间成本获取视频。但功能单一,可操作空间不高,用作一般性的视频下载工具很适合,爬取电影类的视频文件不适合
方向
利用you-get的
便捷可制作简单使用用户交互界面程序
也可进一步代码编写重复下载特定目标
首先要搞清楚url到底是点进去就是MP4的直接url还是一个包含播放地址间接的url
像这种就是直接的url
https://www.bilibili.com/video/BV17o4y1976Q?p=2
像这种就是间接的url
一个错误示范是这样的
import requests
headers = { # 模拟浏览器身份头向对方发送消息
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
for i in range(142):
url = "https://www.bilibili.com/video/BV17o4y1976Q?p=%s"%i
content = requests.get(url,headers=headers).content
with open("D:/base/%s.mp4"%i,"ab") as fp:
fp.write(content)
print("正在下载%s"%i)
这里就把间接的url当做直接的url来使用了,结果当然会出错,下出来文件也是打不开的
改成
import requests
headers = { # 模拟浏览器身份头向对方发送消息
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
url = "http://ggkkmuup9wuugp6ep8d.exp.bcevod.com/mda-km671xd58s1yy16y/mda-km671xd58s1yy16y.mp4"
content = requests.get(url,headers=headers).content
with open("D:/base/s.mp4","ab") as fp:
fp.write(content)
print("正在下载s")
就可以下载成功了
还有一种方法
with open('D:/base/test.mp4', "wb") as mp4:
for chunk in r.iter_content(chunk_size=1024 * 1024):
if chunk:
mp4.write(chunk)
这也是可以下载的,这其中涉及的知识先按下不表
要想使用requests库不需要直接url仅用间接url来下载视屏是不可能的,所有下载视频的代码不管它看起来有多花里胡哨,最重要的就是两步:找到直接url和下载
为了顺利下载,难免会需要比较繁琐的其他手段如断点续传,file.flush()
只要搞懂了爬取视屏的本质,那么做起来就是水到渠成了
以某电影网站为例
在network找到js文件,其名称末尾是有序排序没有反爬手段,可以直接循环下载(这就是找到直接的url下载,上文第一个错误案例就是与本案例的做法混淆了)
涉及到的原理也有上面提到的断点续传
在HTTP协议中,Content-Length用于描述HTTP消息实体的传输长度the transfer-length of the message-body。
几行代码就可以
import requests
from urllib3.exceptions import InsecureRequestWarning
from urllib3 import disable_warnings
disable_warnings(InsecureRequestWarning) # https问题的报错
print("开始下载!")
for i in range(1712):
url = "url%s.ts" % i
ret = requests.get(url,verify=False).content
with open( r"D:/base/白日夢想家4.mp4","ab") as f:
f.write(ret)
print("第%d个ts文件已写入"%i)
print("下载完毕!")
优点
没啥优点,就是能下载这件事本身稍微让人开心一点
使用you-get不能下载电影,而这个方法至少能做到
缺点
上述寥寥代码下载速度极慢,使用线程池、多线程知识或许能提高速度(此项待办),否则没有实用性
小结
不是所有网站都这么好爬,很少能使用这个方法,就算能用
速度也很慢
就算你会提高速度方法
学这种方法本身也耗时间,可能大于你获取电影的意义
如果这两个问题都不是问题,比如学习多线程、线程池甚至代理 本来就是学爬虫应知应会的,获取电影对自己很重要本人有电影收集爱好的,那么可以尝试学习更多
ps:实用第一,目前我多线程等知识掌握不充分,也没有特别要爬取电影的需求,既然如此,不如选择去学习实用性更强而且可以跳过多线程学习的scapy,学会以scrapy框架下载文字图片视频,还有selenium,这样性价比会大于单纯为下载电影而学习的方向
个中逻辑还需要时间来清晰化
js文件跟上面一个情况不一样,似乎是加密编码过的,略略查找没能解决,暂且搁置,日后补充
略
不必多言
能用python下载视频或电影是我一直以来学习的动力之一,我希望这种方式能给我带来诸多益处,当然学习过程中逐渐发现这个目标在软件众多,网络发达的今天根本不算什么。随随便便都有很多种方法能替代python的功能,但这么想就局限了自己的视野。