前言

为求实用,提高以后用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

url都知道是资源地址,但一个视屏的url有很多模样,它们有着不同的意义。关于url详解请见这里
以.mp4为结尾的url

http://ggkkmuup9wuugp6ep8d.exp.bcevod.com/mda-km671xd58s1yy16y/mda-km671xd58s1yy16y.mp4

这是一个典型例子,它包含了协议名、域名、虚拟目录然后还有.mp4,

得到这样的链接可以就直接下载了

先点开这个链接看看是不是能直接播放,结果显示这样

然后用以下两个方法
法一:

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).contentwith open("D:/base/%s.mp4"%i,"ab") as fp:fp.write(content)print("正在下载s")

法二:

open('D:/base/test.mp4', "wb") as mp4:for chunk in r.iter_content(chunk_size=1024 * 1024):if chunk:mp4.write(chunk)

法二中涉及的相关知识先按下不表
!!!header加Referer!!!

非以.mp4为结尾的url

一般情况没那么容易直接得到.mp4url,

找url的两个方向之一-----elements

查看源码,url就在层层代码下面,上文例子中的mp4url就是藏在两层页面下的某个标签的src。秘诀是先看一眼源代码页面,如果入眼结构清晰明了,那么多半不复杂。回到视频播放页面,借助右键检查仔细排查标签就可以了

但如果查看源代码页面后发现有很多看不懂的长长的段落,特别是有很多大括号,或者js样式的,总之能一眼看到不对劲的网页,这种情况就不是能通过元素查找找出来的。它需要一些手段如selelnium,抓包技术(数据包)

找url的两个方向之一-----network

这个方向就有点像刚才提到的抓包技术,不过真正使用抓包是要借助专业工具的。这里先介绍用浏览器自带的抓包功能来找我们的url。即右键检查,点击network,找到数据流,挨个检查查找对我们有用的信息,这个方法主要针对动态网页。

找url的两个方向本质上都是一样,都是从数据中筛选有用的信息

一开始是要找.mp4的url实现直接下载的,但很明显如果源代码网页很复杂那么.mp4的url就根本不会存在(存在也会被加密)

这种情况就换种思路,找接口(api)

接口(api)像是别的开发者写的一个封装函数,得到它加入某些参数,就能获得对应的内容。

以b站为例,它就有它的视频接口,找到这个接口,给他添加对应的参数就能得到指定的视频。不难看出,这个接口内一定包含了我们需要的url,不过这个url的格式肯定不是.mp4那么简单而且是可以添加参数,拼接而成的。另外,若是这样,就算得到这个拼接而成的url,能不能用上面提到的两种代码下载也未可知。

下面就以b站为例,查找使用它的接口
找到接口

'https://api.bilibili.com/x/player/playurl?' + 'bvid=' + bvid +'&cid=' + str(cid) + '&qn=64&type=&otype=json'

或者代码实现找url(network中有的视频有playurl,有的没有,用正则找靠谱)
需要先用正则在目标网页源代码中找到包含视频直接url的json文件

pattern = r'\<script\>window\.__playinfo__=(.*?)\</script\>'
result = re.findall(pattern, html)[0]


然后解析json

temp = json.loads(result)

接着提取内容

video_url = temp['data']['dash']['video'][0]['baseUrl']
print(video_url)

这是打印结果

{'code': 0, 'message': '0', 'ttl': 1, 'data': {'from': 'local', 'result': 'suee', 'message': '', 'quality': 32, 'format': 'flv480', 'timelength': 8679, 'accept_format': 'flv720,flv480,mp4', 'accept_description': ['高清 720P', '清晰 480P', '流畅 360P'], 'accept_quality': [64, 32, 16], 'video_codecid': 7, 'seek_param': 'start', 'seek_type': 'offset', 'dash': {'duration': 9, 'minBufferTime': 1.5, 'min_buffer_time': 1.5, 'video': [{'id': 64, 'baseUrl': 'https://upos-sz-mirrorkodo.bilivideo.com/upgcxcode/43/29/288562943/288562943-1-30064.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1613228680&gen=playurl&os=kodobv&oi=827278138&trid=3625ae10dddf49fc88c17490d5867c64u&platform=pc&upsig=1d6f8c7c311ba495bca7f2da3fe288f6&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=0&orderid=0,3&agrr=0&logo=80000000', 'base_url': 'https://upos-s

可以看到有base_url这样的链接出现,打开这样的链接发现无法访问,也不是.mp4但这个就是我们需要下载的的url
这个base_url也可以直接在net-work里直接找到

下载b站视频经验

得到base_url后如何使用它下载?
就差这临门一脚了
最后代码如下

import requests
url = "https://cn-jszj-dx-v-09.bilivideo.com/upgcxcode/18/28/287972818/287972818-1-30074.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1613356156&gen=playurl&os=vcache&oi=827278138&trid=3f0f02d09e5a46e8943e7bb069e62f60u&platform=pc&upsig=343a85c8a72a750ba56c93eee4c28d63&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&cdnid=8192&mid=410239695&orderid=0,3&agrr=0&logo=80000000"
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',
}
begin = 0
end = 1024 * 1024 - 1
flag = 0
headers.update({'Range': 'bytes=' + str(begin) + '-' + str(end)})
while True:# 添加请求头键值对,写上 range:请求字节范围headers.update({'Range': 'bytes=' + str(begin) + '-' + str(end)})res = requests.get(url=url, headers=headers)if res.status_code != 416:# 响应码不为416时有数据,由于我们不是b站服务器,最终那个数据包的请求range肯定会超出限度,所以传回来的http状态码是416而不是206begin = end + 1end = end + 1024 * 1024else:headers.update({'Range': str(end + 1) + '-'})res = requests.get(url=url, headers=headers)flag = 1with open("D:/base/a.mp4", 'ab') as fp:fp.write(res.content)fp.flush()if flag == 1:fp.close()

最后一步不添加range字节范围是不会成功的
这个出现个大问题,我下载的只是m4s文件,而m4s文件需要一个视频文件和一个音频文件用合并才能完整观看………

还有一种思路是直接很据视频接口找到flv链接…………

b站接口是get请求
现在已经可以根据接口实现爬取指定bv号的单个或系列视频了

只要搞懂了爬取视频的本质就是找url或接口,那么做起来就是水到渠成了

需要注意的是

1.一个错误示范是这样的

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"%icontent = requests.get(url,headers=headers).contentwith 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")

就可以下载成功了

2.加密的url

有时候一个视频右键就能复制它的地址(这个url通常毫无用处)

就像这个

blob:https://www.bilibili.com/62cc1137-e104-4360-a03f-b856bf1079ca

这个网址是经过加密的,详情见为什么视频链接地址是blob
而爬虫的需求则是要在网页数据里找到直接url的相对位置从而实现批量下载,
3.
找到接口后不要直接下载里面的url,要在头里添加range字节范围
4.
普通下载速度极慢
5.
断点续传

下电影之最简单的情况

以某电影网站为例
在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_warningsdisable_warnings(InsecureRequestWarning)  # https问题的报错print("开始下载!")
for i in range(1712):url = "url%s.ts" % iret = requests.get(url,verify=False).contentwith 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的功能,但这么想就局限了自己的视野。

知识点拾遗二(下载视频)相关推荐

  1. 慕课离线下载视频支持电脑播放

    下载中国大学,网易云课堂,爱课程,学堂在线视频课程 一. 获取慕课视频下载器 1.点击获取学无止下载器 Github链接 2.下载安装后,然后点击桌面快捷方式运行即可. 注意:杀毒软件可能会阻止外部e ...

  2. 用python怎么下载_如何使用python下载视频

    python怎么下载视频 在进行爬虫的时候,经常需要保存视频到本地.通常得先获得视频(.mp4)的下载链接,再设置保存到本地的路径(路径包括最后的命名, 例如:D:/1.mp4),因此函数传入的参数为 ...

  3. AsyncTask 异步任务基本使用-下载视频

    概述 android 提供了一个异步任务类AsyncTask,使创建异步任务.更新UI变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务.本例子将演示并实现,使用AsyncTas ...

  4. python使用you-get下载视频

    B站视频想下载,但是没有下载按钮,于是找其他方法----使用you-get下载: 一.电脑安装python 二.win+R键,在打开的运行窗口中输入"cmd",打开命令行 三.安装 ...

  5. 用Python批量下载视频

    已离职,无任何利益相关,请放心食用 公司具体网址均已作脱敏处理,防止恶意爬虫攻击 (我都被自己感动了55555) ​ 前言 搞社会实践(da gong)的地方是做网站的,公司把视频放到了*拍短视频的服 ...

  6. python爬虫利用线程池下载视频

    由于requests模块中,requests.get()是线程阻塞的,所有当有多个爬虫进行爬取时,那么单线程式爬虫是耗时比较长的,所以我们需要使用线程池,利用线程池来爬取耗时比较长的资源,这里我们使用 ...

  7. 防止360浏览器小窗下载视频

    阿酷TONY / 原创 / 2021-9-1 / 长沙 防止360等浏览器小窗下载视频的效果,实测效果参见本人测试页: 防录屏完整效果参见:https://tony.89525.com/edu/ 1. ...

  8. [ Azure | Az-900 ] 基础知识点总结(二) - 核心组件服务

    本系列文章主要针对微软AZ-900所有知识点总结,助力通过考试,获得证书.本系列文章列表如下: [ Azure | Az-900 ] 基础知识点总结(一) - Cloud云概念 [ Azure | A ...

  9. 别想盗我视频之——blob加密+mediaSource防止用户下载视频

    文章目录 前言 一.blob 二.mediaSource 三.后台处理 四.代码展示 1.后台代码 2.前台代码 1.无插件,纯H5 html js 2. 开源播放器插件 html js 相关报错 前 ...

最新文章

  1. navicat的使用
  2. Markdown语法-基础
  3. [导入]日志 20071206 (WCF Architecture)
  4. 特征分解与奇异值分解
  5. c语言1+2+3+4+5_C程序来计算系列1+(1 + 2)+(1 + 2 + 3)+(1 + 2 + 3 + 4)+ ... +(1 + 2 + 3 + ... + n)...
  6. 5脚耳机插座原理图_常用元器件的原理图符号和元器件封装汇总
  7. 升级CentOS到最新版本
  8. 销售记账管理系统php源码,crm客户销售管理系统销售统计ERP系统源php源码源码办公审批管理...
  9. java实现AES密钥生成
  10. 新冠病毒到底对患者的肺做了什么?康复者会像SARS一样出现肺纤维化吗?
  11. vue 微信录音倒计时_vue的微信语音功能,录音+对接口返回amr音频播放-Go语言中文社区...
  12. |函数相乘分离 函数增长速度|day6
  13. Bootstrap排版之标题
  14. 【BZOJ30472125】Freda的传呼机
  15. MATLAB中FIR滤波器的时延溢出问题详解:线性相位对信号造成的时延溢出及其消除方法,以及fir1等函数的使用
  16. ABAP资产负债表作业
  17. 【定量分析、量化金融与统计学】R语言方差分析ANOVA(F检验)
  18. 汽车悬架matlab时域和频域,车辆悬架系统振动控制(精)
  19. 3钟联通手机,话费充值方式
  20. 软件测试工作是吃青春饭的吗?

热门文章

  1. 英特尔 D435/D435i双目相机 使用指南
  2. 山石hillstone防火墙HA高可靠性-主备AP模式
  3. 2022年,又新出来一个Python学习神器
  4. RDRN——新兴移动广告的未来颠覆者
  5. 无良公司把我从上家挖过来,白嫖了六个月,临近试用期结束才说不合适,催我赶紧找下家!...
  6. 微型水质监测站——在线实时监测水质数据
  7. Hadoop学习——最大的敌人是自己
  8. 编程计算并输出1到n之间所有数的平方和立方
  9. 【Java 基础】静态常量放在 class 类中还是放在 interface 中
  10. 日本大数据应用环境和发展状况