Как я могу извлечь URL YouTube из его JavaScript? - PullRequest
1 голос
/ 25 марта 2012

Здравствуйте, я хотел бы знать, хорош ли мой сценарий; Я хочу получить полный URL в качестве результата моего Perl-скрипта:

#!/usr/bin/perl
use strict;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new( agent => 'Mozilla/5.0 (Windows NT 5.1; rv:10.0.1) Gecko/20100101 Firefox/10.0.1');

my $get = $ua->get('http://www.youtube.com/watch?v=Ko0c4QT5aVA')->content;
if ($get =~ m,(.*?)http:(.*?)\"\)\;\yt.preload.start\(\"(.*?)\"\)\;</script>,sgi){

    print "First:$2\n\n";

    print "Second:$3\n";

Ответы [ 3 ]

3 голосов
/ 26 марта 2012

Я действительно ценю Mojo :: UserAgent встроенные функции DOM для такого рода вещей.Вы можете извлечь именно тот сценарий, который вам нужен (очень плохо, что YouTube не присоединяет к ним id s):

use v5.10;

use Mojo::UserAgent;

my $script = Mojo::UserAgent->new->
    get("http://www.youtube.com/watch?v=Ko0c4QT5aVA" )->
    res->
    dom->
    find('script')->
    [1];

my( $yt_preload_start ) = $script =~ m|;\s*yt\Q.preload.start(\E\s*"(.*?)"|;
$yt_preload_start =~ s{\\(.)}{$1}g;
$yt_preload_start =~ s{u0026}{&}g;

say "URL is $yt_preload_start";

Я бы предпочел парсер JavaScript, чтобы получить аргумент для yt.preload.start, но у меня нет опыта ни с одним из них.

0 голосов
/ 25 марта 2012

Мне не ясно из вашего вопроса и вашего кода, что вы пытаетесь извлечь из HTML. В частности, почему вы захватываете все перед основной частью матча, а затем игнорируете захват?

Мое предположение заключается в том, что вы хотите, чтобы все URL-адреса отображались в качестве параметров функции yt.preload.start JavaScript. Вы можете сделать это так:

use strict;
use warnings;

use LWP::UserAgent;
use URI::Escape;

my $ua = LWP::UserAgent->new( agent => 'Mozilla/5.0 (Windows NT 5.1; rv:10.0.1) Gecko/20100101 Firefox/10.0.1');
my $html = $ua->get('http://www.youtube.com/watch?v=Ko0c4QT5aVA')->content;

my @urls = $html =~ /\Qyt.preload.start("\E(http[^"]+)/gi;
print map uri_unescape($_)."\n", @urls;

редактирование:

Это решение оставляет URL-адреса с символами JavaScript Unicode "\u0026", что совпадает с Perl "\N{N+0026}" или амперсандом "&". Также строка начинается с "http:\/\/". Исправить это просто. Один из способов - заменить окончательный map на

print map {
  my $ss = uri_unescape $_;
  $ss =~ s/\\u0026/&/g, $ss =~ s|\\/|/|g;
  $ss;
} @urls;
0 голосов
/ 25 марта 2012

Это лучше?

#!/usr/bin/perl
use strict;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new( agent => 'Mozilla/5.0 (Windows NT 5.1; rv:10.0.1) Gecko/20100101 Firefox/10.0.1');

my $get = $ua->get('http://www.youtube.com/watch?v=Ko0c4QT5aVA')->content;
if ($get =~ m,(.*?)http:(.*?)\"\)\;\yt.preload.start\(\"(.*?)\"\)\;</script>,sgi){
    my $out = $3;
    $out =~ s@\\/@/@g;
    $out =~ s@\\u0026@\&@g;
    print "$out\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...