Problemi con wget o httrack per il mirroring del sito Web archiviato


12

Sto cercando di utilizzare wget per creare un mirror locale di un sito Web. Ma sto scoprendo che non sto ricevendo tutte le pagine di collegamento.

Ecco il sito

http://web.archive.org/web/20110722080716/http://cst-www.nrl.navy.mil/lattice/

Non voglio tutte le pagine che iniziano con web.archive.org, ma voglio tutte le pagine che iniziano con http://web.archive.org/web/20110722080716/http://cst-www.nrl.navy.mil/lattice/.

Quando uso wget -r, nella mia struttura di file trovo

web.archive.org/web/20110722080716/http://cst-www.nrl.navy.mil/lattice/index.html,

ma non ho tutti i file che fanno parte di questo database, ad es

web.archive.org/web/20110808041151/http://cst-www.nrl.navy.mil/lattice/struk/d0c.html.

Forse httrack farebbe meglio, ma in questo momento sta prendendo troppo.

Quindi, in che modo è possibile prendere una copia locale di un sito Web archiviato dalla Internet Archive Wayback Machine?


Uomo! Ho provato a rispecchiare esattamente la stessa pagina (e mi sono davvero arrabbiato perché non l'ho fatto quando il sito originale era ancora online, il che sarebbe stato molto più semplice). Penso che il problema sia che non tutti i file sono accessibili 20110722080716nell'istantanea, quindi l' -npopzione di wget non sarà di aiuto.
mpy

Hai verificato manualmente che le pagine mancanti siano effettivamente archiviate? Archive.org non archivia sempre ogni singola pagina.
nitro2k01,

Risposte:


20

Sebbene utili, le risposte precedenti non riescono a risolvere in modo conciso, affidabile e ripetibile la domanda di fondo. In questo post, descriviamo brevemente le difficoltà di ciascuno e quindi offriamo una httracksoluzione basata su modesti .

sfondo

Prima di arrivare a questo, tuttavia, prendere in considerazione la risposta ben scritta di mpy . In h [is | er] tristemente trascurato post, mpy documenta rigorosamente lo schema di archiviazione oscuro (e onestamente offuscato) della Wayback Machine.

Non sorprende che non sia carino. Invece di archiviare i siti in modo sicuro in una singola directory, The Wayback Machine diffonde in modo effimero un singolo sito attraverso due o più directory di fratelli identificate numericamente. Dire che ciò complica il mirroring sarebbe un eufemismo sostanziale.

Comprendere le orribili insidie ​​presentate da questo schema è fondamentale per comprendere l'inadeguatezza delle soluzioni precedenti. Andiamo avanti, vero?

Soluzione precedente 1: wget

La domanda StackOverflow correlata "Ripristina il vecchio sito Web dalla macchina di ritorno" è probabilmente il peggiore offensore in questo senso, raccomandando il wgetmirroring di Wayback. Naturalmente, tale raccomandazione è fondamentalmente non fondata.

In assenza di una complessa riscrittura di URL esterni (ad es. Privoxy), wgetNon è possibile utilizzare per il mirroring affidabile di siti archiviati con Wayback. Come dettagli mpy in "Problema 2 + Soluzione", qualunque strumento di mirroring tu scelga deve permetterti di scaricare in modo non transitivo solo gli URL appartenenti al sito di destinazione. Per impostazione predefinita, la maggior parte degli strumenti di mirroring scarica in modo transitivo tutti gli URL appartenenti sia al sito di destinazione sia ai siti collegati da quel sito - che, nel peggiore dei casi, significa "l'intera Internet".

Un esempio concreto è in ordine. Quando si esegue il mirroring del dominio di esempio kearescue.com, lo strumento di mirroring deve :

  • Includi tutti gli URL corrispondenti https://web.archive.org/web/*/http://kearescue.com. Si tratta di risorse fornite dal sito target (ad es https://web.archive.org/web/20140521010450js_/http_/kearescue.com/media/system/js/core.js.).
  • Escludi tutti gli altri URL. Si tratta di risorse fornite da altri siti semplicemente collegati al sito di destinazione (ad esempio, https://web.archive.org/web/20140517180436js_/https_/connect.facebook.net/en_US/all.js).

La mancata esclusione di tali URL in genere attira tutto o la maggior parte di Internet archiviato al momento dell'archiviazione del sito, in particolare per i siti che incorporano risorse ospitate esternamente (ad esempio video di YouTube).

Sarebbe male. Mentre wget fa fornire una riga di comando --exclude-directoriesl'opzione di accettare uno o più modelli di corrispondenza URL da escludere, questi sono non generiche espressioni regolari; sono globs semplicistici la cui *sintassi corrisponde a zero o più caratteri esclusi/ . Poiché gli URL da escludere contengono arbitrariamente molti /caratteri, wget non possono essere utilizzati per escludere questi URL e quindi non possono essere utilizzati per il mirroring di siti archiviati con Wayback. Periodo. Fine della storia sfortunata.

Questo problema è stato registrato almeno dal 2009. Deve ancora essere risolto. Il prossimo!

Soluzione precedente 2: Scrapbook

Prinz consiglia ScrapBookun plugin per Firefox. Un plugin per Firefox.

Probabilmente era tutto ciò che dovevi sapere. Mentre ScrapBook's Filter by String...funzionalità fa indirizzo suddetto 'Problema 2 + Soluzione' esso non affronta la successiva 'Problema 3 + Soluzione' - cioè, il problema di duplicati estranei.

È discutibile se ScrapBookanche affrontare adeguatamente il problema precedente. Come ammette mpy :

Sebbene Scrapbook non sia riuscito finora a catturare completamente il sito ...

Le soluzioni inaffidabili e eccessivamente semplicistiche sono non soluzioni. Il prossimo!

Soluzione precedente 3: wget + Privoxy

mpy fornisce quindi una soluzione solida sfruttando sia wgete Privoxy. Mentre wget è ragionevolmente semplice da configurare, Privoxyè tutt'altro che ragionevole. O semplice.

A causa dell'imponderabile ostacolo tecnico di installare, configurare e utilizzare correttamente Privoxy, dobbiamo ancora confermare la soluzione di mpy . Si dovrebbe lavorare in maniera robusta e scalabile. Date le barriere all'ingresso, questa soluzione è probabilmente più adatta all'automazione su larga scala rispetto al webmaster medio che tenta di recuperare siti di piccole e medie dimensioni.

È wget+ Privoxyla pena dare un'occhiata? Assolutamente. Ma la maggior parte dei superutenti potrebbe essere meglio gestita da soluzioni più semplici e facilmente applicabili.

Nuova soluzione: httrack

Enter httrack, un'utilità della riga di comando che implementa un superset della wgetfunzionalità di mirroring. httracksupporta sia l'esclusione URL pattern-based e la ristrutturazione del sito semplicistico. Il primo risolve "Problem 2 + Solution" di mpy ; quest'ultimo, "Problema 3 + Soluzione".

Nell'esempio astratto di seguito, sostituire:

  • ${wayback_url}dall'URL della directory di livello superiore che archivia l'intero sito di destinazione (ad es 'https://web.archive.org/web/20140517175612/http://kearescue.com'.).
  • ${domain_name}con lo stesso nome di dominio presente ${wayback_url}escludendo il prefisso http://(ad es 'kearescue.com'.).

Eccoci qui. Installa httrack, apri una finestra di terminale cdnella directory locale in cui desideri scaricare il tuo sito ed esegui il comando seguente:

httrack\
    ${wayback_url}\
    '-*'\
    '+*/${domain_name}/*'\
    -N1005\
    --advanced-progressinfo\
    --can-go-up-and-down\
    --display\
    --keep-alive\
    --mirror\
    --robots=0\
    --user-agent='Mozilla/5.0 (X11;U; Linux i686; en-GB; rv:1.9.1) Gecko/20090624 Ubuntu/9.04 (jaunty) Firefox/3.5'\
    --verbose

Al termine, la directory corrente dovrebbe contenere una sottodirectory per ciascun tipo di file rispecchiato da tale URL. Questo di solito include almeno:

  • css, contenente tutti i fogli di stile CSS con mirroring.
  • html, contenente tutte le pagine HTML con mirroring.
  • js, contenente tutto il JavaScript con mirroring.
  • ico, contenente una favicon speculare.

Dal momento che httrackriscrive internamente tutto il contenuto scaricato per riflettere questa struttura, il tuo sito ora dovrebbe essere navigabile così com'è senza modifiche. Se hai interrotto prematuramente il comando precedente e desideri continuare a scaricare, aggiungi l' --continueopzione allo stesso comando esatto e riprova.

Questo è tutto. Non sono necessarie contorsioni esterne, riscrittura degli URL soggetta a errori o server proxy basati su regole.

Divertiti, compagni superutente.


Sono contento di sapere che almeno una persona ha letto a fondo la mia risposta. E grazie per la tua ulteriore analisi e la soluzione httrack. +1
mpy

1
La soluzione httrack è stata perfetta, grazie mille!
ChrisChinchilla,

Sono contento di essere di minore aiuto, ragazzi. Dato come gut-wrenchingly terribile questo arazzo di dolore e l'inganno è stato quello di svelare, ho solo dovuto condividere le mie scoperte.
Cecil Curry,

Per rimuovere il limite di trasferimento velocità aggiungi questi parametri: --disable-security-limits --max-rate = 0
Oswaldo

7

Sfortunatamente nessuna delle risposte è stata in grado di risolvere il problema di creare un mirror completo da un sito Web archiviato (senza duplicare ogni file una dozzina di volte). Quindi ho hackerato insieme un altro approccio. Hacked è la parola importante poiché la mia soluzione non è né una soluzione generale né molto semplice (leggi: copia e incolla). Ho usato Privoxy Proxy Server per riscrivere i file al volo mentre eseguivo il mirroring con wget.

Ma prima, cosa c'è di così difficile nel mirroring dalla Wayback Machine ?

Problema 1 + Soluzione

La barra degli strumenti Wayback è utile per l'uso interattivo, ma potrebbe interferire con wget. Quindi eliminalo con una regola di filtro privoxy

FILTER: removewaybacktoolbar remove Wayback toolbar
s|BEGIN WAYBACK TOOLBAR INSERT.*END WAYBACK TOOLBAR INSERT|Wayback Toolbar removed|s

Problema 2 + Soluzione

Volevo catturare l'intero sito, quindi avevo bisogno di una profondità di ricorsione non troppo piccola. Ma non voglio che wget esegua la scansione dell'intero server. Di solito usi l' opzione non genitore-np di wget a tale scopo. Ma questo non funzionerà qui, perché vuoi ottenere

http://web.archive.org/web/ 20110722080716 /http://cst-www.nrl.navy.mil/lattice/struk/hcp.html

ma anche

http://web.archive.org/web/ 20110801041529 /http://cst-www.nrl.navy.mil/lattice/struk/a_f.html

(notare il timestamp modificato nei percorsi). L'omissione -npfinirà con la ricerca per indicizzazione (...)http://cst-www.nrl.navy.mile infine recupererà l'intero navi.milsito. Sicuramente non lo voglio! Quindi questo filtro tenta di emulare il -npcomportamento con la macchina Wayback:

FILTER: blocknonparentpages emulate wget -np option
s|/web/([0-9].*)/http://cst-www.nrl.navy.mil/lattice/|THIS_IS_A_GOOD_$1_ADDRESS|gU
s|/web/(.*)/http(.*)([" ])|http://some.local.server/404$3|gU
s|THIS_IS_A_GOOD_(.*)_ADDRESS|/web/$1/http://cst-www.nrl.navy.mil/lattice/|gU

Lo lascerò come un esercizio per scavare nella sintassi. Ciò che questo filtro non è il seguente: Sostituisce tutti gli URL Wayback come http://web.archive.org/web/20110801041529/http://www.nrl.navy.mil/con http://some.local.server/404il tempo che essi non contengono http://cst-www.nrl.navy.mil/lattice/.

Devi adeguarti http://some.local.server/404. Questo è per inviare un errore 404 a wget. Probabilmente privoxy può farlo in modo più elegante. Tuttavia, il modo più semplice per me era solo riscrivere il collegamento a una pagina inesistente su un server http locale, quindi mi sono bloccato con questo.

E, è anche necessario regolare entrambe le occorrenze di http://cst-www.nrl.navy.mil/lattice/riflettere il sito che si desidera specchio.

Problema 3 + Soluzione

E infine una versione archiviata di una pagina potrebbe collegarsi alla pagina in un'altra istantanea. E quello a un altro ancora. E così via ... e finirai con un sacco di istantanee della stessa pagina - e wget non riuscirà mai a finire fino a quando non avrà recuperato tutte le istantanee. Non lo voglio nemmeno io! Qui aiuta molto, che la macchina Wayback sia molto intelligente. Puoi richiedere un file

http://web.archive.org/web/ 20110801041529 /http://cst-www.nrl.navy.mil/lattice/struk/a_f.html

anche se non è incluso 20110801041529nell'istantanea. E automaticamente si reindirizzare a quella corretta:

http://web.archive.org/web/ 20110731225728 /http://cst-www.nrl.navy.mil/lattice/struk/a_f.html

Quindi, un altro filtro privoxy per riscrivere tutte le istantanee a quello più recente

FILTER: rewritewaybackstamp rewrite Wayback snapshot date
s|/([0-9]{14})(.{0,3})/|/20120713212803$2/|g

In effetti, ogni numero di 14 cifre racchiuso in /.../viene sostituito da 20120713212803(adattalo all'istantanea più recente del sito desiderato). Questo potrebbe essere un problema se nella struttura del sito sono presenti tali numeri che non provengono dalla macchina Wayback. Non perfetto, ma va bene per il sito Strukturtypen .

La cosa bella è che wget ignora la nuova posizione in cui viene reindirizzato e salva il file - nell'esempio sopra - come web.archive.org/web/20110801041529/http://cst-www.nrl.navy.mil/lattice/struk/a_f.html.

Utilizzo di wget per il mirroring del sito archiviato

Quindi, finalmente con questi filtri privoxy (definiti in user.filter) abilitati in user.actionvia

{ +filter{removewaybacktoolbar} +filter{blocknonparentpages} +filter{rewritewaybackstamp} }
web.archive.org

puoi usare wget come al solito. Non dimenticare di dire a wget di usare il proxy:

export http_proxy="localhost:8118"
wget -r -p -k -e robots=off http://web.archive.org/web/20120713212803/http://cst-www.nrl.navy.mil/lattice/index.html

Ho usato queste opzioni, ma -mdovrei anche funzionare. Finirai con le cartelle

20120713212803
20120713212803cs_
20120713212803im_
20120713212803js_

mentre la macchina Wayback separa immagini ( im_), fogli di stile ( cs_) ecc. Ho unito tutto insieme e ho usato un po 'di magia sed per sostituire i brutti collegamenti relativi ( ../../../../20120713212803js_/http:/cst-www.nrl.navy.mil/lattice) di conseguenza. Ma questo non è davvero necessario.


1
Questa è stata una risposta inestimabile. La tua precisa dissezione della struttura interna del sito di The Wayback Machine è stata la chiave della soluzione basata su httrack su cui alla fine mi sono imbattuto. Rock, mpy.
Cecil Curry,

5

wget

--page-requisites
Questa opzione fa sì che Wget scarichi 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 di solito non distingue tra documenti esterni e interni, in genere si lasciano con i "documenti foglia" che mancano i loro requisiti.

Ad esempio, supponiamo che il documento 1.html contenga un tag "" che fa riferimento a 1.gif e un tag "" 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.

-m
--mirror

Attiva le opzioni adatte per il mirroring. Questa opzione attiva la ricorsione e il timestamp, imposta una profondità di ricorsione infinita e mantiene gli elenchi di directory FTP. Attualmente è equivalente a -r -N -l inf --no-remove-listing.

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>

Quindi wget -E -H -k -K -p http://web.archive.org/web/20110722080716/http://cst-www.nrl.navy.mil/lattice sarà il tuo vestito migliore per te. Ma raccomando un altro strumento, firefoxun'estensionescrapbook

album

ScrapBook è un'estensione di Firefox che ti aiuta a salvare pagine Web e gestire facilmente le raccolte. Le caratteristiche principali sono leggerezza, velocità, accuratezza e supporto multilingue. Le caratteristiche principali sono:
* Salva pagina Web
* Salva frammento di pagina Web
* Salva sito Web
* Organizza la raccolta allo stesso modo dei segnalibri
* Ricerca di testo completo e ricerca di filtri rapida della raccolta
* Modifica della pagina Web raccolta
* Testo / HTML funzione di modifica simile alle Note di Opera

Come eseguire il mirroring di un sito
Installare scrapbook e riavviare Firefox

  1. Carica pagina nel browser [pagina web da speculare]
  2. Fare clic destro sulla pagina -> Salva pagina come ...
  3. selezionare il livello da Approfondimento Salva e premere Salva inserisci qui la descrizione dell'immagine
  4. seleziona Restrict to Drirectory/ Domainda Filtro
    inserisci qui la descrizione dell'immagine

Attendere il completamento del mirroring. Dopo il mirroring è possibile accedere al sito Web offline dal ScrapBookmenu.


Sebbene Scrapbook non sia riuscito finora a catturare completamente il sito, era più vicino a una possibile soluzione che agli altri suggerimenti. Soprattutto l' opzione Filtra per stringa ... è stata più utile che per filtrare per host / dominio. Quindi, ti conferisco la generosità:)
mpy

0

Fai attenzione con il comando qui sotto perché prende molto. Il 1 dopo la 'l' dice di prendere tutte le pagine per i collegamenti sul sito con 1 livello di profondità. Se vuoi che ritorni più in profondità, cambialo in un 2 ma potrebbe non finire mai perché potrebbe rimanere impigliato in un ciclo.

wget -rHpkl 1 -e robots=off http://www.example.com/

Non sono sicuro di quali parti del sito desideri conservare e di quali parti non ti interessano, ma probabilmente dovresti inserire nella lista bianca e / o nella lista nera le diverse parti del sito per ottenere solo ciò che desideri e per impedirti di scaricando tutto il contenuto di archive.org o Internet.

Utilizzare -D www.examle.com,www.another.example.comper inserire nella whitelist solo i domini desiderati o utilizzare --exclude-domains www.examle.com,www.another.example.com per inserire nella blacklist ciò che non si desidera.


Grazie, ma il problema con la lista bianca / nera è che tutti i siti Web archiviati provengono web.archive.orgdall'host. Voglio rispecchiare tutto ciò che wget -npavrebbe rispecchiato una volta che il sito originale fosse ancora online. -lnon aiuta molto, dal momento che deve essere aumentato a 3 o 4, determinando quindi un aumento eccessivo della gerarchia del sito Web.
mpy,

0

Il formato degli URL per Internet Archive include la data e l'ora in cui il sito è stato archiviato. Per risparmiare spazio, le risorse che non sono state modificate vengono ricollegate a una versione precedente di un sito.

Ad esempio, in questo URL http://web.archive.org/web/20000229123340/http://www.yahoo.com/ la data di scansione del sito è stata il 29 febbraio 2000 alle 12:33 e 40 secondi.

Quindi, per ottenere tutto ciò che http://web.archive.org/web/20110722080716/http://cst-www.nrl.navy.mil/lattice/devi iniziare, prendi anche tutte le risorse collegate http://web.archive.org/web/*/http://cst-www.nrl.navy.mil/lattice/.


Esatto, e questo è il problema. Diciamo che la pagina A si collega a B. Quindi, la versione corrente A si collega alla vecchia versione B. Ma B include anche un collegamento ad A. Quindi anche la vecchia versione di A viene recuperata e si collega di nuovo alla versione precedente. Questo (a una profondità di scansione (necessaria) di 4) porta al risultato, che si finisce con dozzine di versioni della pagina dell'indice, ma non tutti i file necessari.
MP

0

Esiste già uno strumento che lo fa meglio:

wayback_machine_downloader domain.org 

Per ottenerlo devi aver installato Ruby. E poi:

gem install wayback_machine_downloader
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.