Feb 172011
 

nutch
Oggi vi presento questo ottimo e completo articolo su uno dei moroti di ricerca open source più potenti: Nutch, potete trovare l’articolo originale insieme al codice con gli esempi a questo indirizzo.

Dopo aver letto questo articolo si dovrebbe avere una certa familiarità con i concetti base sul crawling ed i lavori di MapReduce in Nutch.

Che cosa è un web crawler?

Un web crawler è un programma che scopre e scarica contenuti dal web tramite un protocollo HTTP. Il processo di scoperta di un crawler di solito è semplice e lineare. Ad un crawler è prima dato un insieme di URL, spesso chiamato seeds (semi). Dopo di che il crawler parte e scarica il contenuto di tali URL e vengono poi estratti i collegamenti ipertestuali o URL dal contenuto scaricato. Questa è esattamente la stessa cosa che accade nel mondo reale quando un essere umano sta utilizzando  un browser web e clicca sui link di un sito e nelle pagine che seguono, uno dopo l’altro.




Quando un web crawler scopre nuovi URL da seguire, va a recuperare il contenuto di tali URL – proprio come fa un normale browser quando preleva il contenuto dei link di una pagina web quando sono  cliccati. La parte di download è ancora più semplice.  Nel caso semplificato di HTTP, una connessione di rete con l’host è aperta,una richiesta HTTP viene inviata , una risposta HTTP viene letta dalla rete e poi la connessione di rete è chiusa.  Un crawler potrebbe anche  supportare altri mezzi per ottenere il contenuto, rendendolo in grado di trovare e scaricare contenuti dai vari luoghi diversi, come i file system locali o condivisi, server ftp,caselle di posta elettronica, ecc

Crawler casi d’uso

In generale, i crawler sono utilizzati per trovare e caricare il contenuto che ti interessa. Spesso il motivo è che si vuole rendere l’informazione ricercabile per indici. Il caso d’uso e il contesto per il crawling può variare notevolmente a seconda del compito che si deve svolgere. Ad esempio i più popolari motori di ricerca web, come Google e Yahoo, utilizzano un web crawler che trova principalmente contenuti che sono accessibili al pubblico tramite il web. La sfida principale per un web crawler generico è, ovviamente, la scalabilità. L’architettura del crawler deve essere efficiente perché la quantità di contenuti da indicizzare è enorme e crescente nel tempo a velocità sempre maggiore. Un altro esempio, di un tipo completamente diverso di caso d’uso, è un sito di confronto dei prezzi in cui vengono presentati agli utenti i prodotti e le loro informazioni sui prezzi dei vari negozi online.

Per raccogliere queste informazioni si potrebbe implementare un crawler che continuamente re-indicizza i contenuti da un insieme predefinito di siti web, ed è principalmente interessatosolo alcuni indirizzi specifici di questi siti. Un crawler in un contesto di ricerca aziendale possiede un altro set di caratteristiche importanti per quel contesto. Di solito, un crawler aziendale ha bisogno di capire ed estrarre informazioni da vari formati di documenti diversi e di accedere a tali documenti da tanti luoghi diversi, come caselle di posta elettronica, sistemi di CRM esistemi di content management. Comprendere molti diversi formati di documento svolge quindi un ruolo importante.
E ci sono molti altri esempi di esigenze di crawling  che si trovano in mezzo a questi esempi che richiedono ognuno di un insieme di requisiti leggermente diverso per il crawler da soddisfare.

Componenti essenziali di un crawler

Ci sono alcune funzionalità o caratteristiche che sono molto importanti per un crawler. La caratteristica più importante che ogni singolo crawler dovrebbe avere è un senso di cortesia. L’indicizzazione del contenuto dei siti web utilizza le risorse dal server di destinazione, come larghezza di banda e tempo di processore, è obbligatorio limitare la frequenza con cui un crawler accede ad un contenuto particolare oppure il server di destinazione  potrebbe  presto  diventare inaccessibile agli utenti reali. I possessori di un sito Web potrebbe anche voler esporre soltanto una parte dei contenuti disponibili per i crawler web. Per questi casi esiste un metodo chiamato Robots Exclusion Standard che dà al proprietario di un sito web i mezzi per controllare che cosa e quanto spesso  qualcosa può essere recuperato dal server. Un  crawler  educato  rispetta tali norme. Cortesia non è solo seguire le regole, ma rispettare le risorse di un sito anche quando tali norme non siano esplicitamente specificate, limitando la frequenza delle visite di scansione. Le componentipiù comuni di un crawler includono una coda (queue), Fetcher, estrattore (extractor) ed un database dei contenuti (content repository).

La coda contiene gli URL da prelevare. Può essere una semplice lista basata, first in, first out da una coda, ma di solito è più avanzata ed è composta da code basate sugli host, un modo di dare priorità al recupero di URL più importanti, la capacità di memorizzare tutte o parte delle strutture di dati su disco e così via. Il Fetcher è un componente che fa il vero lavoro di ottenere un unico pezzo di contenuto, per esempio una singola pagina HTML. L’estrattore è il componente responsabile per la ricerca di nuovi URL prendendoli, per esempio, dall’estrazione di informazioni da una pagina HTML. Gli URL di recente scoperta sono poi normalizzati ed aggiunti alla coda di indirizzi da prelevare. Il database dei contenuti è il luogo in cui si memorizza il contenuto. Più tardi il contenuto viene elaborato e infine indicizzato. Non ho intenzione di andare più in dettaglio sull’architettura dei crawler e sui dettagli di implementazione, ma invece daremo un’occhiata da vicino una implementazione open source Java di un crawler: Apache Nutch.

Apache Nutch

Nutch è stato inizialmente implementato da Doug Cutting e Michael Cafarella intorno al 2002. L’obiettivo era di fare Nutch una applicazione da usare su tutta la rete per fare crawling e ricerca ed in grado di andare a prendere miliardi di URL al mese, mantenere un indice di queste pagine e permettere la ricerca di tale indice 1000 volte al secondo. Il progetto originale è stato capace di scalare fino a 100 milioni di documenti, ma è diventato impraticabile per problemi di manutenzione con tale scala. Nel corso del 2004, dopo il processo di incubation, Nutch entrò a far parte di Apache. Poco dopo che Google pubblicò la sua carta MapReduce nel 2004, l’architettura Nutch è stato riscritto per sfruttare MapReduce, e un nuovo sistema di storage di dati denominato NutchDistributedFileSystem (NDFS) è stato implementato.

Questa nuova architettura ha permesso a Nutch di essere eseguito su un cluster di macchine di grandi dimensioni, rendendo l’architettura scalabile, sia in potenza di elaborazione che di archiviazione dei dati. In seguito il MapReduce execution framework e NDFS sono state promossi ad un livello superiore del progetto Apache chiamato Apache Hadoop. Hadoop risolve gran parte dei problemi di manutenzione che Nutch aveva nell’epoca pre-MapReduce. Dopo la creazione di un cluster Hadoop è possibile controllare il crawling di Nutch da una singola macchina, indifferentemente dalle dimensione del cluster in cui è in esecuzione Nutch. Nutch come esiste oggi è ancora più o meno un programma che ti aiuta a costruire un generico motore di ricerca web. Sostiene il recupero di contenuti con diversi protocolli quali HTTP, HTTPS, FTP e file system locale. Nutch può anche estrarre il contenuto testuale da diversi formati di documento come HTML, RSS, ATOM, PDF, formati ms (doc, excel, ppt), direttamente dall’installazione base. Nutch non è per tutti in quanto alcune abilità di programmazione a basso livello sono ancora necessarie per eseguire una scansione e mantenere gli indici.

Apache Nutch Internals

Far funzionare Nutch consiste nell’eseguire diversi comandi da shell in sequenza. Ognuno di questi comandi lancia uno o MapReduce job che vengono eseguiti da Hadoop. Adesso vi guiderò attraverso alcuni dei comandi più importanti e come sono costruiti come MapReduce job ed eseguiti. Userò pseudocodice Python-like per descrivere le funzioni semplificate con esempi a scopo illustrativo, ma questo dovrebbe comunque cogliere gli aspetti più essenziali di ciascun job. Prima di entrare nei singoli comandi, i termini di base e dei componenti a cui farò riferimento nel seguito di questo articolo devono essere spiegati. Il Crwal Database è un archivio di dati in cui Nutch memorizza ogni URL, insieme con i metadati di cui è a conoscenza. In termini Hadoop è un Sequence file (ovvero tutti i record sono memorizzati in modo sequenziale), composto di tuple di URL e CrawlDatum. Molte altre strutture di dati in Nutch sono di struttura simile e non vengono utilizzati i database relazionali. La logica dietro questo tipo di struttura dati è la scalabilità.

Il modello semplice, di archiviazione su dati flat funziona bene in un ambiente distribuito. Ogni nodo riceve uno o più pezzi di tutti i dati e lavora su quello (la fase Mappa di MapReduce). I dati possono essere memorizzati all’interno del Hadoop Distributed File System in modo che i nodi possano accedere al pezzo dal più vicino host che contiene una replica di esso. Le operazioni (come inserimenti, eliminazioni e gli aggiornamenti) nel Crawl database e altri dati sono trattati in modalità batch. Ecco un esempio dei contenuti della crawldb:

http://www.example.com/page1.html -> status=..., fetchTime=..., retries=..., fetchInterval=..., ...
http://www.example.com/page2.html -> status=..., fetchTime=..., retries=..., fetchInterval=..., ...
http://www.example.com/page3.html -> status=..., fetchTime=..., retries=..., fetchInterval=..., ...

La Fetch list è una struttura dati (SequenceFile, URL-> Crawldatum) che contiene la URL, tuple crawldatum che stanno per essere recuperati in un unico lotto, di solito il contenuti della Fetch list è un sottoinsieme del CrawlDB che è stato creato dal comando generate.

La Fetch List è conservato dentro un Segment.
Segmento è sostanzialmente una cartella contenente tutti i dati relativi alla recupero di job batch. Oltre che la Fetch list, lo stesso contenuto recuperato sarà memorizzate in aggiunta alla versione estratta in testo puro del contenuto, anchor texts e URLs degli outlinks, protocollo e metadati del documento ecc.

Il Link Database è una struttura dati (file in sequenza, URL -> Inlinks) che contiene tutti i collegamenti invertiti. Nella fase di analisi degli outlinks, Nutch può estrarre da un documento e memorizzarle in formato sorgente url -> target_url, anchor_text. Nel processo di inversione abbiamo invertito l’ordine e unito tutte le istanze in modo che i record di dati nel Database Link siano del tipo: TargetURL -> anchortext[] text in modo che possiamo usare queste informazioni più tardi, quando i singoli documenti saranno indicizzati.

Inject

Il comando Inject in Nutch ha una responsabilità: iniettare più URL bel Crawl Database. Normalmente si dovrebbe raccogliere un insieme di URL per aggiungere e poi elaborarli in un unico batch per mantenere il tempo di un singolo inserimento molto basso.

Generate

Il comando Generate in Nutch è usato per generare un elenco di URL
per andare da recuperare dak Crawl Database, URLs con i punteggi più alti sono preferiti.

Fetch

Il Fetcher è responsabile del recupero dei contenuti da URL e la scrittura su disco. Analizza inoltre facoltativamente il contenuto. Gli URL vengono letti da un elenco di Fetch generato dal Generator.

Parse

Parser legge il contenuto grezzo prelevato, lo analizza e memorizza i risultati.

Updatedb

Il comando updatedb legge il CrawlDatums dal Segment (URLs, estratte
) e le fonde all’esistente CrawlDB.

Invert links

Inverte le Informazioni dei link in modo che possiamo utilizzare gli anchor text di altri documenti che fanno riferimento a un documento insieme con il resto delle informazioni del documento.

Conclusioni

Abbiamo visto una panoramica dei principali MapReduce jobs in Nutch, relativi al crawling
Ci sono anche molti altri jobs di elaborazione delle informazioni in Nutch, come l’indicizzazione, il calcolo del punteggio di una pagin, togliere i contenuti duplicati, etc. Il miglior modo per diventare familiari con gli algoritmi rimanenti è di dare un’occhiata alle seguenti risorse (i link nei riferimenti).
Nel prossimo articolo di questa serie darò uno sguardo ad altri crawler open source.

Risorse

Introduction
to Information Retrieval has a section on crawling

Wikipedia
article on crawling

A Standard for
Robot Exclusion Protocol

Partial
list of open source crawlers implemented in Java

Nutch
source code

Google
MapReduce Paper

Apache Hadoop

A proposito dell’autore

Lucid Imagination è la  società commerciale dedicata  alla tecnologia  Apache  Lucene. La società fornisce software a valore aggiunto,  documentazione,  supporto di tipo commerciale, formazione,  consulenza di alto livello,  e distribuzioni free certificate,  per  Lucene  e  Solr.L’obiettivo di Lucid Imagination è quello di servire come una risorsa centrale per l’intera comunità Lucene sul mercato, di rendere gli sviluppatori di enterprise search più produttivi. I clienti includono AT&T, Sears, Ford, Verizon, Elsevier, Zappos, The Motley Fool, Macy’s, Cisco  e tanti altri nomi noti
Per ulteriori informazioni si prega di  visitare  http://www.lucidimagination.com

Popular Posts:

Flattr this!

  3 Responses to “Crawling nell’Open Source, Parte 1”

  1. Thanks for the Great info!:)

    Don

  2. Nice info :3

    -Ayumone, a system engineer from Japan

  3. Ottimo articolo..grazie mille!

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

*