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版了。
新版本特性一览:
- 添加了对Vimeo的支持。
- 添加了对youku-lixian所支持的其他所有视频网站的支持:
- AcFun http://www.acfun.tv
- bilibili http://www.bilibili.tv
- CNTV http://www.cntv.cn
- 爱奇艺 http://www.iqiyi.com
- 酷6网 http://www.ku6.com
- PPTV http://www.pptv.com
- 新浪视频 http://video.sina.com.cn
- 搜狐视频 http://tv.sohu.com
- 56网 http://www.56.com
- 凤凰视频 http://v.ifeng.com
- 加上0.0.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/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
即为视频的标题。其他两个变量值signature
和timestamp
用来和id
一同构成视频的真实地址:
url = 'http://player.vimeo.com/play_redirect?clip_id=%s&sig=%s&time=%s' \
% (id, signature, timestamp)
我在这里得到的signature
是80e1d7a8ee1e7fecce971566cbe94a09
,timestamp
是1346545369
,加上视频的id
:48070853
,合成的url
是:
但是,这个地址根本就是无效的(既无法用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来封锁下载的网站。不过如你所见,对于真心想下载视频的人来说,这招基本上没用。。。