Domanda

In che modo è possibile analizzare in modo intelligente i dati restituiti dai risultati della ricerca su una pagina?

Ad esempio, supponiamo che vorrei creare un servizio Web che cerchi libri online analizzando i risultati di ricerca dei siti Web di molti fornitori di libri. Potrei ottenere i dati HTML grezzi della pagina e fare alcune regex per far funzionare i dati per il mio servizio Web, ma se uno qualsiasi dei siti Web cambia la formattazione delle pagine, il mio codice si rompe!

RSS è davvero un'opzione meravigliosa, ma molti siti non hanno una ricerca basata su XML / JSON.

Esistono kit che aiutano a diffondere automaticamente le informazioni sulle pagine? Un'idea folle sarebbe quella di avere un modulo AI sfocato riconoscere i pattern in una pagina dei risultati di ricerca e analizzare i risultati di conseguenza ...

È stato utile?

Soluzione

Ho fatto un po 'di questo recentemente, ed ecco le mie esperienze.

Esistono tre approcci di base:

  1. Espressioni regolari.
    • Più flessibile, più facile da usare con informazioni vagamente strutturate e formati che cambiano.
    • Più difficile eseguire analisi strutturali / tag, ma più facile eseguire la corrispondenza del testo.
    • Convalida integrata della formattazione dei dati.
    • Più difficile da mantenere rispetto ad altri, perché devi scrivere un'espressione regolare per ogni modello che desideri utilizzare per estrarre / trasformare il documento
    • Generalmente più lento di 2 e 3.
    • Funziona bene per elenchi di elementi con formattazione simile
    • Sarà utile un buon strumento di sviluppo / test regex e alcune pagine di esempio. Ho buone cose da dire su RegexBuddy qui. Prova la loro demo.
    • Ho avuto il maggior successo con questo. La flessibilità ti consente di lavorare con codice HTML sgradevole, brutale e selvaggio.
  2. Converti HTML in XHTML e usa gli strumenti di estrazione XML. Pulisci HTML, convertilo in XHTML legale e usa XPath / XQuery / X-qualunque cosa per interrogarlo come dati XML.
    • Strumenti: TagSoup, HTMLTidy, ecc
    • La qualità della conversione da HTML a XHML è MOLTO importante e altamente variabile.
    • La migliore soluzione se i dati desiderati sono strutturati in base al layout e ai tag HTML (dati in tabelle HTML, elenchi, gruppi DIV / SPAN, ecc.)
    • Ideale per ottenere strutture di collegamenti, tabelle nidificate, immagini, elenchi e così via
    • Dovrebbe essere più veloce dell'opzione 1, ma più lento dell'opzione 3.
    • Funziona bene se la formattazione del contenuto cambia / è variabile, ma non la struttura / il layout del documento.
    • Se i dati non sono strutturati da tag HTML, sei nei guai.
    • Può essere utilizzato con l'opzione 1.
  3. Generatore di parser (ANTLR, ecc.) - crea una grammatica per l'analisi & amp; analizzando la pagina.
    • Non ho provato questo perché non era adatto alle mie pagine (disordinate)
    • Più adatto se la struttura HTML è altamente strutturata, molto costante, regolare e non cambia mai.
    • Usalo se ci sono schemi facili da descrivere nel documento, ma non coinvolgono tag HTML e comportano ricorsioni o comportamenti complessi
    • Non richiede input XHTML
    • Velocità più veloce, generalmente
    • Grande curva di apprendimento, ma più facile da mantenere

Ho armeggiato con raccolta web per l'opzione 2, ma trovo il loro la sintassi deve essere piuttosto strana. Mix di XML e alcuni linguaggi di scripting pseudo-Java. Se ti piace Java e ti piace l'estrazione di dati in stile XML (XPath, XQuery), questo potrebbe essere il biglietto che fa per te.


Modifica: se usi espressioni regolari, assicurati di utilizzare una libreria con quantificatori e gruppi di acquisizione pigri! Le vecchie librerie regex di PHP mancano di queste e sono indispensabili per abbinare i dati tra tag di apertura / chiusura in HTML.

Altri suggerimenti

Senza una struttura HTML riparata da analizzare, oderei mantenere espressioni regolari per la ricerca di dati. Potresti avere più fortuna ad analizzare l'HTML attraverso un parser appropriato che costruisce l'albero. Quindi seleziona gli elementi ... che sarebbero più gestibili.

Ovviamente il modo migliore è l'output XML dal motore con un markup fisso che è possibile analizzare e convalidare. Penserei che una libreria di analisi HTML con qualche sondaggio "in the dark" dell'albero prodotto sarebbe più semplice da mantenere rispetto alle espressioni regolari.

In questo modo, devi solo controllare < a href = " blah " class = " cache_link " > ... che si trasforma in < a href = " blah " class = " cache_result " > ... o altro.

Linea di fondo, grepping elementi specifici con regexp sarebbe triste. Un approccio migliore è quello di costruire un modello DOM simile alla pagina e cercare "ancore" ai dati dei caratteri nei tag.

O invia un'e-mail al sito indicando un caso per un'API XML ... potresti essere assunto!

Non dici quale lingua stai usando. Nella terra di Java puoi usare TagSoup e XPath per ridurre al minimo il dolore. C'è un esempio da questo blog (ovviamente XPath può diventare molto più complicato a seconda delle esigenze):

URL url = new URL("http://example.com");
SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser"); // build a JDOM tree from a SAX stream provided by tagsoup
Document doc = builder.build(url);
JDOMXPath titlePath = new JDOMXPath("/h:html/h:head/h:title");
titlePath.addNamespace("h","http://www.w3.org/1999/xhtml");
String title = ((Element)titlePath.selectSingleNode(doc)).getText();
System.out.println("Title is "+title);

Consiglio di esternare le espressioni XPath in modo da avere una certa protezione se il sito cambia.

Ecco un esempio XPath che sicuramente non sto usando per schermare questo sito. Assolutamente no, non io:

"//h:div[contains(@class,'question-summary')]/h:div[@class='summary']//h:h3"

Non hai menzionato quale stack tecnologico stai utilizzando. Se stai analizzando HTML, userei una libreria di analisi:

Ci sono anche servizi web che fanno esattamente quello che stai dicendo: commerciale e gratuito. Raschiano i siti e offrono interfacce per i servizi web.

E un servizio web generico che offre alcuni scraping dello schermo è Yahoo Pipes. precedente domanda stackoverflow su quella

Non è infallibile ma potresti voler guardare un parser come Beautiful Soup Non troverà magicamente le stesse informazioni se il layout cambia, ma è molto più facile scrivere espressioni regolari complesse. Nota che questo è un modulo Python.

Sfortunatamente, lo "scraping" è la soluzione più comune, come hai detto, tentando di analizzare l'HTML dai siti Web. È possibile rilevare modifiche strutturali alla pagina e contrassegnare un avviso per la correzione, quindi una modifica alla loro fine non comporta dati errati. Fino a quando il web semantico è una realtà, questo è praticamente l'unico modo per garantire un set di dati di grandi dimensioni.

In alternativa è possibile attenersi a piccoli set di dati forniti dalle API. Yahoo sta lavorando molto duramente per fornire dati ricercabili tramite le API (vedi YDN), penso che l'API di Amazon apra molti dati sui libri, ecc. Ecc.

Spero che ti aiuti un po '!

EDIT: E se stai usando PHP, consiglierei SimpleHTMLDOM

Hai esaminato l'utilizzo di una libreria di manipolazione html? Ruby ne ha alcuni piuttosto carini. ad es. hpricot

Con una buona libreria puoi specificare le parti della pagina che desideri utilizzando i selettori CSS o xpath. Questi sarebbero molto più robusti rispetto all'uso di regexps.

Esempio dal wiki di hpricot:

 doc = Hpricot(open("qwantz.html"))
 (doc/'div img[@src^="http://www.qwantz.com/comics/"]')
   #=> Elements[...]

Sono sicuro che potresti trovare una libreria che fa cose simili in .NET, Python, ecc.

Prova a cercare su Google lo screen scraping + la lingua che preferisci. Conosco diverse opzioni per Python, potresti trovare l'equivalente per la tua lingua preferita:

  • Bella zuppa
  • meccanizza: simile a perl WWW: meccanizza. Ti dà un browser come oggetto da inserire con le pagine web
  • lxml: associazione python a libwww
  • scrapemark: utilizza i modelli per raschiare pezzi di pagine
  • pyquery: consente di eseguire query jQuery in documenti xml / xhtml
  • scrapy: un framework di scraping e web crawling di alto livello per la scrittura di ragni per la scansione e l'analisi delle pagine web

A seconda del sito Web da raschiare, potrebbe essere necessario utilizzare uno o più degli approcci sopra.

Se potessi usare qualcosa come Tag Soup , sarebbe un punto di partenza. Quindi potresti trattare la pagina come un'API XML, un po '.

Ha un'implementazione Java e C ++, potrebbe funzionare!

Il prezzemolo su http://www.parselets.com sembra piuttosto liscio.

Ti consente di definire "parslet" usando JSON ciò che stai definendo cosa cercare nella pagina, e quindi analizza i dati per te.

Come altri hanno già detto, è possibile utilizzare un parser HTML che crea una rappresentazione DOM e interroga con XPath / XQuery. Ho trovato un articolo molto interessante qui: Teoria e pratica Java: Screen scraping con XQuery - http://www.ibm.com/developerworks/xml/library/j-jtp03225.html

Abbastanza giusto, userò il metodo di zuppa Tag come raccomandato.

Come domanda successiva: come mai fanno quei grandi siti di tipo raschietto? Ho visto un motore di ricerca di lavoro (ad esempio Indeed.com) che esegue la scansione di migliaia di siti! Sono migliaia di regex? È quasi impossibile ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top