通过Wget下载YouTube视频

时间:2013-01-11 13:55:41

标签: youtube firebug wget

我正在尝试通过Wget下载YouTube视频。首先需要捕获实际视频资源的URL。假设我要下载此视频:video。在Firebug控制台中打开页面会显示如下内容:

Enter image description here

我圈出的链接看起来像是资源的链接,因为我们只看到视频:http://www.youtube.com/v/r-KBncrOggI?version=3&autohide=1。但是,当我尝试使用Wget下载此资源时,名为 r-KBncrOggI @ version = 3& autohide = 1 的4 KB文件存储在我的硬盘驱动器中,没有别的。我该怎么做才能获得实际视频?

其次,有没有办法为不同分辨率的视频捕捉不同的资源,如360px,480px等?

2 个答案:

答案 0 :(得分:2)

这是我在另一个答案中引用的youtube-download实用程序的一个非常简化但功能正常的版本:

#!/usr/bin/env perl
use strict;
use warnings;

# CPAN modules we depend on
use JSON::XS;
use LWP::UserAgent;
use URI::Escape;

# Initialize the User Agent
# YouTube servers are weird, so *don't* parse headers!
my $ua = LWP::UserAgent->new(parse_head => 0);

# fetch video page or abort
my $res = $ua->get($ARGV[0]);
die "bad HTTP response" unless $res->is_success;

# scrape video metadata
if ($res->content =~ /\byt\.playerConfig\s*=\s*({.+?});/sx) {

    # parse as JSON or abort
    my $json = eval { decode_json $1 };
    die "bad JSON: $1" if $@;

    # inside the JSON 'args' property, there's an encoded
    # url_encoded_fmt_stream_map property which points
    # to stream URLs and signatures
    while ($json->{args}{url_encoded_fmt_stream_map} =~ /\burl=(http.+?)&sig=([0-9A-F\.]+)/gx) {
        # decode URL and attach signature
        my $url = uri_unescape($1) . "&signature=$2";
        print $url, "\n";
    }
}

用法示例(它将几个URL返回到具有不同编码/质量的流):

$ perl youtube.pl http://www.youtube.com/watch?v=r-KBncrOggI | head -n 1
http://r19---sn-bg07sner.c.youtube.com/videoplayback?fexp=923014%2C916623%2C920704%2C912806%2C922403%2C922405%2C929901%2C913605%2C925710%2C929104%2C929110%2C908493%2C920201%2C913302%2C919009%2C911116%2C926403%2C910221%2C901451&ms=au&mv=m&mt=1357996514&cp=U0hUTVBNUF9FUUNONF9IR1RCOk01RjRyaG4wTHdQ&id=afe2819dcace8202&ratebypass=yes&key=yt1&newshard=yes&expire=1358022107&ip=201.52.68.216&ipbits=8&upn=m-kyX9-4Tgc&sparams=cp%2Cid%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&itag=44&sver=3&source=youtube,quality=large&signature=A1E7E91DD087067ED59101EF2AE421A3503C7FED.87CBE6AE7FB8D9E2B67FEFA9449D0FA769AEA739

答案 1 :(得分:1)

我担心为视频资源获取正确的链接并不容易。

您获得的链接http://www.youtube.com/v/r-KBncrOggI?version=3&autohide=1指向播放器而非视频本身。有一个Perl实用程序youtube-download,它维护良好并且可以解决问题。这是获取该视频的HQ版本(魔术fmt=18)的方法:

stas@Stanislaws-MacBook-Pro:~$ youtube-download -o "{title}.{suffix}" --fmt 18 r-KBncrOggI 
--> Working on r-KBncrOggI
Downloading `Sourav Ganguly in Farhan Akhtar's Show - Oye! It's Friday!.mp4`
75161060/75161060 (100.00%)
Download successful!
stas@Stanislaws-MacBook-Pro:~$

可能有更好的命令行 YouTube下载程序。但很抱歉,我们不仅仅是使用Firebug下载视频而且还要继续下载:(

我知道手动捕获该URL的唯一方法是观察浏览器的活动下载:

Chrome inspector

最大的数据块是视频数据,因此您可以复制其URL:

http://s.youtube.com/s?lact=111116&uga=m30&volume=4.513679238953965&sd=BBE62AA4AHH1357937949850490&rendering=accelerated&fs=0&decoding=software&nsivbblmax=679542.000&hcbt=105.345&sendtmp=1&fmt=35&w=640&vtmp=1&referrer=None&hl=en_US&nsivbblmin=486355.000&nsivbblmean=603805.166&md=1&plid=AATTCZEEeM825vCx&ns=yt&ptk=youtube_none&csipt=watch7&rt=110.904&tsphab=1&nsiabblmax=129097.000&tspne=0&tpmt=110&nsiabblmin=123113.000&tspfdt=436&hbd=30900552&et=110.146&hbt=30.770&st=70.213&cfps=25&cr=BR&h=480&screenw=1440&nsiabblmean=125949.872&cpn=JlqV9j_oE1jzk7Zc&nsivbblc=343&nsiabblc=343&docid=r-KBncrOggI&len=1302.676&screenh=900&abd=1&pixel_ratio=1&bc=26131333&playerw=854&idpj=0&hcbd=25408143&playerh=510&ldpj=0&fexp=920704,919009,922403,916709,912806,929110,928008,920201,901451,909708,913605,925710,916623,929104,913302,910221,911116,914093,922405,929901&scoville=1&el=detailpage&bd=6676317&nsidf=1&vid=Yfg8gnutZoTD4G5SVKCxpsPvirbqG7pvR&bt=40.333&mos=0&vq=auto

但是,对于大型视频,这只会返回部分流,除非您找出负责下载流范围的URL查询参数并进行调整。

奖励:随着YouTube的不断发展,一切都在不断变化。所以,除非你刻苦,否则不要手动操作。