You-Get 0.2.1:Vimeo视频的下载

2012-09-02 23:00

You-Get 0.2.1:Vimeo视频的下载

by

at 2012-09-02 15:00:00

original http://www.soimort.org/tech-blog/2012/09/02/you-get.html

Python 3的YouTube/优酷视频下载工具You-Get今天更新到0.2.1版了。

新版本特性一览:

至此,You-Get已经实现了youku-lixian全部功能的同等替代。

芝士商店(Cheeseshop)上架啦!

You-Get已经在PyPI(Cheeseshop)注册。以后可以直接通过Pip或者EasyInstall来进行安装和升级:

$ pip install you-get

$ you-get

或:

$ easy_install you-get

$ you-get

你仍然可以通过从Git获取源码的方式来使用You-Get:

$ git clone git://github.com/soimort/you-get.git

$ cd you-get/
$ ./you-get

通过以下命令将You-Get安装到系统路径(与Pip安装等效):

$ make install

$ you-get

命令行的使用

请参考中文说明

Python APIs的使用

这里有一个简单的示例

技术细节:Vimeo视频的下载 / HTTP headers的正确伪造方法(误)

简略地介绍一下如何使用Python 3下载Vimeo视频的实现细节,感兴趣的可以看。

Vimeo的视频地址格式主要有类似如下两种(以任意视频为例):

http://vimeo.com/48070853

http://vimeo.com/channels/staffpicks/48070853

无论哪种URL,最后的一串数字就是Vimeo视频的ID。用一行正则表达式匹配获取这个ID(令视频地址为变量url):

id = re.search(r'http://\w*vimeo.com[/\w]*/(\d+)$', url).group(1)

在相应的HTML页面中(令HTML内容存放于变量html),我们需要抓取三个重要的JSON信息:

signature = re.search(r'"signature":"([^"]+)"', html).group(1)
timestamp = re.search(r'"timestamp":([^,]+)', html).group(1)
title = re.search(r'"title":"([^"]+)"', html).group(1)

title即为视频的标题。其他两个变量值signaturetimestamp用来和id一同构成视频的真实地址:

url = 'http://player.vimeo.com/play_redirect?clip_id=%s&sig=%s&time=%s' \
% (id, signature, timestamp)

我在这里得到的signature80e1d7a8ee1e7fecce971566cbe94a09timestamp1346545369,加上视频的id48070853,合成的url是:

http://player.vimeo.com/play_redirect?clip_id=48070853&sig=80e1d7a8ee1e7fecce971566cbe94a09&time=1346545369

但是,这个地址根本就是无效的(既无法用Python进行下一步请求,也不能在浏览器中打开)。原因是,我们直接使用了Python默认的request header来获取HTML内容,而Vimeo采取的下载防范措施禁止我们这么做。所以,直接通过这种方式抓取的视频URL被封禁掉了:

解决的方法也很简单。子曰:使用伪造headers的人是邪恶的。现在我们就来用这种邪恶的手段抓取Vimeo上的视频地址,让服务器误以为我们的客户端是正常的浏览器,而不是某个不怀好意的Python脚本。

先找到浏览器所使用的request headers:

将其原封不动地照搬到Python里:

fake_headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Charset': 'UTF-8,*;q=0.5',
    'Accept-Encoding': 'gzip,deflate,sdch',
    'Accept-Language': 'en-US,en;q=0.8',
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) \
AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.57 Safari/537.1'
}

在以后凡是向Vimeo发出HTTP请求时,我们只需发送这个假的fake_headers就好了:

response = request.urlopen(request.Request(url, headers = fake_headers), None)

Vimeo是我目前见到的唯一一个会根据浏览器的headers来封锁下载的网站。不过如你所见,对于真心想下载视频的人来说,这招基本上没用。。。

Fork me on GitHub