2014-06-18 16 views
11

Ho un browser web e un'etichetta in Visual Studio e in pratica quello che sto cercando di fare è catturare una sezione da un'altra pagina web.Pagina di scraping generata da javascript con C#

Ho provato a utilizzare WebClient.DownloadString e WebClient.DownloadFile e entrambi mi forniscono il codice sorgente della pagina Web prima che javascript carichi il contenuto. La mia prossima idea era di usare uno strumento WebBrowser e chiamare webBrowser.DocumentText dopo che la pagina era stata caricata e non funzionava, mi dà comunque la fonte originale della pagina.

C'è un modo per accedere alla pagina post-javascriptload?

Questa è la pagina che sto cercando di analizzare.

http://www.regulations.gov/#!documentDetail;D=APHIS-2013-0013-0083

ho bisogno di ottenere il commento fuori di quella pagina, che è generato.

risposta

29

Il problema è che il browser di solito esegue il javascript e risulta con un DOM aggiornato. A meno che tu non possa analizzare il javascript o intercettare i dati che utilizza, dovrai eseguire il codice come farebbe un browser. In passato mi sono imbattuto nello stesso problema, ho utilizzato selenio e PhantomJS per rendere la pagina. Dopo aver eseguito il rendering della pagina, vorrei utilizzare il client WebDriver per navigare nel DOM e recuperare il contenuto di cui avevo bisogno, postare AJAX.

A di alto livello, questi sono i passi:

  1. selenio installata: http://docs.seleniumhq.org/
  2. iniziato l'hub di selenio come un servizio
  3. phantomjs scaricati (un browser senza testa, in grado di eseguire il javascript): http://phantomjs.org/
  4. Phantomjs avviati in modalità webdriver che punta all'hub di selenio
  5. Nella mia applicazione di scraping è stato installato il pacchetto nuget del client webdriver: Install-Package Selenium.WebDriver

Ecco un esempio di utilizzo del phantomjs WebDriver:

var options = new PhantomJSOptions(); 
options.AddAdditionalCapability("IsJavaScriptEnabled",true); 

var driver = new RemoteWebDriver(new URI(Configuration.SeleniumServerHub), 
        options.ToCapabilities(), 
        TimeSpan.FromSeconds(3) 
       ); 
driver.Url = "http://www.regulations.gov/#!documentDetail;D=APHIS-2013-0013-0083"; 
driver.Navigate(); 
//the driver can now provide you with what you need (it will execute the script) 
//get the source of the page 
var source = driver.PageSource; 
//fully navigate the dom 
var pathElement = driver.FindElementById("some-id"); 

Maggiori informazioni selenio, phantomjs e WebDriver si possono trovare nei seguenti link:

http://docs.seleniumhq.org/

http://docs.seleniumhq.org/projects/webdriver/

http://phantomjs.org/

EDIT: Più facile Metodo

Sembra ci sia un pacchetto NuGet per i phantomjs, in modo tale che non è necessario il mozzo (io ho usato un cluster di fare massiccia rottamazione in questo modo):

Installare il driver web:

Install-Package Selenium.WebDriver 

Installare exe incorporato:

Install-Package phantomjs.exe 

codice aggiornato:

var driver = new PhantomJSDriver(); 
driver.Url = "http://www.regulations.gov/#!documentDetail;D=APHIS-2013-0013-0083"; 
driver.Navigate(); 
//the driver can now provide you with what you need (it will execute the script) 
//get the source of the page 
var source = driver.PageSource; 
//fully navigate the dom 
var pathElement = driver.FindElementById("some-id"); 
+0

funziona perfettamente – Flynn

+0

Grazie per esempio perfetto. Funziona perfettamente. –

+0

Ho provato ma driver.Url non cambia. Non fare nemmeno l'eccezione. Basta passare ed è ancora azione: vuoto. Quindi navigare restituisce come . Ho provato un altro URL. Aspetta un secondo e vai alla riga successiva. La fine del codice non è in grado di trovare qualche id, ovviamente. Qualche idea? –

1

ok io vi mostrerò come attivare il supporto JavaScript utilizzando phantomjs e selenuim con C#

  1. creare un nuovo nome progetto di console come si vuole
  2. andare a soluzione explorer nella tua mano destra
  3. un clic destro su Riferimenti clicca su Gestisci pacchetti NuGet
  4. una finestra mostrerà click su browse di in Selenium.WebDriver alto
  5. downold phantomjs da qui Phantomjs
  6. nel vostro tipo di funzione principale di questo codice

    var options = new PhantomJSOptions(); 
        options.AddAdditionalCapability("IsJavaScriptEnabled", true); 
        IWebDriver driver = new PhantomJSDriver("phantomjs Folder Path", options); 
        driver.Navigate().GoToUrl("https://www.yourwebsite.com/"); 
    
        try 
        { 
         string pagesource = driver.PageSource; 
         driver.FindElement(By.Id("yourelement")); 
         Console.Write("yourelement founded"); 
    
        } 
        catch (Exception e) 
        { 
         Console.WriteLine(e.Message); 
    
        } 
    
        Console.Read(); 
    

non dimenticate di mettere yourwebsite e l'elemento che loooking e i fantasmi.percorso exe in te macchina in questo codice di seguito

hanno grande tempo di codifica e grazie wbennett

Problemi correlati