【Python】基于you-get下载网页视频
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
文章目录
1 前言
过年了想给家里长辈下几首戏曲于是找到一个发布戏曲的网站虽然可以通过IDM插件的资源嗅探来一一下载但是内容太多便想通过爬虫的方式来批量下载视频。
2 you-get
由于此前从未接触过爬虫因此首先从“如何下载网页视频”开始检索发现you-get是一个非常好用的工具而且使用不是很复杂于是便决定使用这个工具。
2.1 安装
you-get是python中的一个第三方包可以直接通过pip install you-get
来进行安装。安装完之后在命令行中输入you-get -h
不报错表明安装成功。
之所以一个python第三方包可以直接在命令行运行是因为它安装到pip所在文件夹了如下图所示这样能直接用pip即可直接用you-get。
除安装这个第三方包外you-get的运行还需要依赖一个软件——ffmpeg
。
首先打开ffmpeg的官网https://www.ffmpeg.org/根据下图下载Windows系统下的安装程序。
安装完成后要将bin
文件夹添加到环境变量这一步一定不要漏掉
2.2 简单使用
you-get最简单的使用方式就是you-get [视频链接]
不过需要注意的是这里的视频链接不是网页的链接同时也不是IDM下载视频的那个下载链接。根据GitHub官网的说明可以发现YouTube上的视频是可以直接用you-get下载的
$ you-get 'https://www.youtube.com/watch?v=jNQXAC9IVRw'
site: YouTube
title: Me at the zoo
stream:
- itag: 43
container: webm
quality: medium
size: 0.5 MiB (564215 bytes)
# download-with: you-get --itag=43 [URL]
Downloading Me at the zoo.webm ...
100% ( 0.5/ 0.5MB) ├██████████████████████████████████┤[1/1] 6 MB/s
Saving Me at the zoo.en.srt ... Done.
此外B站的视频链接也是可以直接通过you-get下载到原视频的。其他的视频平台有待大家继续探索。
2.3 扩展
其实除了用you-get去下载视频外ffmpeg的其他功能也是非常强大比如它可以用来合并视频压缩视频等操作。具体可以参考这篇博客讲得还是很详细的。
3 下载网页视频
3.1 概述
前面提到有一些视频平台的网址即是视频链接可以直接通过you-get下载但是更多的网页中的视频链接是需要对HTML解析之后才能找到的。而上面提到的戏曲网站也属于这一种。
另外还需要注意这里可以通过you-get下载的视频链接似乎并不是IDM下载的链接具体的区别有待继续研究。
3.2 下载网页
提到python爬虫一般都绕不过一个库requests
它可以获取某个网址对应的网页的HTML但是很多网站的视频链接并不是在HTML中而是在引入的js文件中。而js在网页打开时是会运行的从而得到网页中的各个元素。
注意这里的元素和源代码是有很大区别的。打开某个网页按下F12可以看到两栏分别是元素和源代码。源代码就只包含了HTML文件及其附带的js源码而元素则是源代码执行之后得到的结果。
我们在使用requests模块时如果给定的请求链接就是网址的话只能得到这个网页的HTML文件如果要获取js的源码可以在网络标签页中找到如下图所示。
那问题来了上面这几种方式得到的都是网页的源码即HTML或者js那有没有什么办法可以得到js运行后的结果呢查找资料后得知可以是用python模拟浏览器环境从而运行js文件得到运行结果。但是这种方式代码会非常的臃肿。此外就是在浏览器中打开开发者模式F12然后刷新网页再在网络标签栏中找到刚刚运行的结果然后把它们的网络请求复制下来再给到代码中。
4 代码
import requests as req
import re
import subprocess
response = req.get("link") #获取对应网页的js
html = response.text
# print(html)
patter = 'XMT.{12}' # XMT加上后面12个字符就是每个视频的代码
code = re.findall(patter, html,flags=0) # 获取所有匹配的字符串生成一个列表
# print(len(code))
# print(code)
for item in code:
# print(item)
link = "https://player.com" + item
cmd = "you-get -f -o D:/1 --format=3gphd " + link
print(cmd)
p = subprocess.Popen(cmd) #能够实现执行完指令再进行下一个
while(p.wait() and p.stderr): # 忙碌时或出错时退出堵塞
print(p.stderr)
pass
print("down!")