Crawling Ilaria IdaBordino Mele Ida Mele Sapienza Università di Roma Sapienza Università di Roma 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 Pagina 2 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 Pagina 3 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 Pagina 4 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 Pagina 5 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 Pagina 6 Nutch: Architettura Crawling Pagina 7 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 Pagina 8 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 Pagina 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 Pagina 10 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 Pagina 11 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 Pagina 12 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 Pagina 13 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 Pagina 14 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 Pagina 15 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 Pagina 16 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 Pagina 17 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 Pagina 18 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 Pagina 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 Pagina 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 Pagina 21 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 Pagina 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 Pagina 23 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 Pagina 24 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 Pagina 25 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 Pagina 26 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 cleanedlinks.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 Pagina 27 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 Pagina 28 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 Pagina 29 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 Pagina 30 WEB Nutch readdb Link structure ParserDB db graph.txt getfiles txt2IPS files MG4J Crawling RankPG Query PageRank QueryMG4J RankHITS HITS IPS Pagina 31