Как загрузить файл с помощью WWW::Mechanize после отправки формы?

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

#!/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 прямо из потока ответов?

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

Спасибо,

Коди Гудман


person codygman    schedule 13.11.2009    source источник


Ответы (3)


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

$mech->save_content($filename)

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

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

Источник: http://metacpan.org/pod/WWW%3a%3aMechanize

person Pavel    schedule 05.10.2012
comment
Спасибо за этот ответ. Хотя я смотрел прямо на страницу CPAN, я пропустил это, и мне пришлось пробираться через множество плохих результатов Google, пока я не нашел ваш. - person John O; 19.07.2014

I tried your code and it returns a stack of HTML of which the only http:// references were:

    http://www.w3c.org
    http://ad.z5x.net
    http://divxsubtitles.net
    http://feeds2read.net
    http://ad.z5x.net
    http://www.google-analytics.com
    http://cls.assoc-amazon.com
using the code


    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 );
person PP.    schedule 13.11.2009
comment
URL-адрес не содержит информации для загрузки файла. Файл находится в шапке как вложение для скачивания - person codygman; 14.11.2009
comment
Я подозреваю, что вы можете быть сбиты с толку HTTP. Ни один файл волшебным образом не встроен в заголовки. Возможно, в заголовках было возвращено перенаправление, и в этом случае вы должны распечатать заголовки и извлечь URL-адрес файла для загрузки. - person PP.; 14.11.2009
comment
Хорошо, ПП, мне действительно нужно прочитать RFC для http, и я считаю, что ты прав. Я думал, что вложение заголовка означает, что оно было встроено в заголовки. Я пойду дальше и прочитаю заголовки и посмотрю, смогу ли я найти перенаправление. Спасибо за вашу помощь! - person codygman; 15.11.2009
comment
Спасибо, теперь я понял, о чем вы говорите, и последняя часть позволила мне увидеть, как записать ответ, который я получил. Что меня действительно сбило с толку, так это то, что chanize-›form_number начинается с 1, в отличие от обычного, начиная с 0. Теперь отвечаю на свой вопрос! :) - person codygman; 15.11.2009

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

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

#!/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 );
person codygman    schedule 15.11.2009
comment
когда я использовал это, чтобы загрузить файл PDF из 6 страниц, это произошло, но содержимое было пустым, есть идеи? что пошло не так. - person msinfo; 26.08.2013
comment
ой! $mech-›save_content($filename, binmode =› ':raw', decoded_by_headers =› 1 ); это помогло мне - person msinfo; 26.08.2013