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