知识点拾遗二(下载视频)

前言

为求实用,提高以后用python下载视频资料的效率,增强下载视频相关知识点在脑海里的可得性,特此记录
此文章会不定时更新,完善

下载视频

方法一----->you-get

下载与使用
使用
优点
可在终端(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加pycharm

方向
利用you-get的
便捷可制作简单使用用户交互界面程序
也可进一步代码编写重复下载特定目标

方法三------->代码实现

下视屏

首先要搞清楚url到底是点进去就是MP4的直接url还是一个包含播放地址间接的url
知识点拾遗二(下载视频)_第1张图片
像这种就是直接的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文件跟上面一个情况不一样,似乎是加密编码过的,略略查找没能解决,暂且搁置,日后补充

方法四----------->scrapy下载

另关于视频处理及其强大的软件

格式工厂

不必多言

总结

能用python下载视频或电影是我一直以来学习的动力之一,我希望这种方式能给我带来诸多益处,当然学习过程中逐渐发现这个目标在软件众多,网络发达的今天根本不算什么。随随便便都有很多种方法能替代python的功能,但这么想就局限了自己的视野。

你可能感兴趣的:(知识点拾遗)