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 modo migliore di agire.

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

Devo notare che:

  • Non ci sono API
  • Non c'è altra fonte da cui posso ottenere i dati (nessun database, feed e così via)
  • Non c'è accesso ai file sorgente. (Dati da siti web pubblici)
  • Diciamo che i dati sono normali, visualizzati in una tabella in una pagina html

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

Come una domanda a parte: come faresti quando la pagina web viene costruita con le chiamate Ajax?

Modifica

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

posta Mike 06.06.2012 - 09:59
fonte

5 risposte

2

Bene, ecco i miei 2 centesimi:

Se non è coinvolto AJAX, o può essere cancellato facilmente, 'correggi' l'HTML in XHTML (usando HTMLTidy per esempio), quindi usa XPath invece delle espressioni regolari per estrarre le informazioni.
In una pagina Web ben strutturata, le entità di informazioni logicamente separate sono in% diverso di% s, o qualunque altro tag, il che significa che sarete in grado di trovare facilmente le informazioni giuste con un'espressione XPath semplice. Questo è ottimo anche perché puoi testarlo, ad esempio, nella console di Chrome o nella console per sviluppatori di Firefox e verificare che funzioni prima di scrivere anche una sola riga di altro codice.
Questo approccio ha anche un rapporto segnale / rumore molto elevato, dato che solitamente le espressioni per selezionare le informazioni rilevanti saranno one-liner. Sono anche molto più facili da leggere rispetto alle espressioni regolari e sono progettati per questo scopo.

Se sono presenti AJAX e JavaScript gravi coinvolti nella pagina, incorporare un componente del browser nell'applicazione e utilizzare il suo DOM per attivare gli eventi necessari e XPath per estrarre le informazioni. Ci sono molti buoni componenti del browser integrabili, la maggior parte dei quali usa i browser reali sotto il cofano, il che è una buona cosa, dato che una pagina web potrebbe essere errata (X) HTML, ma può ancora essere valida su tutti i principali browser ( in realtà, la maggior parte delle pagine alla fine ottengono in questo modo).

    
risposta data 06.06.2012 - 22:25
fonte
5

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

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

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

Ancora una volta se lo stack AJAX restituisce XML, avrai molte scelte. Se restituisce JSON, prendere in considerazione una libreria che consente di associare lo stream agli oggetti digitati. In .NET ti suggerisco Newtonsoft.Json .

    
risposta data 06.06.2012 - 16:06
fonte
4

L'analisi dell'HTML non è un compito completamente banale, dal momento che si ha a che fare con un eventuale markup errato (tag soup). Nel corso degli anni, i browser hanno implementato più o meno la stessa strategia per gestire gli errori e quell'algoritmo è stato battezzato nelle specifiche HTML5 (sì, la specifica HTML5 specifica cosa fare con cose che non sono HTML5).

Le librerie sono per tutte le principali lingue per analizzare HTML, ad esempio questo .

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

    
risposta data 06.06.2012 - 10:19
fonte
4

As a side question: How would you go about it when the webpage is constructed by Ajax calls?

Se vengono fatte chiamate ajax, allora è molto probabile che sia un qualche URL POST o GET con alcune variabili.

Vorrei esaminare il codice JavaScript per scoprire quali sono gli endpoint e i parametri. Dopo di ciò è molto probabile che i dati restituiti siano json / xml / plain text o forse html parziale.

Una volta che conosci le informazioni di cui sopra, fai semplicemente una richiesta GET o POST a quell'endpoint e analizza i dati restituiti.

    
risposta data 06.06.2012 - 10:26
fonte
1

Non esiste un modo stabile o migliore per farlo, le pagine Web HTML non sono state create per essere manipolate dai computer. È per utenti umani, ma se hai bisogno di farlo ti suggerisco di usare un browser e qualche 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 è scritta usando javascript che viene iniettato sul sito dopo che il caricamento della pagina è completo. I dati che vengono 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 questa cosa.

    
risposta data 06.06.2012 - 20:36
fonte

Leggi altre domande sui tag