理系学生日記

おまえはいつまで学生気分なのか

Youtube Data API を使った動画 URL の取得

Youtube には Data API があり、これを使うことによって動画の投稿や更新などが可能になります。この Data API が提供する機能の中には動画検索などもあり、これを使うとわざわざ以下のページのような Youtube ページのスクレイピングをせずとも、検索結果に含まれる Video の URL を取得できます。

[kiririmode@mbp(job:0)]% ./a.pl | head
http://www.youtube.com/v/sJMMOyFqTNg?f=videos&app=youtube_gdata
http://www.youtube.com/v/JJltke9Lgik?f=videos&app=youtube_gdata
http://www.youtube.com/v/mcbS8qyCmcs?f=videos&app=youtube_gdata
http://www.youtube.com/v/upvyW_oDAMY?f=videos&app=youtube_gdata
http://www.youtube.com/v/rWpLsNL4NqY?f=videos&app=youtube_gdata
http://www.youtube.com/v/zuwLgjc4y0E?f=videos&app=youtube_gdata
http://www.youtube.com/v/2OKLy0COWE4?f=videos&app=youtube_gdata
http://www.youtube.com/v/XZa4NJc0TWE?f=videos&app=youtube_gdata
http://www.youtube.com/v/jqBdl08P2Mw?f=videos&app=youtube_gdata
http://www.youtube.com/v/zWJSOxCAcwU?f=videos&app=youtube_gdata

ソースは以下。

use strict;
use warnings;
use feature 'say';
use LWP::UserAgent;
use URI::Escape;
use XML::LibXML;

my $res = LWP::UserAgent->new->get('http://gdata.youtube.com/feeds/api/videos?vq=' . uri_escape( '猫鍋' ) );
my $dom = XML::LibXML->load_xml({
    string => $res->decoded_content
});

my $xpc = XML::LibXML::XPathContext->new($dom);
$xpc->registerNs( atom => 'http://www.w3.org/2005/Atom' );
my @urls = $xpc->findnodes( '/atom:feed/atom:entry/media:group/media:content[@yt:format=5]/@url');

say $_->value for @urls;