Un vero ragno è un sacco di lavoro
Scrivi ragno per tutto il WWW è piuttosto un compito --- si deve prendere cura di tanti "piccoli dettagli" come:
- Ogni computer spider dovrebbe ricevere dati da qualche migliaio di server in parallelo al fine di sfruttare in modo efficiente la larghezza di banda della connessione. (I/o socket asincrono).
- avete bisogno di diversi computer che Spider in parallelo al fine di coprire la grande quantità di informazioni sul WWW (clustering; Partizione del lavoro)
- Devi essere gentile con i siti web spider:
- Rispetto i file robots.txt.
- Non recuperare molte informazioni troppo rapidamente: questo sovraccarico i server.
- Non recuperare file che non sono realmente necessari (ad esempio immagini del disco iso, pacchetti tgz per il download del software ...).
- È necessario gestire cookie/identificativi di sessione: molti siti associano ID di sessione univoci agli URL per identificare le sessioni client. Ogni volta che arrivi al sito, ottieni un nuovo ID di sessione e un nuovo mondo virtuale di pagine (con lo stesso contenuto). A causa di tali problemi, i primi motori di ricerca ignoravano il contenuto dinamico. I moderni motori di ricerca hanno imparato quali sono i problemi e come affrontarli.
- È necessario rilevare e ignorare i dati problematici: connessioni che forniscono una quantità apparentemente infinita di dati o connessioni che sono troppo lenti per terminare.
- Oltre ai seguenti collegamenti, è possibile che si desideri analizzare sitemaps per ottenere gli URL delle pagine.
- È possibile valutare quali informazioni sono importanti per l'utente e le modifiche devono essere aggiornate più frequentemente rispetto ad altre pagine. Nota: uno spider per l'intero WWW riceve molti dati --- si paga per quella larghezza di banda. Potresti voler utilizzare le richieste HTTP HEAD per indovinare se una pagina è stata modificata o meno.
- Oltre a ricevere, si desidera elaborare le informazioni e memorizzarle. Google crea indici che elencano per ogni parola le pagine che lo contengono. Potrebbe essere necessario disporre di computer di archiviazione separati e un'infrastruttura per collegarli. Le basi di dati relazionali tradizionali non tengono il passo con il volume di dati e i requisiti prestazionali di archiviazione/indicizzazione dell'intero WWW.
Questo è un sacco di lavoro. Ma se il tuo obiettivo è più modesto rispetto alla lettura dell'intero WWW, puoi saltare alcune parti. Se vuoi solo scaricare una copia di un wiki, ecc., Vai alle specifiche di wget.
Nota: se non credi che sia così tanto lavoro, potresti voler leggere come Google ha re-inventato la maggior parte delle ruote informatiche (in cima al kernel di base di Linux) per costruire buoni spider. Anche se tagli un sacco di angoli, è molto lavoro.
Mi permetto di aggiungere un paio di osservazioni tecniche su tre punti
parallela connessioni/presa asincrono comunicazione
È possibile eseguire diversi programmi di ragno in processi paralleli o thread. Ma hai bisogno di circa 5000-10000 connessioni parallele per fare un buon uso della tua connessione di rete. E questa quantità di processi/thread paralleli produce troppo overhead.
Una soluzione migliore è l'input/output asincrono: elaborare circa 1000 connessioni parallele in un singolo thread aprendo gli zoccoli in modalità non bloccante e utilizzare epoll o selezionare per elaborare solo quelle connessioni che hanno ricevuto dati. Dato che il kernel 2.4 di Linux, Linux ha un eccellente supporto per la scalabilità (consiglio anche di studiare i file mappati in memoria) continuamente migliorato nelle versioni successive.
Nota: l'utilizzo di I/O asincrono aiuta molto di più che usare un "linguaggio veloce": è meglio scrivere un processo basato su epoll per 1000 connessioni scritte in Perl piuttosto che eseguire 1000 processi scritti in C. Se lo si fa giusto, puoi saturare una connessione a 100 Mb con i processi scritti in perl.
Dalla risposta originale: Il lato negativo di questo approccio è che si dovrà implementare la specifica HTTP se stessi in una forma asincrono (Non sono a conoscenza di una libreria riutilizzabile che fa questo). È molto più semplice farlo con il protocollo HTTP/1.0 più semplice rispetto al moderno protocollo HTTP/1.1. Probabilmente non trarrai vantaggio dai vantaggi di HTTP/1.1 per i normali browser, quindi questo potrebbe essere un buon posto per risparmiare alcuni costi di sviluppo.
Modifica cinque anni più tardi: Oggi c'è un sacco di tecnologia gratuita/open source disponibile per aiutarvi con questo lavoro. Personalmente mi piace ilasincrono dello node.js asincrono --- ti salva tutto il lavoro menzionato nel precedente paragrafo originale. Certamente, oggi ci sono anche molti moduli prontamente disponibili per gli altri componenti di cui hai bisogno nel tuo spider. Si noti, tuttavia, che la qualità dei moduli di terze parti può variare notevolmente. Devi controllare qualsiasi cosa tu usi. [Aging info:] Recentemente, ho scritto uno spider utilizzando node.js e ho trovato l'affidabilità dei moduli npm per l'elaborazione HTML per il collegamento e l'estrazione dei dati insufficienti. Per questo lavoro, ho "esternalizzato" questa elaborazione a un processo scritto in un altro linguaggio di programmazione. Ma le cose stanno cambiando velocemente e dal momento in cui leggerete questo commento, questo problema può già una cosa del passato ...
Partizione del lavoro su diversi server
Un computer non può tenere il passo con spidering l'intero WWW. Devi distribuire il tuo lavoro su diversi server e scambiare informazioni tra loro. Suggerisco di assegnare determinate "gamme di nomi di dominio" a ciascun server: mantenere un database centrale di nomi di dominio con un riferimento a un computer ragno.
Estrarre gli URL dalle pagine Web ricevute in lotti: ordinarli in base al loro nome di dominio; rimuovere i duplicati e inviarli al computer ragno responsabile. Su quel computer, mantieni un indice di URL che sono già stati recuperati e recupera gli URL rimanenti.
Se si mantiene una coda di URL in attesa di essere recuperati su ogni spider computer, non si verificheranno colli di bottiglia nelle prestazioni. Ma è un bel po 'di programmazione per implementare questo.
consultare le normative di
ho citato diversi standard (HTTP/1.x, robots.txt, biscotti). Prenditi il tuo tempo per leggerli e implementarli. Se segui semplicemente esempi di siti che conosci, commetterai degli errori (dimenticarti di parti dello standard che non sono rilevanti per i tuoi campioni) e creerai problemi per quei siti che utilizzano queste funzionalità aggiuntive.
È difficile leggere il documento standard HTTP/1.1. Ma tutti i piccoli dettagli sono stati aggiunti perché qualcuno ha davvero bisogno di quei piccoli dettagli e ora lo usa.
ben scritto e spiega sfide del essendo una vera e propria ragnatela, anche se credo che la questione si riferiva per eseguire la scansione di un sito Web "a" anziché di un'intera rete che può essere eseguita anche meglio di un Web Spider senza troppi sforzi. –
Non ho capito in questa risposta, ma forse questo è incluso: Se non mi sbaglio, "wget" differisce anche dal fatto che * non * scarica/archivia il contenuto mentre "spidering", mentre un web-spider generalmente raccoglie * almeno * alcuni metadati sulle pagine che ha visto. Ho sbagliato? –
wget può essere configurato per salvare le pagine scaricate (ad es. --mirror) – bdonlan