Domanda

Quando non v'è alcuna API webservice disponibili, l'unica opzione potrebbe essere quella di screen scraping, ma come si fa a farlo in C #?

Come pensate di farlo?

È stato utile?

Soluzione

Matt e le risposte di Paolo sono corrette. "Screen scraping" analizzando il codice HTML da un sito web di solito è una cattiva idea, perché:

  1. parsing del codice HTML può essere difficile , soprattutto se è valido. Se si sta raschiando una pagina molto, molto semplice quindi le espressioni regolari potrebbero funzionare. In caso contrario, utilizzare un quadro di analisi come l'Agility pacchetto HTML.

  2. I siti web sono un bersaglio mobile . Avrai bisogno di aggiornare il codice ogni volta che il sito web di origine cambia la loro struttura di markup.

  3. screen scraping non gioca bene con JavaScript . Se il sito Web di destinazione utilizza alcun tipo di sceneggiatura dinamica di manipolare la pagina web che sta andando ad avere un tempo molto difficile raschiando esso. E 'facile per afferrare la risposta HTTP, è molto più difficile per raschiare quello che i display del browser in risposta a script lato client contenuta in quella risposta.

Se screen scraping è l'unica opzione, qui ci sono alcune chiavi per il successo:

  1. rendere il più semplice possibile per cambiare i modelli che cercate . Se possibile, conservare i modelli come file di testo o in un file di risorse da qualche parte. Rendono molto facile per gli altri sviluppatori (o voi stessi in 3 mesi) per capire che cosa markup si aspetta di trovare.

  2. convalidare l'input e generare eccezioni significative . Nel vostro codice di analisi, fare attenzione a rendere il vostro eccezioni molto utile. Il sito di destinazione il cambiamento su di voi, e quando ciò accade si desidera che i messaggi di errore per raccontare non solo quello che parte del codice non è riuscita, ma perché non è riuscito. Menzione sia il modello che stai cercando e il testo che si sta confrontando contro.

  3. Scrivi un sacco di test automatizzati . Si vuole che sia molto facile da eseguire il raschietto in modo non distruttivo perché fare un sacco di sviluppo iterativo per ottenere i modelli di destra. Automatizzare il più test, come si può, si pagherà nel lungo periodo.

  4. Si consideri uno strumento di automazione del browser Watin . Se avete bisogno di complesse interazioni con il sito web di destinazione potrebbe essere più facile da scrivere il raschietto dal punto di vista del browser stesso, piuttosto che pasticciare con le richieste HTTP e le risposte a mano.

Per quanto riguarda il come per schermo raschiare in C #, è possibile utilizzare Watin (vedi sopra) e raschiare il documento risultante utilizzando il suo DOM, oppure è possibile utilizzare la classe WebClient [vedi MSDN o Google] per arrivare alla risposta HTTP prima, inclusi i contenuti HTML e quindi utilizzare una sorta di analisi basato su testo per estrarre i dati desiderati.

Altri suggerimenti

Html Agility pacchetto . Gestisce HTML male e malformati. E ti permette di interrogare con XPath, il che rende molto facile trovare i dati che stai cercando. Non scrivere un parser a mano e NON usare le espressioni regolari, è semplicemente troppo goffo.

Il termine che stai cercando è in realtà chiamato screen scraping.

Una cosa che dovete considerare circa scraping siti web è che sono fuori dal vostro controllo e possono cambiare frequentemente e in modo significativo. Se lo fai andare con raschiando il fatto del cambiamento deve parte della vostra strategia globale. Per esempio. è necessario aggiornare il codice prima o poi a che fare con un "bersaglio in movimento".

Qui ci sono un paio di C # link per iniziare:

http://www.cambiaresearch.com/c4/3ee4f5fc-0545-4360-9bc7-5824f840a28c/How-to-scrape-or-download-a-webpage-using-csharp.aspx

Ecco esempio di codice C #, che vi aiuterà a

Uri url = new Uri("http://msdn.microsoft.com/en-US/");
if (url.Scheme == Uri.UriSchemeHttp)
{
    //Create Request Object
    HttpWebRequest objRequest = (HttpWebRequest)HttpWebRequest.Create(url);
    //Set Request Method
    objRequest.Method = WebRequestMethods.Http.Get;
    //Get response from requested url
    HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
    //Read response in stream reader
    StreamReader reader = new StreamReader(objResponse.GetResponseStream());
    string tmp = reader.ReadToEnd();
    objResponse.Close();
    //Set response data to container
    this.pnlScreen.GroupingText = tmp;
}

Solo una cosa da notare, alcune persone hanno menzionato tirando giù il sito web come XML e quindi utilizzando XPath per scorrere i nodi. E 'probabilmente importante assicurarsi che si sta lavorando con un sito che è stato sviluppato in XHTML per assicurarsi che il codice HTML rappresenta un documento XML ben formato.

Dal punto di vista pratico (ho scritto decine di applicazioni "web-interattivo" nel corso degli anni), ho infine optato per Watin combinato con CSQuery .

Watin fornire le nozioni di base di automazione del browser (l'interazione con bottoni ecc), mentre CSQuery consente di utilizzare la sintassi stile jQuery per analizzare il contenuto della pagina.

ho usato selenio per un tempo (progettato per test automatizzati di siti web) con IE e FireFox, ma trovato ad essere soggetta a crash quando viene utilizzato per raschiare-lungo termine. Tutti i miei attuali sistemi di produzione sono Watin + CSQuery e forniscono raschiatura affidabile di più siti web su base giornaliera.

Nota: mi rendo conto Watin non è stato aggiornato per un po ', ma "se non è rotto, lo uso!":)

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