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:
- selenio installata: http://docs.seleniumhq.org/
- iniziato l'hub di selenio come un servizio
- phantomjs scaricati (un browser senza testa, in grado di eseguire il javascript): http://phantomjs.org/
- Phantomjs avviati in modalità webdriver che punta all'hub di selenio
- 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");
funziona perfettamente – Flynn
Grazie per esempio perfetto. Funziona perfettamente. –
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? –