Crawling Ida Mele Sapienza Università di Roma Ilaria Bordino Ida Mele
Software open source costruito al top di Jakarta Lucene. Nutch Framework Apache per la costruzione di crawler scalabili e applicazioni per Web Search. Software open source costruito al top di Jakarta Lucene. URL: http://nutch.apache.org Disponibile gratuitamente presso: http://www.apache.org/dyn/closer.cgi/nutch/ Crawling
Java API per lo sviluppo di motori di ricerca testuali. Jakarta Lucene Java API per lo sviluppo di motori di ricerca testuali. Non applicazione, ma API che consente la realizzazione di search applications customizzate in base alle specifiche esigenze degli sviluppatori. Grande comunità di sviluppatori. Tecnologia usata nello sviluppo di molti siti e applicazioni web (furl, zoe, jira, lookout). URL: http://jakarta.apache.org/lucene Crawling
Lucene: principali caratteristiche Indicizzazione scalabile e performante. Algoritmi per la Search potenti, accurati ed efficienti. Include supporto per: ranked searching, fielded searching, wildcard queries, phrase queries, proximity queries, range queries and more. Ricerca su molteplici indici con merging dei risultati. Permette esecuzione simultanea di update e search. Cross platform solution: 100% java, disponibile come software open source. Crawling
Giovane progetto open source. Nutch Giovane progetto open source. Software per lo sviluppo di applicazioni per Web Search. Non è un sito di ricerca, ma intende essere un mezzo per potenziare molti siti di ricerca. Non è un progetto di ricerca, ma intende essere un supporto per la ricerca. Obiettivi: incrementare la disponibilità di tecnologie per Web Search; aumentare la trasparenza nella Web search. Crawling
Nutch: Obiettivi tecnici Scalare all’intero Web: milioni di server differenti, miliardi di pagine, il completamento di un crawl richiede settimane, c’è molto rumore nei dati. Supporto per traffico elevato (migliaia di ricerche al secondo). Qualità paragonabile allo stato dell’arte per la search. Crawling
Nutch: Architettura Crawling
Input: un set di pagine html. Nutch: motore di ricerca configurabile dall'utente Permette la raccolta delle pagine, l’indicizzazione e l’interrogazione delle pagine web. Input: un set di pagine html. Output: motore di ricerca sulle pagine raccolte. Uso: raccolta di pagine e ricerca sulla collezione indicizzata. Crawling
Download: http://www.apache.org/dyn/closer.cgi/nutch/ Nutch: download Download: http://www.apache.org/dyn/closer.cgi/nutch/ Scaricare una delle ultime release. Tutorial: http://wiki.apache.org/nutch/NutchTutorial Presentazione generale del codice: http://nutch.apache.org/apidocs-1.4/index.html Crawling 9
Nutch: configurazione A partire da Nutch 0.9 è richiesta Sun JDK 1.5 o superiore: http://www.oracle.com/technetwork/java/javase/downloads/index.html Tomcat di Apache 5.x: http://tomcat.apache.org/ Almeno un GigaByte su disco. Connessione Internet veloce. Tempo :-) Crawling
Nutch: configurazione (2) Inizializzare NUTCH_JAVA_HOME con la directory radice di Java: LINUX: edit .bashrc per inserire: export NUTCH_JAVA_HOME=/usr/local/lib/... MAC OS: export NUTCH_JAVA_HOME=/Library/Java/Home Aggiungere NUTCH/bin al PATH (N.B. NUTCH rappresenta la directory radice di nutch): edit .bashrc per inserire: export PATH=$PATH:NUTCH/bin (x la release 1.1) export PATH=$PATH:NUTCH/runtime/local/bin (x la release 1.4) Nota: devono sempre essere controllate e impostazioni locali della vostra macchina. Riavviate il terminale dopo le modifiche, infine se necessario modificate i permessi di nutch. Crawling
Nutch: configurazione (3) Nelle nuove versioni di nutch è necessario configurare alcuni parametri come l’identificatore dello user-agent. Editare il file conf/nutch-default.xml settando alcune proprietà minimali: <property> <name>http.agent.name</name> <value>...</value> <description> HTTP 'User-Agent' request header. MUST NOT be empty - please set this to a single word uniquely related to your organization. </description> </property> Crawling
Nutch: configurazione (4) Si possono anche configurare altre proprietà. Contenuto del file /conf/nutch-default.xml: NOTE: You should also check other related properties: http.robots.agents http.agent.description http.agent.url http.agent.email http.agent.version and set their values appropriately. Crawling
Nutch: configurazione (5) <property><name>http.agent.description</name> <value></value><description>Further description of our bot- this text is used in the User-Agent header. It appears in parenthesis after the agent name. </description></property><property> <name>http.agent.url</name> <value></value> <description>A URL to advertise in the User-Agent header. This will appear in parenthesis after the agent name. Custom dictates that this should be a URL of a page explaining the purpose and behavior of this crawler. </description></property><property> <name>http.agent.email</name> <value></value> <description>An email address to advertise in the HTTP 'From' request header and User-Agent header. A good practice is to mangle this address (e.g. 'info at example dot com') to avoid spamming. </description></property> Crawling
Crawlare il Web con Nutch Nutch è stato progettato per la gestione di crawl su larga scala, che siano eseguiti in un sistema distribuito e che possono richiedere molto tempo (settimane) per il completamento. I dati raccolti sono organizzati nel modo seguente: crawldb: database del crawl. Contiene info su ogni url nota a nutch, incluso se e quando è stato fatto il fetching; linkdb: database dei link. Contiene inlink noti a tutte le url raccolte, riportando url sorgente e anchor text; segments: un insieme di segmenti; un segmento è un insieme di URL considerate come un’unità durante il fetching; indexes: indici nel formato supportato da Lucene. Crawling
Crawlare il Web con Nutch Un segmento è una directory che contiene le seguenti sottodirectory: - crawl_generate: contiene l'elenco delle URL di cui bisogna fare il fetching; - crawl_fetch: contiene lo stato di fetching di ogni URL; - content: mantiene il contenuto associato a ogni URL; - parse_text: contiene il testo estratto con il parsing da ogni URL; - parse_data: contiene outlink e metadata estratti con il parsing; - crawl_parse: contiene gli outlink, usati per aggiornare crawldb. Crawling
Nutch: due approcci al crawling Intranet crawling: si utilizza comando crawl. Scelta appropriata se si vuole effettuare un crawl di dimensioni limitate, fino a 1M pagine. Whole-Web crawling: da utilizzare per crawl molto estesi, che abbiano bisogno di una quantità notevole di tempo e di risorse computazionali. Si utilizzano comandi a più basso livello come ad esempio: admin db -create, inject, generate, fetch, updatedb per avere un maggiore controllo e/o per fare update dei dati esistenti. Crawling
Raccolta delle pagine del DIS Creare nella directory radice di nutch il file urls e inserire la url della home page del sito di cui si vuole fare crawling: Es: http://www.dis.uniroma1.it Modificare il file conf/crawl-urlfilter.txt (x la release 1.1) conf/automaton-urlfilter.txt (x la release 1.4) per personalizzare la raccolta. Aggiungere: +^http://([a-z0-9]*\.)*dis.uniroma1.it/ per limitare la raccolta alle pagine al dominio: dis.uniroma1.it. Eventualmente eliminare (rimuovere o commentare) la riga: -[?*!@=] Crawling
Raccolta delle pagine: crawl Lista di alcuni parametri: <urlDir>: root directory con le url; [-dir d]: directory dove saranno memorizzati i risultati della raccolta; [-threads n]: numero di threads eseguiti in parallelo; [-depth i]: profondità dei path a partire dalla pagina radice. Crawling delle pagine del DIS: nutch crawl urls -dir mycrawl –depth 5 >& mycrawl.log NON ESEGUIRE A LEZIONE!!! Crawling 19
Interrogazione del DB: readdb Usage: CrawlDbReader <crawldb> (-stats | -dump <out_dir> | -topN <nnnn> <out_dir> [<min>] | -url <url>) <crawldb>: nome della directory contenente il crawldb; -stats[-sort]: stampa le statistiche su System.out. -sort stampa ordinato per host; -dump<out_dir>[format normal|csv]: effettua il dump dell'intero database in out_dir. Il dump è in formato standard con -format normal (default), è in formato csv (valori separati da virgole) con -format csv. -topN <nnnn><out_dir> [min]: effettua il dump in out_dir delle prime nnnn urls ordinate per score. Si possono saltare i record il cui lo score è inferiore ad un valore minimo indicato in min. -url <url>: stampa informazioni riguardanti url su System.out. Crawling 20
Interrogazione del DB: readdb (2) Dopo aver eseguito un crawl possiamo stampare statistiche, o fare il dump dell'intero database. ll comando: nutch readdb mycrawl/crawldb -stats > stats.txt stampa statistiche come ad esempio: il numero di urls, il punteggio min, max e medio delle pagine, ecc. Il comando: nutch readdb mycrawl/crawldb -dump mydump crea il dump del database. Per ogni pagina abbiamo informazioni quali: data e ora in cui si è fatto il fetch, data e ora della modifica, numero di retries, intervallo di retry, score, ecc. more mydump/part-00000. Crawling
Interrogazione del DB: readlinkdb Usage: LinkDbReader <linkdb> (-dump <out_dir> | -url <url>) <linkdb>: nome della directory contenente il linkdb; -dump<out_dir>: effettua il dump dell'intero database di link in out_dir. -url <url>: stampa informazioni riguardanti url su System.out. Crawling 22
Interrogazione del DB: readlinkdb (2) Dopo aver eseguito un crawl possiamo analizzare la struttura degli hyperlink della collezione raccolta. Il comando: nutch readlinkdb mycrawl/linkdb/ -dump mylinks crea una directory chiamata mylinks che conterrà informazioni sugli inlink delle URL create in semplice formato testuale. more mylinks/part-00000. Con egrep -v $'^$' mylinks/part-00000 >inlinks.txt si crea un file con i link entranti. Crawling
Estrazione degli outlink: readseg Il database linkdb fornisce informazioni relavimente ai soli link entranti. Per estrarre gli outlink dai dati raccolti dobbiamo leggere i segmenti. Usiamo il comando readseg: Usage: SegmentReader (-dump ... | -list ... | -get ...) [general options] -dump <segment_dir> <output> [general options]: effettua il dump dei segmenti presenti nella directory segment_dir nel file di testo <output>. Le opzioni sono: - nocontent, -nofetch, -nogenerate, -noparse, - noparsedata, -noparsetext. -list ...: stampa su System.out il contenuto di più segmenti. -get ...: stampa su System.out il contento di un segmento. Crawling
Estrazione degli outlink: mergesegs Dato che si vuole estrarre gli outllink da un unico segmento globale, ottenuto unendo i vari segmenti. Usiamo il comando mergesegs: Usage: SegmentMerger output_dir (-dir segments | seg1 seg2...) [-filter][-slice NNNN] output_dir: directory che conterrà il/i pezzo/i di segmento d'output; -dir segments: directory contente i vari segmenti; seg1 seg2 ...: lista di directory con i segmenti; -filter: elimina le URLs proibite nel URLFilter. -slice NNNN: crea più segmenti di output, ognuno contenente NNNN urls. Crawling
Estrazione outlink: esempio Usiamo il comando mergeseg per fondere i vari segmenti ottenuti con il crawling: nutch mergesegs whole-segments -dir mycrawl/segments/ Quindi usiamo il comando readseg per estrarre outlink dal segmento globale ottenuto: nutch readseg -dump whole-segments/20111204174133/ dump-outlinks N.B. Ogni segmento viene identificato con la data e l'ora in cui è stato creato. Nell'esempio la directory è: 20111204174133 perché il segmento è stato creato il 2011-12-04 alle 17:41:33. Infine utilizziamo il seguente comando: cat dump-outlinks/dump | egrep 'URL|toUrl' >outlinks.txt per creare il file con i soli outlink. Crawling
Creazione della lista dei link Utilizziamo nutchGraph.jar già presente in lib disponibile sul sito. Settare il classpath ed eseguire: java nutchGraph.PrintInlinks inlinks.txt >links.txt java nutchGraph.PrintOutlinks outlinks.txt >>links.txt Rimozione di eventuali duplicati: LANG=C sort links.txt | uniq >cleaned-links.txt Con more verrà visualizzato il contenuto di cleaned- links.txt. Per file molto lunghi invece di more si può utilizzare head per la visualizzazione delle prime righe o tail per la visualizzazione delle ultime righe. Crawling
Creazione mappa delle URL cut -f1 links.txt >url-list.txt cut -f2 links.txt >>url-list.txt LANG=C sort url-list.txt | uniq >sorted-url-list.txt java -Xmx2G it.unimi.dsi.util.FrontCodedStringList -u -r 32 umap.fcl < sorted-url-list.txt java -Xmx2G it.unimi.dsi.sux4j.mph.MWHCFunction umap.mph sorted-url-list.txt Crawling
numNodes=$(wc -l < sorted-url-list.txt) Creazione del grafo java -Xmx2G nutchGraph.PrintEdges cleaned-links.txt umap.mph > webgraph.dat numNodes=$(wc -l < sorted-url-list.txt) java -Xmx2G nutchGraph.IncidenceList2Webgraph $numNodes webgraph java -Xmx2G it.unimi.dsi.webgraph.BVGraph -g ASCIIGraph webgraph webgraph Crawling
Download delle pagine html Procediamo all'indicizzazione delle pagine raccolte da Nutch mediante MG4J. Le pagine devono essere precedentemente scaricate, visto che non è possibile ottenerle dal db di Nutch. Scaricare le pagine: wget –i sorted-url-list.txt Crawling
WEB Nutch getfiles MG4J IPS Link structure txt2IPS files readdb ParserDB db graph.txt getfiles txt2IPS files PageRank RankPG QueryMG4J IPS MG4J Query HITS RankHITS Crawling