Come ottenere WGET per scaricare esattamente la stessa pagina Web html del browser


34

Utilizzando un browser Web (IE o Chrome) posso salvare una pagina Web (.html) con Ctl-S, ispezionarla con qualsiasi editor di testo e visualizzare i dati in un formato tabella. Uno di quei numeri che voglio estrarre, ma per molte, molte pagine Web, troppe da fare manualmente. Quindi mi piacerebbe usare WGET per ottenere quelle pagine web una dopo l'altra, e scrivere un altro programma per analizzare il .html e recuperare il numero che desidero. Ma il file .html salvato da WGET quando si utilizza lo stesso URL del browser non contiene la tabella dei dati. Perchè no? È come se il server rilevi che la richiesta proviene da WGET e non da un browser Web e fornisce una pagina Web scheletro priva della tabella dei dati. Come posso ottenere la stessa identica pagina Web con WGET? - Grazie!

ULTERIORI INFORMAZIONI:

Un esempio dell'URL che sto cercando di recuperare è: http://performance.morningstar.com/fund/performance-return.action?t=ICENX®ion=usa&culture=en-US dove la stringa ICENX è un simbolo di ticker di fondi comuni di investimento , che cambierò in uno qualsiasi dei diversi simboli ticker. Questo scarica una tabella di dati quando viene visualizzata in un browser, ma la tabella di dati manca se recuperata con WGET.


Quale url è?
Braiam,

2
Molto probabilmente il codice HTML iniziale viene compilato utilizzando le tecniche AJAX da un frammento javascript che scarica e popola la tabella. In questo caso avresti probabilmente più fortuna a ricevere la chiamata a questo script. Come Braiam chiede, se fornisci l'URL potremmo essere più in grado di aiutarti a capirlo.
Roadmr,

1
ad Altre info: Nel browser, quando visualizzi un codice sorgente, non vedi l'HTML originale (lo stesso ottenuto da wget) ma l'HTML aggiornato da javascript / ajax. I browser moderni mostrano tale fonte generata anziché il semplice HTML.
Vrata Blazek il

Risposte:


39

Come notato da roadmr , la tabella in questa pagina è generata da javascript. wget non supporta javascript, scarica semplicemente la pagina come ricevuta dal server (cioè prima che venga eseguito qualsiasi codice javascript) e quindi la tabella manca.

Hai bisogno di un browser senza testa che supporti javascript come phantomjs :

$ phantomjs save_page.js http://example.com > page.html

con save_page.js:

var system = require('system');
var page = require('webpage').create();

page.open(system.args[1], function()
{
    console.log(page.content);
    phantom.exit();
});

Quindi se vuoi solo estrarre del testo, potrebbe essere più semplice renderizzare la pagina con w3m:

$ w3m -dump page.html

e / o modifica lo script phantomjs per scaricare semplicemente ciò che ti interessa.


Anche questo non funziona, ad esempio cotrino.com/lifespan
mrgloom il

I link generati da JS non funzioneranno con questo
QkiZ,

1
2018: il progetto PhantomJS è sospeso fino a nuovo avviso :(
1rq3fea324wre

Questa soluzione è solo per il download di pagine da URL specificati. Come convoglia il meccanismo di scansione del sito di wget con esso? Inoltre, come sarebbe la sceneggiatura con Chrome senza testa?
Phil

10

È possibile scaricare un sito Web completo utilizzando wget --mirror

Esempio:

wget --mirror -p --convert-links -P ./LOCAL-DIR WEBSITE-URL

La riga di comando sopra che si desidera eseguire quando si desidera scaricare un sito Web completo e reso disponibile per la visualizzazione locale.

Opzioni:

  • --mirror attiva le opzioni adatte al mirroring.

  • -p scarica tutti i file necessari per visualizzare correttamente una determinata pagina HTML.

  • --convert-links dopo il download, converti i collegamenti nel documento per la visualizzazione locale.

  • -P ./LOCAL-DIR salva tutti i file e le directory nella directory specificata.

Per maggiori informazioni sulle opzioni di Wget Leggi di più questo articolo: Panoramica su tutti i comandi wget con esempi o controlla la pagina man di Wget .


2
Questo non funzionerà con il contenuto reso javascript. Per questo dovrai usare phantomjs come risposta da lemonsqueeze.
Mattias,

1
Questo cmd esaminerà anche tutti gli URL secondari, che scaricheranno risorse che non sono necessarie per eseguire il rendering della pagina Web specificata.
1rq3fea324wre

3

Invece di --recursive, che andrà avanti e "spider" ogni singolo link nel tuo URL, usa --page-requisites. Dovrebbe comportarsi esattamente come le opzioni che descrivi nei browser grafici.

       This option causes Wget to download all the files that are
       necessary to properly display a given HTML page.  This includes
       such things as inlined images, sounds, and referenced stylesheets.

       Ordinarily, when downloading a single HTML page, any requisite
       documents that may be needed to display it properly are not
       downloaded.  Using -r together with -l can help, but since Wget
       does not ordinarily distinguish between external and inlined
       documents, one is generally left with "leaf documents" that are
       missing their requisites.

Per maggiori informazioni, man wgetcerca e cerca l' --page-requisitesopzione (usa "/" per cercare mentre leggi una pagina man).


2

Se la risposta del server differisce a seconda di una fonte richiedente, è principalmente a causa della variabile HTTP_USER_AGENT (solo una stringa di testo) che viene fornita con una richiesta dalla fonte richiedente, informando il server della tecnologia.


  1. Puoi controllare qui l'agente del tuo browser -> http://whatsmyuseragent.com

  2. Secondo il manuale WGET questo parametro dovrebbe fare il lavoro --user-agent=AGENT.


Se ciò non aiuta, ad esempio l'elaborazione JavaScript potrebbe essere necessaria per ottenere la stessa pagina di un browser o forse una richiesta appropriata con parametri GET in modo che il server preparerà una risposta che non richiede JavaScript per riempire la pagina.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.