2009-11-13 16 views
5

mam kod:Jak pobrać plik z WWW :: Mechanize po przesłaniu formularza?

#!/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; 

Twierdzi przycisk Pobierz na tej stronie, ale nie jestem pewien, jak pobrać plik, który jest wysyłany z powrotem po POST.

Potrzebuję sposobu, aby pobrać to za pomocą wget, jeśli to możliwe. Myślałem, że mogą to być tajne adresy URL? Czy będę musiał pobrać go z LWP bezpośrednio ze strumienia odpowiedzi?

Jak mogę pobrać plik z tego nagłówka?

Dzięki,

Cody Goodman

Odpowiedz

0

Dobrze rzeczą, która rzuciła mi się najbardziej, to „mechanize-> form_number” podprogram zaczyna się od 1, podczas gdy typowe programy rozpocząć indeksu na 0. Jeśli ktoś chce wiedzieć, jak nagłówki odpowiedzi pobieranie, lub pobierz załącznik nagłówka s, to jest sposób na zrobienie tego.

Oto pełny kod do zrobienia tego, co chciałem.

#!/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); 
+0

kiedy użyłem tego do ściągnięcia pliku PDF z 6 stron, tak, ale zawartość była pusta jakikolwiek pomysł? co poszło nie tak. – msinfo

+0

oh! $ mech-> save_content ($ filename, binmode => ': raw', decoded_by_headers => 1); to pomogło mi – msinfo

1

Próbowałem swój kod i zwraca stos HTML których jedynymi http:// referencje były:

 
    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 
używając kodu


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

Więc moje komentarze jesteś:
1. dodaj use strict; do kodu, programujesz do awarii, jeśli nie masz
2. odczytaj wyjściowy kod HTML i ustal, co dalej robić, a nie zrobiłeś tego, dlatego zadałeś niepełne pytanie. Jeśli nie znasz adresu URL, który chcesz pobrać, poprosisz kogoś innego o napisanie programu.

Po zidentyfikowaniu adresu URL, który chcesz pobrać, wystarczy pobrać go, a następnie zapisać treść odpowiedzi w pliku. na przykład


if (! open(FOUT, ">output.bin")) { 
    die("Could not create file: $!"); 
} 
binmode(FOUT); # required for Windows 
print(FOUT $m->response->content()); 
close(FOUT); 
+0

URL nie zawiera informacji, aby pobrać ten plik. Plik znajduje się w nagłówkach jako załącznik pobierania – Codygman

+0

Podejrzewam, że możesz być zdezorientowany z powodu HTTP .. żaden plik nie jest magicznie osadzony w nagłówkach.Możliwe jest przekierowanie w nagłówkach, w którym to przypadku powinieneś wydrukować nagłówki i wyodrębnić adres URL pliku do pobrania. –

+0

Dobra PP, naprawdę muszę przejść do czytania RFC dla http i wierzę w twoje prawo. Myślałem, że "załącznik nagłówka" oznacza, że ​​został osadzony w nagłówkach. Przeczytam nagłówki i zobaczę, czy mogę zlokalizować przekierowanie. Dzięki za pomoc! – Codygman

3

Po wysłaniu formularza, można użyć:

$ mech-> save_content ($ filename)

Zrzuca zawartość $ mech-> Zawartość do $ pliku. Nazwa pliku będzie nadpisywana . Umiera, jeśli są jakieś błędy.

Jeśli typ zawartości nie zaczyna się od "text /", wówczas zawartość jest zapisana w trybie binarnym jako .

Źródło: http://metacpan.org/pod/WWW::Mechanize

+0

Dziękuję za tę odpowiedź. Chociaż patrzyłem na stronę CPAN, tęskniłem za tym i musiałem przedzierać się przez wiele złych wyników Google, dopóki nie znalazłem twojego. –