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;