Ottenere dati da una pagina Web in modo stabile ed efficiente


11

Recentemente ho imparato che usare una regex per analizzare l'HTML di un sito Web per ottenere i dati di cui hai bisogno non è il miglior modo di agire.

Quindi la mia domanda è semplice: qual è il modo migliore / più efficiente e generalmente stabile per ottenere questi dati?

Dovrei notare che:

  • Non ci sono API
  • Non esiste altra fonte da cui posso ottenere i dati (nessun database, feed e simili)
  • Non è possibile accedere ai file di origine. (Dati da siti Web pubblici)
  • Supponiamo che i dati siano di testo normale, visualizzati in una tabella in una pagina HTML

Attualmente sto usando Python per il mio progetto, ma una soluzione / suggerimenti indipendenti dal linguaggio sarebbe carino.

Come domanda secondaria: come faresti a farlo quando la pagina web è costruita da chiamate Ajax?

MODIFICARE:

Nel caso dell'analisi HTML, so che non esiste un modo realmente stabile per ottenere i dati. Non appena la pagina cambia, il tuo parser è pronto. Ciò che intendo con stable in questo caso è: un modo efficiente per analizzare la pagina, che mi dà sempre gli stessi risultati (per lo stesso set di dati ovviamente) a condizione che la pagina non cambi.


8
Non esiste un modo stabile, indipendentemente da come implementi il ​​tuo scraping, può facilmente rompersi con una semplice modifica della pagina web. Il modo stabile per ottenere i tuoi dati è contattare gli autori dei dati e negoziare un accordo per ottenere i dati in un formato sano. A volte questo non costa nemmeno denaro.
Joachim Sauer,

1
@JoachimSauer - È ancora possibile rispondere alla domanda con il metodo "migliore".
Anonimo

Poiché la maggior parte dei siti Web è dinamica e memorizza i propri dati in database, il modo migliore è ottenere il database dal sito Web. Se il sito Web ha un'API, è possibile utilizzarlo. Nel caso in cui desideri raschiare le pagine statiche, i moduli urllib e HTMLParser integrati in Python funzionano bene. Alcuni pacchetti per lo scraping HTML sono disponibili anche su PyPi.
Ubermensch,

La raschiatura del sito è un affare schifoso. Non c'è davvero un modo stabile per farlo perché i proprietari dei siti non vogliono che tu lo faccia e l'industria nel suo complesso sta cercando di impedire alle persone di farlo.
Steven Evers,

1
Forse incorporare un browser Web come Webkit e quindi utilizzare lo script DOM per ottenere informazioni dalla pagina di rendering? Quasi tutte le piattaforme possono farlo, ma ecco come lo faresti in Qt: doc.qt.nokia.com/4.7-snapshot/qtwebkit-bridge.html
user16764

Risposte:


2

Bene, ecco i miei 2 centesimi:

Se non è coinvolto AJAX, o può essere cancellato facilmente, 'correggere' l'HTML su XHTML (usando HTMLTidy per esempio), quindi usare XPath invece delle espressioni regolari per estrarre le informazioni.
In una pagina Web ben strutturata, le entità di informazioni separate logicamente si trovano in differenti <div>s, o qualunque altro tag, il che significa che si sarebbe in grado di trovare facilmente le informazioni giuste con una semplice espressione XPath. Questo è ottimo anche perché puoi testarlo, diciamo, nella console di Chrome o nella console di sviluppo di Firefox e verificarne il funzionamento prima di scrivere anche una sola riga di altro codice.
Questo approccio ha anche un rapporto segnale-rumore molto elevato, poiché di solito le espressioni per selezionare le informazioni pertinenti saranno a linea singola. Sono anche molto più facili da leggere rispetto alle espressioni regolari e sono progettati a tale scopo.

Se nella pagina sono presenti AJAX e gravi applicazioni JavaScript, incorporare un componente browser nell'applicazione e utilizzare il relativo DOM per attivare gli eventi necessari e XPath per estrarre informazioni. Esistono molti componenti del browser incorporabili, la maggior parte dei quali utilizza browser del mondo reale sotto il cofano, il che è positivo, dal momento che una pagina web potrebbe non essere corretta (X) HTML, ma essere comunque valida su tutti i principali browser ( in realtà, la maggior parte delle pagine alla fine arriva così).


Grazie, darò sicuramente un'occhiata a XPath ancora. Non sono abituato a lavorarci, quindi sarà una cosa carina da imparare. +1 :)
Mike

5

Nella mia esperienza, utilizzando l'ambiente .NET, puoi sfruttare HTML Agility Pack .

Se la pagina è formattata come XHTML, puoi anche utilizzare un normale parser XML. C'è molto da fare per qualsiasi ambiente tu possa immaginare.

Per la domanda secondaria su AJAX, è possibile utilizzare il normale codice di rete HTTP per ottenere dati e analizzarli.

Ancora una volta se il tuo stack AJAX restituisce XML, avrai molte scelte. Se restituisce JSON, prendere in considerazione una libreria che consente di mappare il flusso su oggetti digitati. In .NET ti consiglio Newtonsoft.Json .


E con "codice di rete HTTP" intendi catturare la risposta del server quando viene effettuata una richiesta? Grazie per i suggerimenti, sarò sicuro di dare un'occhiata a loro. +1
Mike

Esattamente. In .NET è possibile utilizzare System.Net.WebClient o una libreria come RestSharp | restsharp.org . L'ho usato anche su Mono per Droid.
gsscoder,

4

L'analisi dell'HTML non è un compito del tutto banale, dal momento che si deve affrontare un markup forse errato (tag soup). Nel corso degli anni, i browser hanno implementato più o meno la stessa strategia per gestire gli errori e tale algoritmo è stato battezzato nella specifica HTML5 (sì, la specifica HTML5 specifica cosa fare con cose che non sono HTML5).

Sono librerie per tutte le principali lingue per analizzare HTML, ad esempio questa .

In ogni caso, ciò che otterrai non è stabile in alcun senso. Ogni volta che cambia il formato della pagina web, devi adattare il tuo raschietto.


Grazie, sto usando Beautiful Soup per portare a termine il lavoro. So che non sarà stabile, probabilmente dovrei chiarirlo nelle mie domande. +1 per te :)
Mike

4

Come domanda secondaria: come faresti a farlo quando la pagina web è costruita da chiamate Ajax?

Se vengono effettuate chiamate ajax, è molto probabile che si tratti di un URL POST o GET con alcune variabili.

Esaminerei JavaScript per scoprire quali sono gli endpoint e i parametri. Dopodiché è molto probabile che i dati restituiti siano json / xml / testo semplice o HTML parziale.

Una volta a conoscenza delle informazioni di cui sopra, è sufficiente effettuare una richiesta GET o POST a tale endpoint e analizzare i dati restituiti.


2
Vale la pena notare che molti servizi controllano le intestazioni HTTP per assicurarsi che lo HTTP_X_REQUESTED_WITHsia XMLHttpRequest. I buoni implementeranno anche una sorta di protezione XSRF per le richieste POST, quindi avrai bisogno anche di quel biscotto magico. Solleticare gli endpoint AJAX non deliberatamente esposti da alcune API pubbliche mi sembra un po 'fastidioso e il tuo raschietto è altrettanto soggetto a rotture se l'output (o la politica di richiesta) cambia.
Tim Post

@TimPost hai ragione al 100%. Sono d'accordo sul fatto che sia "icky" in effetti :) ma in assenza di qualsiasi API pubblica, i bisogni devono ..
Darknight

Potrei usarlo sulla mia applicazione basata su AJAX (e per "proprio" non intendo che l'ho scritto ma l'installazione è mia) ma non mi sento bene provare a bypassare il sistema di un altro server, quindi devo essere d'accordo con @ TimPost, sembra un po '"malizioso". È una buona idea comunque, grazie! +1!
Mike

1

Non esiste un modo stabile o migliore per farlo, le pagine Web HTML non sono state progettate per essere manipolate dai computer. È per utenti umani, ma se è necessario farlo, suggerisco di utilizzare un browser e alcuni javascript. Nel mio lavoro sono stato coinvolto in un progetto che ha bisogno di estrarre alcune informazioni da un sito di terze parti. L'applicazione è stata sviluppata come estensione di Chrome. La logica dell'applicazione viene scritta utilizzando javascript che viene iniettato sul sito al termine del caricamento della pagina. I dati estratti vengono inviati a un database tramite un server http. Non è l'approccio migliore, ma funziona. Ps: il proprietario del sito ci ha autorizzato a fare ciò.


So che le pagine HTML non dovevano essere analizzate dai computer, ma a volte semplicemente non c'è altra opzione. Inoltre, sto usando informazioni pubblicamente disponibili per un progetto personale che non è in alcun modo commerciale, non penso di aver bisogno di un'autorizzazione esplicita, vero? Grazie per il tuo contributo! +1 anche per te;)
Mike

@MikeHeremans Per sapere se sei autorizzato a ottenere informazioni da un sito web, leggi ToS e robots.txt. Se entrambi non ti negano il diritto di cancellare automaticamente le informazioni, probabilmente dovresti essere OK nella maggior parte dei casi legalmente. Certo, IANAL ...
K.Steff,

Se ti piace vedere il codice del progetto citato: code.google.com/p/acao-toolkit/source/browse/… . Controlla content_script.js, è il codice che viene iniettato nella pagina.
nohros,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.