Come si utilizza WGET per eseguire il mirroring di un sito di livello 1 in profondità, recuperando risorse JS, CSS comprese le immagini CSS?


11

Fai finta di volere che una semplice copia della pagina venga scaricata sul mio HD per la conservazione permanente. Non sto cercando un deep recursive get, solo una singola pagina, ma anche tutte le risorse caricate da quella pagina da scaricare.

Esempio: https://www.tumblr.com/

Aspettarsi:

  • L'indice.html
  • Qualsiasi immagine caricata
  • Qualsiasi file JS caricato
  • Qualsiasi file CSS caricato
  • Qualsiasi immagine caricata nel file CSS
  • collegamenti per le risorse della pagina localizzate per funzionare con le copie scaricate (nessuna dipendenza dal web)

Sono interessato a sapere se puoi aiutarmi a trovare la migliore sintassi di wget o altri strumenti che lo faranno. Gli strumenti che ho provato di solito non riescono a caricare le immagini dai CSS, quindi la pagina non appare mai corretta quando caricata localmente. Grazie!

Soluzione tangente

Ho trovato un modo per farlo usando FireFox. Il salvataggio predefinito è interrotto e c'è un componente aggiuntivo chiamato "Salva completato" che apparentemente può fare un buon lavoro con questo. Tuttavia, non è possibile scaricarlo perché dice che non è supportato nella versione corrente di FireFox. Il motivo è che è stato inserito in questo componente aggiuntivo: "Mozilla Archive Format". Installalo, quindi quando usi File> "Salva pagina come .." c'è una nuova opzione chiamata "Pagina Web, completa" che è essenzialmente il vecchio componente aggiuntivo, che corregge l'implementazione di magazzino che FireFox usa (il che è terribile). Questa non è una soluzione WGET ma fornisce una soluzione praticabile.

EDIT: un altro problema ridicolo per chiunque potrebbe seguire questa domanda in futuro, cercando di farlo. Per far funzionare correttamente il componente aggiuntivo è necessario Strumenti> Formato archivio Mozilla e modificare l'impostazione (terribile) predefinita di "eseguire un'istantanea fedele della pagina" per "conservare gli script e l'origine utilizzando Salva completo", altrimenti il ​​componente aggiuntivo svuoterà tutto i tuoi file di script e sostituiscili con il testo "/ * Script rimosso dallo snapshot save * /".


file> salva come su Firefox o un altro browser scaricherà tutte le immagini, i file js e css
user31113

Vuoi davvero i file o vuoi solo una versione della pagina resa correttamente?

Voglio i file, sarebbero comunque tenuti a rendere correttamente la pagina. Se non li avessi, sembrerebbe diverso. File> Salva con nome non funziona in Firefox. Se lo fai, non otterrai le immagini CSS. Provalo su tumblr.com/login . Immagine di sfondo mancante, immagine bg mancante per i campi di input.

Nessuna delle soluzioni wget ha funzionato per me. La mia soluzione tangente è il metodo migliore per ottenere questo tipo di salvataggio del sito. Tuttavia, l'ho visto fallire su pagine molto complicate come apple.com , presumibilmente perché molti dei percorsi delle risorse sono generati dinamicamente eseguendo javascript, alcuni non subito ma durante qualche tipo di esecuzione ajax.
Lana Miller,

Risposte:


12

wget -p -k http://ExampleSite.com

-P ti fornirà tutti gli elementi richiesti per visualizzare correttamente il sito (css, immagini, ecc.). -K cambierà tutti i collegamenti (per includere quelli per CSS e immagini) per permetterti di visualizzare la pagina offline come appariva online.

Aggiornamento: questo è specifico per il tuo sito di esempio: tumblr.com

wget -H -N -k -p --exclude-domains quantserve.com --no-check-certificate -U "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110613 Firefox/6.0a2" https://www.tumblr.com

La ripartizione:

-H = Permette a wget di andare su un host straniero. Richiesto dal momento che tumblr non ha le sue immagini sulla prima pagina con lo stesso indirizzo, stanno usando secure.assets.tumblr.com vedi nota sull'esclusione dei domini

-N = prenderà solo i file più recenti di quello che hai attualmente, nel caso in cui scarichi di nuovo la stessa pagina nel tempo

-k = converti i tuoi collegamenti per visualizzarli offline correttamente

-p = prende tutti gli elementi necessari per visualizzarlo correttamente (css, immagini, ecc.)

--exclude-domains = poiché la homepage di tumblr.com ha un link per quantserve.com e suppongo che tu non voglia questa roba, devi escluderla dal tuo download di wget. Nota : questo è piuttosto importante che dovresti usare con -H perché se vai su un sito e hanno più collegamenti per host esterni (pensa agli inserzionisti e alle cose di analisi), allora afferrerai anche quelle cose!

--no-check-certificate richiesto poiché tumblr sta usando https

-U cambia l'agente utente. Non è davvero necessario in questo caso poiché consente lo user-agent wget predefinito ma so che alcuni siti lo bloccheranno. L'ho appena inserito qui, quindi in caso di problemi su altri siti. Nello snippet di esempio che ho fornito, appare come Mozilla Firefox 6.02a

finalmente hai il sito: https://www.tumblr.com


1
Ho provato questo, non ho ottenuto alcun file JS o CSS o di immagine. Hai fatto?

Se lo stai usando su Tumblr (il tuo esempio sopra), potresti dover specificare --no-check-certificate.

Penso che tu abbia ragione, probabilmente ha bisogno di quell'opzione. Ancora niente tranne index.html comunque. Manca qualcosa ...

@LanaMiller Ho aggiornato la mia risposta. Fammi sapere se ci sono problemi.

Non potresti fare qualcosa come -exclude-domains! = Tumblr.com?
alpha1

3

Per il sito specifico che hai citato e molti altri codificati come wget (e curl) non funzioneranno. Il problema è che alcuni dei collegamenti di risorse necessari per eseguire il rendering della pagina in un browser sono essi stessi creati tramite JavaScript. Wget ha una richiesta di funzione in sospeso per eseguire javascript:

http://wget.addictivecode.org/FeatureSpecifications/JavaScript

Tuttavia, fino a quando non saranno completi i siti che creano collegamenti di risorse utilizzando JavaScript non saranno clonabili utilizzando wget. La soluzione più semplice è trovare uno strumento che stia effettivamente costruendo un DOM e analizzando javascript come un motore di browser (ovvero il metodo firefox che hai citato).


1

Puoi anche farlo automaticamente (o programmaticamente se fai la codifica) inviando un comando tramite shell usando wget:

wget --convert-links -r http://www.yourdomain.com

Scaricherà la pagina e i file interni e renderà i collegamenti locali.


1
Questo otterrà tutto . Leggi la domanda
evgeny

-1
wget -r http://www.example.com

Penso che afferrerà tutto, ma provalo e scoprilo.


1
Ottiene tutto ciò che è troppo. Finora la soluzione FireFox che ho trovato è la migliore soluzione funzionante. Ottiene ciò di cui hai bisogno e niente di più.

-1

$ ( man wget ):

-p

--page-requisiti

Questa opzione consente a Wget di scaricare tutti i file necessari per visualizzare correttamente una determinata pagina HTML. Ciò include elementi come immagini incorporate, suoni e fogli di stile di riferimento.

Di solito, quando si scarica una singola pagina HTML, tutti i documenti necessari che potrebbero essere necessari per visualizzarla correttamente non vengono scaricati. L'uso di -r insieme a -l può essere d'aiuto, ma poiché Wget non fa normalmente distinzioni tra documenti esterni e interni, in genere si lasciano "documenti foglia" che mancano dei requisiti.

Ad esempio, supponiamo che il documento 1.html contenga un tag "<IMG>" che fa riferimento a 1.gif e un tag "<A>" che punta al documento esterno 2.html. Dì che 2.html è simile ma che la sua immagine è 2.gif e si collega a 3.html. Supponiamo che questo continui fino a un numero arbitrariamente alto.

Se uno esegue il comando:

wget -r -l 2 http: // <site> /1.html

quindi verranno scaricati 1.html, 1.gif, 2.html, 2.gif e 3.html. Come puoi vedere, 3.html è senza il 3.gif necessario perché Wget sta semplicemente contando il numero di hop (fino a 2) a partire da 1.html per determinare dove fermare la ricorsione. Tuttavia, con questo comando:

wget -r -l 2 -p http: // <sito> /1.html

verranno scaricati tutti i file sopra e il 3.gif richiesto 3.html. Allo stesso modo,

wget -r -l 1 -p http: // <sito> /1.html

causerà il download di 1.html, 1.gif, 2.html e 2.gif. Si potrebbe pensare che:

wget -r -l 0 -p http: // <sito> /1.html

scarica solo 1.html e 1.gif, ma sfortunatamente non è così, perché -l 0 equivale a -l inf --- cioè ricorsione infinita. Per scaricare una singola pagina HTML (o una manciata di esse, tutte specificate nella riga di comando o in un file di input URL -i) e i suoi (o loro) requisiti, lasciare semplicemente -r e -l:

wget -p http: // <sito> /1.html

Nota che Wget si comporterà come se fosse stato specificato -r, ma verranno scaricati solo quella singola pagina e i relativi requisiti. I collegamenti da quella pagina a documenti esterni non saranno seguiti. In realtà, per scaricare una singola pagina e tutti i suoi requisiti (anche se esistono su siti Web separati) e assicurarsi che il lotto venga visualizzato correttamente localmente, a questo autore piace usare alcune opzioni oltre a -p:

wget -E -H -k -K -p http: // <site> / <document & gt ;

Per finire questo argomento, vale la pena sapere che l'idea di Wget di un collegamento a un documento esterno è qualsiasi URL specificato in un tag "<A>", un tag "<AREA>" o un tag "<LINK>" diverso da "< LINK REL = "foglio di stile"> ".


2
Quale parte di questo pensi assomigli alla soluzione? Perché ho provato a leggere il contenuto della pagina man e non vedo la soluzione corretta qui. Hai provato qualcosa di tutto questo da solo? Cosa pensi sia il comando che affronta in modo specifico la domanda.
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.