2009-11-13 10 views
5

Ho il codice:Come posso scaricare un file con WWW :: Mechanize dopo aver inviato un modulo?

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

Essa sostiene il pulsante per il download sulla pagina, ma non sono sicuro di come scaricare il file che viene inviato indietro dopo il POST.

Sto cercando un modo per scaricare questo con wget se possibile. Stavo pensando che il loro potrebbe essere un URL segreto passato o qualcosa del genere? O dovrò scaricarlo con LWP direttamente dal flusso di risposta?

Quindi, come faccio a scaricare il file che si trova in quella intestazione?

Grazie,

Cody Goodman

risposta

0

Beh, la cosa che mi ha buttato fuori il più è stato il "mechanize-> form_number" subroutine inizia da 1 mentre i programmi tipici iniziano il loro indice a 0. Se qualcuno vuole sapere come intestazioni scaricare risposta, oppure download header attachment s, questo è il modo per farlo.

Ora ecco il codice completo per fare ciò che volevo.

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

quando ho usato questo per scaricare un file pdf di 6 pagine, lo ha fatto, ma i contenuti erano vuoti qualche idea? che cosa è andato storto. – msinfo

+0

oh! $ mech-> save_content ($ filename, binmode => ': raw', decoded_by_headers => 1); questo mi ha aiutato – msinfo

1

ho provato il codice e restituisce una pila di HTML, di cui gli unici http:// riferimenti sono stati:

 
    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 
utilizzando il codice


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

Così i miei commenti a voi sono:
1. aggiungi use strict; al tuo codice, stai programmando per errore se non lo fai
2. leggi l'output HTML e determina cosa fare dopo, non l'hai fatto, e quindi hai fatto una domanda incompleta. A meno che non sia tu identifica l'URL che vuoi scaricare, stai chiedendo a qualcun altro di scrivere un programma per te.

Una volta identificato l'URL che si desidera scaricare, si tratta semplicemente di scaricarlo e quindi di scrivere il contenuto della risposta in un file. per esempio.


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

L'url non contiene le informazioni per scaricare il file. Il file è nelle intestazioni come allegato di download – Codygman

+0

Sospetto che tu possa essere confuso su HTTP .. nessun file è magicamente incorporato nelle intestazioni.È possibile che un reindirizzamento sia stato restituito nelle intestazioni, nel qual caso è necessario stampare le intestazioni ed estrarre l'URL del file da scaricare. –

+0

Alright PP, ho davvero bisogno di andare in giro a leggere la RFC per http e credo che sia giusto. Pensavo che "attaccamento di intestazione" significasse che era incorporato nelle intestazioni. I'll andare avanti e leggere le intestazioni e vedere se riesco a individuare il reindirizzamento. Grazie per l'aiuto! – Codygman

3

Dopo aver inviato il modulo, è possibile utilizzare:

$ mecca-> save_content ($ filename)

dump il contenuto di $ mecca-> contenuto in $ nomefile. $ nomefile sarà sovrascritto. Muore se ci sono errori.

Se il tipo di contenuto non inizia con "text /", quindi il contenuto è salvato in modalità binaria.

Fonte: http://metacpan.org/pod/WWW::Mechanize

+0

Grazie per questa risposta. Anche se stavo guardando la pagina CPAN, mi sono perso e ho dovuto guadare molti risultati di Google fino a quando non ho trovato il tuo. –