Как мне загрузить файл с помощью WWW :: Mechanize после отправки формы? - PullRequest
5 голосов
/ 13 ноября 2009

У меня есть код:

#!/usr/bin/perl
use strict;
use WWW::Mechanize;

my $url = 'http://divxsubtitles.net/page_subtitleinformation.php?ID=111292';
my $m = WWW::Mechanize->new(autocheck => 1);
$m->get($url);
$m->form_number(2);
$m->click();
my $response = $m->res();
print $m->response->headers->as_string;

Он отправляет кнопку загрузки на страницу, но я не уверен, как загрузить файл, который отправляется обратно после POST.

Мне нужен способ загрузить это с помощью wget, если это возможно. Я думал, что их может быть секретный URL-адрес прошел или что-то? Или мне придется загружать его с помощью LWP прямо из потока ответов?

Так как мне загрузить файл, который находится в этом заголовке?

Спасибо

Коди Гудман

Ответы [ 3 ]

3 голосов
/ 05 октября 2012

После отправки формы вы можете использовать:

$ mech-> save_content ($ filename)

Сбрасывает содержимое $ mech-> content в $ filename. $ filename будет перезаписаны. Умирает при наличии ошибок.

Если тип содержимого не начинается с «text /», то содержимое сохраняется в двоичном режиме.

Источник: http://metacpan.org/pod/WWW::Mechanize

1 голос
/ 13 ноября 2009

Я попробовал ваш код, и он возвращает стек HTML, из которых единственными http:// ссылками были:

    <a href="http://www.w3c.org" rel="nofollow noreferrer">http://www.w3c.org</a>
    <a href="http://ad.z5x.net" rel="nofollow noreferrer">http://ad.z5x.net</a>
    <a href="http://divxsubtitles.net" rel="nofollow noreferrer">http://divxsubtitles.net</a>
    <a href="http://feeds2read.net" rel="nofollow noreferrer">http://feeds2read.net</a>
    <a href="http://ad.z5x.net" rel="nofollow noreferrer">http://ad.z5x.net</a>
    <a href="http://www.google-analytics.com" rel="nofollow noreferrer">http://www.google-analytics.com</a>
    <a href="http://cls.assoc-amazon.com" rel="nofollow noreferrer">http://cls.assoc-amazon.com</a>
используя код

    my $content = $m->response->content();
    while ( $content =~ m{(http://[^/\" \t\n\r]+)}g ) {
        print( "$1\n" );
    }

Итак, мои комментарии к вам:
1. добавьте use strict; к вашему коду, вы программируете на неудачу, если вы не
2. прочитайте выходной HTML и определите, что делать дальше, вы этого не сделали, и поэтому задали неполный вопрос. Если вы не определите URL, который вы хотите загрузить, вы попросите кого-нибудь еще написать программу для вас.

После того, как вы определили URL, который хотите загрузить, достаточно просто получить его, а затем записать содержимое ответа в файл. например,


if ( ! open( FOUT, ">output.bin" ) ) {
    die( "Could not create file: $!" );
}
binmode( FOUT ); # required for Windows
print( FOUT $m->response->content() );
close( FOUT );
0 голосов
/ 15 ноября 2009

Что меня больше всего поразило, так это то, что подпрограмма «mechanize-> form_number» начинается с 1, тогда как типичные программы начинают свой индекс с 0. Если кто-то хочет знать, как загружать заголовки ответов , или скачать вложение заголовка s, это способ сделать это.

Теперь вот полный код, чтобы сделать то, что я хотел.

#!/usr/bin/perl
use strict;
use WWW::Mechanize;

my $url = 'http://divxsubtitles.net/page_subtitleinformation.php?ID=111292';
my $m = WWW::Mechanize->new(autocheck => 1);
$m->get($url);
$m->form_number(2);
$m->click();
my $response = $m->res();
my $filename = $response->filename;

if (! open ( FOUT, ">$filename" ) ) {
    die("Could not create file: $!" );
}
print( FOUT $m->response->content() );
close( FOUT );
...