2014-06-09 15 views
8

Come posso raschiare dati generati dinamicamente da JavaScript nel documento html utilizzando C#?Scraping dei dati generati dinamicamente da JavaScript nel documento html utilizzando C#

Utilizzando WebRequest e HttpWebResponse nella libreria C#, sono in grado di ottenere l'intero codice sorgente HTML come stringa, ma la difficoltà è che i dati che desidero non sono contenuti nel codice sorgente; i dati sono generati dinamicamente da JavaScript.

D'altra parte, se i dati che desidero sono già nel codice sorgente, sono in grado di ottenerli facilmente utilizzando le espressioni regolari.

Ho scaricato HtmlAgilityPack, ma non so se sarebbe preso cura del caso in cui gli elementi sono generati dinamicamente da JavaScript ...

La ringrazio molto!

+0

Dovrete correre attraverso un motore JavaScript di qualche tipo. Forse qualcosa come [Awesomium] (http://www.awesomium.com/)? –

+0

Prendi uno sguardo qui: http://stackoverflow.com/questions/18539491/headless-browser-and-scraping-solutions – sagibb

risposta

10

Quando si effettua WebRequest, si richiede al server di fornire il file di pagina, il contenuto di questo file non è ancora stato analizzato/eseguito da un browser Web e pertanto il javascript non ha ancora eseguito alcuna operazione.

È necessario utilizzare uno strumento per eseguire JavaScript nella pagina se si desidera vedere come appare la pagina dopo essere stata analizzata da un browser. Una delle opzioni disponibili è il controllo del browser Web .net incorporato: http://msdn.microsoft.com/en-au/library/aa752040(v=vs.85).aspx

Il controllo del browser Web può navigare e caricare la pagina e quindi è possibile interrogare il suo DOM che sarà stato modificato dal JavaScript sulla pagina.

EDIT (esempio):

Uri uri = new Uri("http://www.somewebsite.com/somepage.htm"); 

webBrowserControl.AllowNavigation = true; 
// optional but I use this because it stops javascript errors breaking your scraper 
webBrowserControl.ScriptErrorsSuppressed = true; 
// you want to start scraping after the document is finished loading so do it in the function you pass to this handler 
webBrowserControl.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowserControl_DocumentCompleted); 
webBrowserControl.Navigate(uri); 

private void webBrowserControl_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    HtmlElementCollection divs = webBrowserControl.Document.GetElementsByTagName("div"); 

    foreach (HtmlElement div in divs) 
    { 
     //do something 
    } 
} 
+0

Grazie mille. Potresti dare qualche consiglio su quali metodi/funzioni nel controllo del browser web avrò bisogno (per navigare, caricare e interrogare)? Grazie ancora. :) – user3213711

+0

Ho modificato la mia risposta per includere un esempio. – Pandepic

+0

C'è un modo per usare WebBrowser nel programma non-UI? Ho bisogno di analizzare una pagina web, che è parzialmente generata da javascript, ma non ho bisogno dell'interfaccia utente. – Spook

Problemi correlati