解决方案:视频采集工具 youtube-dl 接口介绍
优采云 发布时间: 2022-11-19 20:15解决方案:视频采集工具 youtube-dl 接口介绍
youtube-dl 界面介绍 0x00. youtube-dl
YouTube-dl 是一个用于从命令行下载视频的工具,它不仅支持从 YouTube 网站下载视频,还支持数百个不同的视频网站。用户可以在官方网站上下载Windows(exe)和Linux(tar.gz)的版本,然后解压它们并使用相应的命令。对于一些需要使用youtube-dl进行开发并调用其接口来提供其他功能的用户,可以在Github上找到源代码并进行二次开发,也可以直接调用其python接口。关于如何直接在命令行上使用打包好的youtube-dl工具的文档很多,本文主要是讲解youtube-dl提供的一些接口参数和功能,如果有错误或者不精确的地方欢迎批评和纠正。
0x01. 使用说明
Linux/Mac用户可以直接使用pip安装最新版本的youtube-dl:
sudo pip install youtube-dl
sudo -H pip install --upgrade youtube-dl
复制
或(自制
)。
brew install youtube-dl
复制
注意:youtube-dl 的库版本更新很快,请务必将 youtube-dl 升级到最新版本,因为它的解析器很可能会随着版本更新而变化,导致解析结果不正确或程序崩溃(上报错误时可以尝试更新是否可以解决)。
0x02. 蟒蛇接口
下载 youtube-dl 源码后,可以看到 /docs/module_guide.rst 是一个简单的接口介绍文档,但最简单的三四个 API 指令,本文会在使用过程中添加作者使用的接口和参数。
在下载之前,youtube-dl 需要初始化一个可以视为下载器的类,并且可以在初始化时指定稍后使用的解析器、解析格式、是否使用代理等。仅显示使用 YoutubeDL() 进行初始化,但此函数也可以具有字典形式的输入参数,如第 2 行所示。
>>> from youtube_dl import YoutubeDL
>>> opts = { 'outtmpl': u'%(id)s.%(ext)s' , 'ignoreerrors': True, 'proxy' : PROXY_URL}
>>> ydl = YoutubeDL(opts)
>>> ydl.add_default_info_extractors()
复制
此参数决定了下载者在后续下载过程中会遵循的某些规则,源代码中的 /youtube-dl/YoutubeDL.py 文件中有详细的注释,这里只列出了几个常用参数供参考。
参数名称
参数类型
参数含义
奥特姆普尔
字符串
" />
下载的视频文件的文件名格式
忽略错误
布尔
是否在下载过程中忽略错误(否则,程序在遇到错误时停止)。
用户名
字符串
用户
名称(如果当前网站需要登录)。
密码
字符串
密码(与用户名相同)。
无检查证书
布尔
是否验证 SSL 证书(对某些网站有用)。
代理
字符串
指定代理
extract_flat
字符串
如果指定了“in_playlist”,则仅下载播放列表,而不尝试解析视频
事实上,
这部分的第四行代码,add_default_info_extractors函数指的是添加默认的提取器,但实际上这个提取器用户是可以自定义的,但是笔者暂时没有用过这个功能,所以这里就不详细讨论了,但是对于一些 youtube-dl 本身不支持的网站, 根据其框架编写新的提取器应该能够适应大多数视频网站的需求。
提取视频信息
并下载视频 初始化后,提取信息的接口调用相对简单。从之前创建的下载器对象中,调用 extract_info() 函数。该函数有两个参数,第一个是 URL,如果是视频 URL,则会直接解析视频信息,如果是播放列表类型的 URL,则首先解析播放列表,然后解析播放列表中的每个视频(此过程是不间断的,一旦中断就会从头开始)。第二个参数是布尔值,True 表示同时解析视频详细信息和下载视频,False 不下载视频,只下载视频信息。这个函数的返回值是一个字典类型的数据,里面收录
了视频相关的信息,比如清晰度、上传者、上传时间等,了解每个参数的含义,可以看到。
>>> info = ydl.extract_info('http://www.youtube.com/watch?v=BaW_jenozKc', download=False)
[youtube] Setting language
[youtube] BaW_jenozKc: Downloading webpage
<p>
" />
[youtube] BaW_jenozKc: Downloading video info webpage
[youtube] BaW_jenozKc: Extracting video information
>>> info['title']
'youtube-dl test video "\'/\\ä↭'
>>> info['height'], info['width']
(720, 1280)</p>
复制
提取播放列表信息 官方文档中给出的提取播放列表的方法如下,只是将extract_info的第二个参数改为 False,但笔者发现这种方法在实际开发过程中有很大的弊端。整个extract_info函数执行过程不允许中断,youtube-dl本身没有实现断点恢复功能,导致一旦播放列表过长,视频过大,程序很可能因为网络波动而浪费之前的工作。
>>> playlist = ydl.extract_info('http://www.ted.com/playlists/13/open_source_open_world', download=False)
[TED] open_source_open_world: Downloading playlist webpage ...
>>> for video in playlist['entries']:
... print('Video #%d: %s' % (video['playlist_index'], video['title']))
Video #1: How Arduino is open-sourcing imagination
Video #2: The year open data went worldwide
Video #3: Massive-scale online collaboration
复制
因此,另一种解决方案是先提取播放列表中的所有视频URL(只提取URL而不下载视频会很快),然后逐个下载视频,并与数据库配合记录下载进度,这样可以最大程度地避免网络波动带来的风险。密钥代码如下。
>>> playlist_ydl_opts = {'extract_flat':'in_playlist', 'ignoreerrors': True, 'nocheckcertificate':True}
>>> playlist_ydl = YoutubeDL(playlist_ydl_opts)
>>> playlist_ydl.add_default_info_extractors()
>>> playlist = playlist_ydl.extract_info(playlist_path, download = False)
>>> if playlist.has_key('entries') and playlist['entries'] != None:
>>> ......
复制
0x03. 开发注意事项
解决方案:分析nginx日志并屏蔽采集者ip(nginx屏蔽ip配置实例)
采集
与防止采集
是一个经久不衰的话题。每个人一方面都想得到别人的东西,另一方面又不希望自己的东西被别人抢走。
本文介绍如何使用它来防止采集,当然也可以通过iptables来实现。
1.找到要屏蔽的ip
复制代码代码如下:
awk '{print $1}' nginx.access.log |排序 |uniq -c|排序 -n
nginx.access.log 是一个日志文件,
你会得到如下结果,前面是ip的访问次数,后面是ip。显然,我们需要屏蔽访问量最多的ip和不是蜘蛛的ip。在此示例中,我们阻止 165.91.122.67
复制代码代码如下:
...
13610 202.112.113.192
95772 180.169.22.135
337418 219.220.141.2
558378 165.91.122.67
2、在nginx安装目录下,新建一个block ip文件,命名为blockip.conf。添加block ip后,只需要编辑这个文件即可。添加以下内容
复制代码代码如下:
" />
拒绝 165.91.122.67;
保存。
3、在nginx配置文件nginx.conf中加入如下配置,可以放在http、server、location、limit_except语句块中。注意相对路径。在此示例中,nginx.conf 和 blocksip.conf 位于同一目录中。
复制代码代码如下:
包括 blockip.conf;
4、重启nginx服务:/usr/local/nginx/nginx -s reload 生效。
高级用法:
屏蔽ip的配置文件可以屏蔽单个ip或ip段,也可以只允许某个ip或某个ip段访问。
复制代码代码如下:
#屏蔽单个ip访问
拒绝IP;
# 允许单ip访问
允许IP;
# 阻止所有ip访问
全部拒绝;
#允许所有ip访问
" />
允许全部;
#屏蔽整个网段,即从123.0.0.1到123.255.255.254访问的命令
拒绝 123.0.0.0/8
#屏蔽IP段就是从123.45.0.1访问到123.45.255.254的命令
拒绝 124.45.0.0/16
#屏蔽IP段就是从123.45.6.1访问到123.45.6.254的命令
拒绝 123.45.6.0/24
如果要实现这样一个应用,除了少数IP,其他的都被拒绝,
这需要你像这样写 blockip.conf
复制代码代码如下:
允许 1.1.1.1;
允许 1.1.1.2;
全部拒绝;
单个网站封IP的方法,放入include blocksip.conf;在对应于 URL 的 server{} 语句块中,
所有网站封IP的方法,放入include blocksip.conf;进入 http {} 语句块。