解决方案:视频采集工具 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[&#x27;title&#x27;]

&#x27;youtube-dl test video "\&#x27;/\\ä↭&#x27;

>>> info[&#x27;height&#x27;], info[&#x27;width&#x27;]

(720, 1280)</p>

  复制

  提取播放列表信息 官方文档中给出的提取播放列表的方法如下,只是将extract_info的第二个参数改为 False,但笔者发现这种方法在实际开发过程中有很大的弊端。整个extract_info函数执行过程不允许中断,youtube-dl本身没有实现断点恢复功能,导致一旦播放列表过长,视频过大,程序很可能因为网络波动而浪费之前的工作。

  >>> playlist = ydl.extract_info(&#x27;http://www.ted.com/playlists/13/open_source_open_world&#x27;, download=False)

[TED] open_source_open_world: Downloading playlist webpage ...

>>> for video in playlist[&#x27;entries&#x27;]:

... print(&#x27;Video #%d: %s&#x27; % (video[&#x27;playlist_index&#x27;], video[&#x27;title&#x27;]))

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 = {&#x27;extract_flat&#x27;:&#x27;in_playlist&#x27;, &#x27;ignoreerrors&#x27;: True, &#x27;nocheckcertificate&#x27;: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(&#x27;entries&#x27;) and playlist[&#x27;entries&#x27;] != 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 {} 语句块。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线