2010-03-27 7 views
5

Sto usando PHP per raschiare un sito Web e raccogliere alcuni dati. È tutto fatto senza usare espressioni regolari. Sto usando il metodo explode() di php per trovare invece dei tag HTML particolari.Come sapere se il sito web da raschiare è cambiato?

È possibile che se la struttura del sito Web cambia (CSS, HTML), i dati errati potrebbero essere raccolti dal raschietto. Quindi la domanda è: come faccio a sapere se la struttura HTML è cambiata? Come identificarlo prima di memorizzare qualsiasi dato nel mio database per evitare di memorizzare dati errati.

risposta

7

Penso che non si abbiano soluzioni pulite se si sta raschiando una pagina in cui il contenuto cambia.

Ho sviluppato diversi scraper Python e so quanto può essere frustrante quando il sito apporta un leggero cambiamento al layout.

Si potrebbe provare una soluzione a la mechanize (non si conosce la controparte php) e se si è fortunati si potrebbe isolare il contenuto che è necessario estrarre (collegamenti?).

Un altro possibile approccio sarebbe quello di codificare alcuni vincoli e controllarli prima di memorizzare in db.

Ad esempio, se si stanno raschiando gli URL, è necessario verificare che ciò che ha analizzato il raschiatore sia formalmente un URL valido; lo stesso per l'ID intero o per qualsiasi cosa tu voglia racimolare che può essere riconosciuto come valido.

Se si sta raschiando il testo normale, sarà più difficile da controllare.

+0

Ehi, quello ero io. Scusa perché non era intenzionale !! Ho premuto il pulsante sbagliato e ora non sono in grado di cambiarlo. Dice "vota troppo vecchio per essere cambiato, a meno che questa risposta non venga modificata". Scusa ancora, ti preghiamo di apportare qualche modifica alla risposta in modo da poter votare. Non era intenzionale. – Yeti

1

Innanzitutto, in alcuni casi è possibile confrontare hashes dell'originale con il nuovo html. MD5 e SHA1 sono due hash popolari. Questo può o non può essere valido in tutte le circostanze, ma è qualcosa che dovresti avere familiarità con. Questo ti dirà se qualcosa è cambiato: contenuto, tag o altro.

Per capire se la struttura è stata modificata, è necessario acquisire un istogramma delle occorrenze del tag e confrontarle. Se tieni che i tag non siano funzionanti, devi acquisire un albero dei tag e fare un confronto per vedere se i tag si verificano nello stesso ordine. Questo sarà molto specifico per ciò che si vuole raggiungere.

PHP Simple HTML DOM Parser è uno strumento che consente di analizzare l'HTML.

+2

@BrainLy: solo perché il nuovo file html ha un hash diverso, non significa che la struttura HTML sia cambiata. – codaddict

+0

Gli hash * differiscono * sempre perché i dati che sto modificando cambiano su base oraria! Quello che volevo dire era, e se hanno cambiato il design del sito, come può essere rilevato in modo efficiente? – Yeti

+0

Le pagine dinamiche genereranno in modo coerente diversi hash, di solito senza importanti modifiche strutturali. –

0

Explode() non è un parser HTML, ma si desidera conoscere le modifiche nella struttura HTML. Sarà difficile. Prova a utilizzare un parser HTML. Nient'altro sarà in grado di farlo correttamente.

+0

Qualcuno si preoccupa di spiegare il loro downvote? – spender

2

Se si desidera conoscere le modifiche rispetto alla struttura, penso che il modo migliore sia quello di memorizzare la struttura DOM della prima pagina e quindi confrontarla con una nuova.

Ci sono molti modo si può fare: - SAXParser DOMParser ecc

Ho un piccolo blog che darà alcune indicazioni per quello che voglio dire http://let-them-c.blogspot.com/2009/04/xml-as-objects-in-oops.html

oppure è possibile utilizzare http://en.wikipedia.org/wiki/Simple_API_for_XML o DOm parser di utilità.

+1

È necessario prestare molta attenzione quando si tenta di utilizzare parser XML con HTML. Tendono a saltare al minimo codice HTML malformato. –

2

Parlando dal mio culo qui, ma è possibile che si desideri esaminare alcuni metodi PHP di Document Object Model.

http://php.net/manual/en/book.dom.php

Se la mia molto, molto limitata comprensione del DOM è corretta, un cambiamento nella struttura del sito HTML avrebbe cambiato il Document Object Model, ma una semplice modifica dei contenuti all'interno di una struttura fissa non sarebbe. Quindi, se si potesse catturare lo stato del DOM, e quindi confrontarlo ad ogni scrap, non si potrebbe in teoria determinare che tale cambiamento sia stato fatto? .

(A proposito, il modo in cui ho fatto questo, quando stavo cercando di ottenere una notifica via email quando la barra risultati degli esami sono state inviate in una pagina particolare è stato appena confrontare file_get_contents() valori Sorprendentemente, ha lavorato in modo impeccabile: senza falsi positivi e inviato via email non appena il sito ha pubblicato il contenuto.)

2

Dipende dal sito ma è possibile contare il numero di elementi della pagina nella pagina rasata come div, classe & tag di stile quindi confrontando questi totali con quelli di gli scarti successivi rilevano se la struttura della pagina è stata cambiata.

Un processo simile potrebbe essere utilizzato per il file CSS in cui i nomi di ogni classe o id potrebbero essere estratti utilizzando espressioni regolari, memorizzate e verificate secondo necessità. Se questa lista ha nuove aggiunte, la struttura della pagina è quasi sicuramente cambiata da qualche parte sul sito che viene raschiato.