Ho caricato un progetto di un crawler fatto in c# con visual studio 2008 e sql server 2005 che permette lo scarico e l’analisi di un noto sito italiano di moto. Il progetto per semplicità è diviso in due sotto progetti. Il primo si occupa dello scarico fisico delle pagine html in una cartella, l’altro invece rianalizza tutti i files parsando con le regular expression i campi che mi interessavano salvandoli nel database, inoltre scarica le immagini e le salva nella stessa cartella delle pagine. Per come era stato fatto (agosto 2009) è un po lento. Bisognerebbe spezzarlo in diversi thread per aumentarne la velocità e fare l’analisi delle pagine senza scaricarle, ma non avevo tempo per migliorarlo, spero possa essere utile come esempio.
Esempio Crawler c#
A questo punto con i dati scaricati possiamo analizzare il contenuto html e prelevare quello che ci serve tramite le regular expression:
// Recupero il Genere
string pattern = @"
.*? (?.*?)
";
Match mc = Regex.Match(Page, pattern, RegexOptions.IgnoreCase);
try
{
if (mc.Success)
{
_schedaDb.Genere = mc.Groups["Genere"].Value.ToUpper();
}
}
catch (Exception ex)
{
fileLog.WriteFileLog(String.Format("Errore nel recupero del dato Genere per la scheda: {0}, item: {1}, errore: {2}", _scheda._id, _scheda._nomeitem, ex.Message), true);
}
// Recupero il Produttore
pattern = @"
.*? (?
.*?)
";
mc = Regex.Match(Page, pattern, RegexOptions.IgnoreCase);
try
{
if (mc.Success)
{
_schedaDb.Produttore = mc.Groups["Produttore"].Value.ToUpper();
}
}
catch (Exception ex)
{
fileLog.WriteFileLog(String.Format("Errore nel recupero del dato Produttore per la scheda: {0}, item: {1}, errore: {2}", _scheda._id, _scheda._nomeitem, ex.Message), true);
}
// Recupero il Sviluppatore
pattern = @"
.*? (?.*?)
";
mc = Regex.Match(Page, pattern, RegexOptions.IgnoreCase);
try
{
if (mc.Success)
{
_schedaDb.Sviluppatore = mc.Groups["Sviluppatore"].Value.ToUpper();
}
}
catch (Exception ex)
{
fileLog.WriteFileLog(String.Format("Errore nel recupero del dato Sviluppatore per la scheda: {0}, item: {1}, errore: {2}", _scheda._id, _scheda._nomeitem, ex.Message), true);
}
L’unico problema sono le regular expression da conoscere e testare. Io per questo mi sono basato su un tool scritto da Francesco Balena che trovate qui
In questo esempio vedremo come costruire un semplice crawler per recuperare i dati da un sito scritto in .net e salvarne le informazioni in un database sql server 2005:
Per prima cosa dobbiamo creare un applicazione console con visual studio 2008 e nel main aggiungere la sezione per il download delle pagine, che poi verranno processate tramite regular expression per ricavarne i dati da salvare nel database:
// Aggancio i filtri
HttpWebRequest req = WebRequest.Create(Utils.ConcatUrls(Settings.Default.Host, Settings.Default.ListSchedePages)) as HttpWebRequest;
// Aggancio gli eventuali cookies
//req.CookieContainer = cookies;
byte[] data = null;
// Passo i dati
StringBuilder sb = new StringBuilder();
sb.Append("__EVENTVALIDATION=");
sb.Append(HttpUtility.UrlEncode("/wEWMQixQE="));
sb.Append("&__VIEWSTATE=");
sb.Append(HttpUtility.UrlEncode("/wEPDmRk"));
sb.Append("&drpGeneri=[All]&drpPeriodo=0&p_corrente=");
int pageNumber = 1;
data = System.Text.Encoding.ASCII.GetBytes(sb.ToString() + pageNumber);
req.Method = "post";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = data.Length;
// Passo i dati per filtrare
Stream outputStream = req.GetRequestStream();
outputStream.Write(data, 0, data.Length);
outputStream.Close();
// Leggo la risposta
WebResponse response = req.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream, Encoding.Default);
string Page = reader.ReadToEnd();
reader.Close();
responseStream.Close();
response.Close();
In questo caso è da notare che già a questo punto nella stringa Page abbiamo il contenuto della pagina che vogliamo analizzare (registrata nei settings del progetto Settings.Default.Host, Settings.Default.ListSchedePages).
Un crawler (detto anche spider o robot), è un software che analizza i contenuti di una rete (o di un database) in un modo metodico e automatizzato, in genere per conto di un motore di ricerca.
Un crawler è un tipo di bot (programma o script che automatizza delle operazioni). I crawler solitamente acquisiscono una copia testuale di tutti i documenti visitati e le inseriscono in un indice.
Un uso estremamente comune dei crawler è nel Web. Sul Web, il crawler si basa su una lista di URL da visitare fornita dal motore di ricerca (il quale, inizialmente, si basa sugli indirizzi suggeriti dagli utenti o su una lista precompilata dai programmatori stessi). Durante l’analisi di un URL, identifica tutti gli hyperlink presenti nel documento e li aggiunge alla lista di URL da visitare. Il processo può essere concluso manualmente o dopo che un determinato numero di collegamenti è stato seguito.
Inoltre i crawler attivi su Internet hanno la facoltà di essere indirizzati da quanto indicato nel file “robots.txt” posto nella root del sito. All’interno di questo file, è possibile indicare quali pagine non dovrebbero essere analizzate. Il crawler ha la facoltà di seguire i consigli, ma non l’obbligo.
Ecco di seguito una tabella con i nomi degli spider dei principali motori di ricerca
| Nome spider |
Motore di ricerca |
| googlebot |
Google |
| fast |
Fast – Alltheweb |
| slurp |
Inktomi – Yahoo! |
| scooter |
Altavista |
| mercator |
Altavista |
| Ask Jeeves |
Ask Jeeves |
| teoma_agent |
Teoma |
| ia_archiver |
Alexa – Internet Archive |
| googlebot |
Yahoo |
Dati aggiornati al 21/02/2008
Esempi di Web crawlers
La seguente è una lista di architetture pubbliche di crawler di carattere generico:
- RBSE (Eichmann, 1994) è stato il primo crawler pubblico. È basato su due programmi: il primo, “spider” mantiene la richiesta in un database relazionale, e il secondo “mite“, è un browser www ASCII che scarica le pagine dal web.
- WebCrawler (Pinkerton, 1994) è stato usato per costruire il primo indice testuale di pubblicità di un ramo del web. Era basato su lib-WWW per scaricare le pagine, e un altro programma per analizzare e ordinare URL per esplorazione tramite metodo grafico breadth-first. Include anche un crawler in tempo reale che segue i collegamenti basati sulle similarità del testo-ancora con la query condizionale.
- World Wide Web Worm (McBryan, 1994) era un crawler usato per costruire un semplice indice di titoli di documento e URL. L’indice poteva essere cercato usando il comando grep Unix.
- Google Crawler (Brin and Page, 1998) è descritto in alcuni dettagli, ma il riferimento è solo su una precedente versione di quell’architettura, la quale è basata su C++ e Python. Il crawler fu integrato col processo di indicizzazione, perché la selezione del testo fu fatta per indicizzare completamente il testo e anche per l’estrazione degli URL. Un server URL invia liste di URL per essere prelevato da diversi processi di crawling. Durante il parsing, gli URL trovati sono inviati a un server URL che controlla se l’URL è stato visto precedentemente. Se no, l’URL è aggiunto all’interrogazione del server URL.
- CobWeb (da Silva et al., 1999) usato come schedulatore centrale e serie di collettori distribuiti. I collettori parsificano le pagine web scaricate e inviano gli URL scoperti allo schedulatore, il quale assegna il turno ai collettori. Lo schedulatore rinforza la ricerca ordinata breadth-first con una politica senza ordine per evitare il sovraccarico dei server web. Il crawler è scritto in Perl.
- Mercator (Heydon and Najork, 1999; Najork and Heydon, 2001) è un web crawler modulare distribuito e scritto in Java. La sua modularità sorge dall’uso di “moduli di protocollo” intercambiabili e “modelli di processo”. I moduli di protocollo sono correlati per acquisire le pagine web (es: HTTP), e i moduli di processo sono correlati per processare le pagine web. I moduli standard possono essere usati per indicizzare il testo delle pagine, o per raccogliere statistiche dal Web.
- WebFountain (Edwards et al., 2001) è un crawler simile a Mercator ma scritto in C++. La sua particolarità sta nella “controller machine” che coordina una serie di “macchine-formiche”. Dopo un ripetitivo scarico di pagine, un fattore di cambio è calcolato per ogni pagina e un metodo di programmazione non lineare deve essere usato per risolvere il sistema di equazione per massimizzare l’aggiornamento. Gli autori raccomandano di usare questo ordine di crawling nelle prime parti, e poi scambiare l’ordine uniforme nel quale tutte le pagine sono state visitate con la stessa frequenza.
- PolyBot [Shkapenyuk and Suel, 2002] è un crawler scritto in C++ e Python, composto da un manager, uno o più downloader e uno o più rilevatori DNS . Gli URL collezionati sono aggiunti su disco e processati più tardi per cercarli in modalità batch. La regolamentazione considera entrambi domini di terzi e secondi livelli (es di terzo: www.aaa.com, www2.aaa.com) perché i domini di terzo livello sono solitamente ospitati dallo stesso webserver
- WebRACE (Zeinalipour-Yazti and Dikaiakos, 2002) è un modulo sviluppato in java di crawling e caching, e usato come parte di un sistema più generico chiamato eRACE. La maggior funzionalità che spicca in Webrace è che, mentre molticrawler iniziano a cercare con un set di semi URL, WebRACE riceve continuamente nuovi URL dal form.
- Ubicrawler (Boldi et al., 2004) è un crawler scritto in Java. È composto da un numero di ‘agenti’ identici e la funzione di assegnamento è calcolata usando l’hashing dei nomi di host. Non c’è overlap, questo significa che nessuna pagina è indicizzata due volte, fino a quando un agente crawler non crasha; raggiunge alta scalabilità ed è tollerante ai fallimenti.
- FAST Crawler (Risvik and Michelsen, 2002) è un crawler usato dai Fast Search & Transfer.
- Labrador,un crawler privato che collabora con il progetto Open Source chiamato Terrier Search Engine.
- Spinn3r,un crawler usato per costruire l’anima di Tailrank.com. Spinn3r è basato sul java e la maggior parte dell architettura é Open Source.
- HotCrawler, è scritto in C e PhP.
Crawler di tipo open-source
- DataparkSearch è un crawler e motore di ricerca rilasciato sotto la General Public License (GNU).
- Wget è un crawler a linea di comando scritto in C e rilasciato sotto General Public License.. È tipicamente usato per siti mirror e FTP.
- Heritrix è il crawler di maggior qualità di estrazione dagli archivi web, studiato per archiviare periodici screenshot di una larga porzione del web. È stato scritto in java.
- ht://Dig include un crawler web nel suo motore di indicizzazione
- HTTrack usa un web crawler per creare una replica di un sito web per la consultazione offline. È stato scritto in C e rilasciato sotto licenza GNU. Si può trovare presso il sito ufficiale.
- JSpider è un web spider altamente personalizzabile rilasciato sotto licenza GPL *Larbin
- Webtools4larbin
- Methabot È un web crawler ottimizzato per la velocità e con linea di comando scritta in C e rilasciato sotto licenza ISC. Comprende un sistema di configurazione, un modulo di sistema e supporto per obiettivi di crawling attraverso il file system locale, HTTP o FTP.
- Nutch è un crawler scritto in java sotto licenza Apache. Può essere usato assieme all’indice testuale creato con Lucene.
- WebVac è un crawler usato dal Stanford WebBase Project.
- WebSPHINX (Miller and Bharat, 1998) è composto da una libreria Java che implementa la query multipla delle pagine web e il parsing HTML, un’interfaccia utente grafica per impostare il/gli indirizzo/i di partenza per estrarre i dati scaricati e per implementare un motore di ricerca basilare di testo.
- WIRE – Web Information Retrieval Environment (Baeza-Yates and Castillo, 2002) è un web crawler scritto in C++ e rilasciato sotto licenza GPL, inclusi diverse linee di condotta per catalogare le pagine web scaricate e un modulo per generare statistiche e rapporti sulle pagine scaricate, usato per la caratterizzazione web.
- LWP::RobotUA (Langheinrich , 2004) è una classe Perl per implementare i comportamenti migliori dei bot we distribuita sotto licenza Perl5.
- Web Crawler web crawler Open source per .NET scritto in C#).
- Sherlock Holmes Sherlock Holmes raccoglie e indicizza dati testuali (file di testo, pagine web, ecc.), sia localmente che nella rete. Holmes è sponsorizzato e usato commercialmente dal portale web ceco Centrum. è usato inoltre dal sito Onet.pl.
- YaCyé un motore di ricerca liberamente distribuito, costruito sui principi dei network di p2p (sotto licenza GPL).
- Ruya Ruya è open source ad alte prestazioni basato sulla ricerca Breadth-first, crawler di livello base. È usato per gestire siti web inglesi e giapponesi nel miglior modo possibile . È rilasciata sotto licenza GPL e scritto interamente in linguaggio Python.
- Universal Information Crawler web crawler di uso veloce. Salva e analizza i dati.
- Agent Kernel Una struttura java per pianificare, trattare e stoccare i dati durante il crawling.
- Spider News,informazioni per costruire uno spider in Perl.
- Squzer, un web crawler open-source, espandibile, multifunzione scritto in Python.
- Arachnode.NET, Web crawler open source promiscuo per scaricare, indicizzare e salvare contenuti Internet incluse e-mail, file, hyperlink, immagini e pagine web. Arachnode.net è scritto in C# usando SQL Server 2005 e è rilasciato sotto licenza GPL.
Fonte wikipedia