![]() |
![]() |
|
| Condividi questo contenuto nei Social Network: |
|
Tweet |
|
|
|
Ti stiamo aspettando: Registrati subito e gratis. Entra a far parte di una delle comunità più attive in Italia. Se hai dimenticato i tuoi dati li puoi recuperare subito. |
||||
|
|||||||||
Hey Amico Visitatore, Condividi con noi le tue idee e la tua conoscenza Aprendo una nuova discussione nella sezione Teecno |
|
|
LinkBack | Strumenti di discussione |
|
|
#1 (permalink) |
|
User
|
il parser html più veloce
Questi giorni, sto cercando di ottimizzare il codice dello spider attuale per creare uno spider sull'idea di Osvi.
Effettuando una programmazione modulare, questo pomeriggio ho sviluppato un PARSER html in php cercando di crearne uno più veloce dell'attuale. Il codice del parser è questo: Codice:
function parser_html($html)
{
$len = strlen($html);
$tag['title'] = '';
$tag['h1'] = '';
$tag['body'] = '';
$tag['links'] = array();
for($i = 0 ; $i < $len ; $i++ )
{
if($tag['title']=='' && substr($html,$i,strlen('<title>')) == '<title>')
$tag['title'] = substr($html,$i+strlen('<title>'),strpos(substr($html,$i+strlen('<title>')-1),'</title>')-1);
if($tag['h1']=='' && substr($html,$i,strlen('<h1>')) == '<h1>')
$tag['h1'] = substr($html,$i+strlen('<h1>'),strpos(substr($html,$i+strlen('<h1>')-1),'</title>')-1);
if($tag['body']=='' && substr($html,$i,strlen('<body>')) == '<body>')
$tag['body'] = substr($html,$i+strlen('<body>'),strpos(substr($html,$i+strlen('<h1>')-1),'</body>')-1);
if(substr($html,$i,strlen('<a')) == '<a')
{
$html_rimanente = substr($html,$i);
$href = substr($html_rimanente,strpos($html_rimanente,"href"),strpos($html_rimanente,">")-strpos($html_rimanente,"href"));
$href = str_replace(" ","",$href);
$href = substr($href,strpos($href,"\"")+1,strpos(substr($href,strpos($href,"\"")+1),"\""));
if(substr($href,0,6)!='mailto')
$tag['links'][] = $href;
}
}
$tag['title'] = ereg_replace("[[:punct:]]"," ",$tag['title']); //pulisco dalla punteggiatura
$tag['title'] = str_replace("\n", " ",$tag['title']);
$tag['title'] = trim(preg_replace("/[ \t]{2,}/"," ",$tag['title'])); //sostituisco gli spazi contigui e le tabulazioni con un solo spazio
$tag['h1'] = strip_tags($tag['h1']); //tolgo i tag dalla pagina
$tag['h1'] = ereg_replace("[[:punct:]]"," ",$tag['h1']); //pulisco dalla punteggiatura
$tag['h1'] = str_replace("\n", " ",$tag['h1']);
$tag['h1'] = trim(preg_replace("/[ \t]{2,}/"," ",$tag['h1'])); //sostituisco gli spazi contigui e le tabulazioni con un solo spazio
$tag['body'] = preg_replace("'<script[^>]*?>.*?</script>'si","",$tag['body']); //tolgo eventuale javascript
$tag['body'] = preg_replace("/<h1>(.+?)<\/h1>/si","",$tag['body']); //tolgo gli h1 per non contare 2 volte l'occorrenza dei suoi termini
$tag['body'] = strip_tags($tag['body']); //tolgo i tag dalla pagina
$tag['body'] = ereg_replace("[[:punct:]]"," ",$tag['body']); //pulisco dalla punteggiatura
$tag['body'] = str_replace("\n", " ",$tag['body']);
$tag['body'] = trim(preg_replace("/[ \t]{2,}/"," ",$tag['body'])); //sostituisco gli spazi contigui e le tabulazioni con un solo spazio
return $tag;
}
matrice[0] = testo del titolo matrice[1] = testo di h1 matrice[2] = testo di body (senza nessun tag html) matrice[3] = elenco di links trovati nel codice scusate l'assenza di commenti e la scarsa identazione del codice. Io chiedo a voi membri di creare dei parser html scritti con una funzione simile a quella scritta da me (magari modificando proprio quella mia ) e di postarli in questo 3d. Dopo che avrò ricevuto tutti i parser, farò un benchmark delle prestazioni in termini di tempo di esecuzione e il più rapido sarà utilizzato nello spider di Teecno che sto sviluppando. Buon lavoro. |
|
|
|
|
|
|
|
#2 (permalink) |
|
User
|
allora io ho sviluppato un parser xml (che può essere adattato anche ad html) con xmldom (sia x php4 che php5!) è più efficiente su php4 poichè xmldom è supportato mentre x php5 ho utilizzato un port. il sistema consente l'accesso diretto ai tag, quindi rispetto al tuo substr è più gestibile.
se volete vi posto i listati. |
|
__________________
Fabio Cicerchia - COORDINATORE TEECNO |
|
|
|
|
|
|
#3 (permalink) |
|
User
|
posta posta, purchè rispecchi il modello della funzione ke ho fatto io.. prende l'html come parametro e restituisce la matrice con title, h1, body e lista dei links. Se puoi già adattarlo tu sotto questa forma è bene, m risparmi del lavoro altrimenti lo riadatto io.
|
|
|
|
|
|
#4 (permalink) |
|
Ottimo, posta pure Fabio
Ottimo anche ^woznihack^ ![]() | |
|
__________________
Giorgio Taverniti Blog - Il mio account Twitter! Che aspetti? Diventa MODERATRICE del Forum gt ![]() Importante evento sul Web Marketing: 5 sale, 27 argomenti, 33 esperti presenti, streaming e video registrati...a soli 149€
|
|
|
|
|
|
|
#5 (permalink) |
|
User
|
Salve, sono nuovo su questo forum, mi sono iscritto qualche giorno fa e sono molto interessato a questo progetto..
Secondo le mie idee e quelle di phakko sarebbe meglio creare un spider che si divide in due file.. Primo file del spider esplora soltanto il web, cioè passando un link quest'ultimo esaminando tutta la pagina e facendo il parser del html mi restituisce tutti i links contenenti nella pagina.. che poi vengono slavati nel database, alla fine del parser si ricarica la pagina e pesca dal database un altro link da esaminare.. e così a ciclo un tot di numeri che si vuole parsare di pagine alla volta, si potrebbe mettere questo file nel CronTab soltanto di notte per non rallentare il server di giorno.. La seconda pagina invece pesca i link già esaminati dalla prima pagina del spider e recupera le keywords secondo l'algortmo attuale (Tf*IDF) ecc.... In questo modo si ha un spider molto più veloce, almeno credo... Fatemi sapere cosa ne pensate, cmq se questa idea è ottima ho quasi pronta la prima pagina del spider con diversi controlli sui links, eliminazione di links doppi ecc.... Invece la seconda pagina sarà molto simile al codice scritto in spider attuale... Cosa ne pensate? ![]() |
|
|
|
|
|
#7 (permalink) |
|
__________________
Giorgio Taverniti Blog - Il mio account Twitter! Che aspetti? Diventa MODERATRICE del Forum gt ![]() Importante evento sul Web Marketing: 5 sale, 27 argomenti, 33 esperti presenti, streaming e video registrati...a soli 149€
|
|
|
|
|
|
|
#8 (permalink) |
|
Esperto
|
scusate ma per recuperare il title di una pagina non è meglio utilizzare una regular expression?
<title>(.+)</title> |
|
__________________
Domenico Biancardi |
|
|
|
|
|
|
#9 (permalink) |
|
Esperto
|
ho letto per bene il codice dello spider, e si usano le regular expression, molto bene
mi piace molto come è stato progettato. volevo sapere se avete adottato qualche strategia information retrieval all'interno della ricerca. |
|
__________________
Domenico Biancardi |
|
|
|
|
|
|
#10 (permalink) |
|
Esperto
Data di registrazione: Jun 2006
Ubicazione: Subpadania
Messaggi: 1,257
|
Un consiglio: usatele il meno possibile, le funzioni di PHP basate su espressioni regolari. Sono molto più lente di str_replace() e str_ireplace().
Una domanda (alla quale prima o poi vi troverete a dover rispondere): come vi comportate con una pagina priva di tag <title>? Eheheh. |
|
|
|
|
|
#11 (permalink) | |
|
Esperto
|
Quote:
| |
|
__________________
Domenico Biancardi |
||
|
|
|
|
|
#12 (permalink) | |
|
Esperto
Data di registrazione: Jun 2006
Ubicazione: Subpadania
Messaggi: 1,257
|
Quote:
Comunque, se non ti fidi della mia affermazione, ti basta una semplice ricerca su Google per verificarla. | |
|
|
|
|
|
#13 (permalink) |
|
Esperto
|
no no questione di affezioniamento verso le regular expression. fare operazioni complesse in una istruzione è sempre molto bello, magari a scapito della velocità.
sta di fatto che per certe regex dovresti utilizzare 5-6 istruzioni di str_replace non so dovrei fare dei test rimango dubbioso |
|
__________________
Domenico Biancardi |
|
|
|
|
|
|
#15 (permalink) |
|
User
Data di registrazione: Sep 2005
Messaggi: 451
|
Io ho un consiglio da darvi in base alla mia esperienza, calcolando che ho spiderizzato qualche milione di pagina web spero che vi possa essere utile.
Fate enorme attenzione agli errori del codice html, non sembra ma incasinano di brutto. Sembra una boiata come consiglio, ma vi accorgerete che è un problema enorme! |
|
__________________
Hai visto il nuovo tools per fare i whois ai domini ? |
|
|
|
|