c# - scraping - scrapysharp
Scraping página web generada por javascript con C# (2)
El problema es que el navegador generalmente ejecuta el javascript y resulta con un DOM actualizado. A menos que pueda analizar el javascript o interceptar los datos que utiliza, deberá ejecutar el código como lo haría un navegador. En el pasado me encontré con el mismo problema, utilicé selenio y PhantomJS para renderizar la página. Después de renderizar la página, utilizaría el cliente WebDriver para navegar por el DOM y recuperar el contenido que necesitaba, publicar AJAX.
En un nivel alto, estos son los pasos:
- Selenio instalado: http://docs.seleniumhq.org/
- Comenzó el centro de selenio como un servicio
- Phantomjs descargados (un navegador sin cabeza, que puede ejecutar el javascript): http://phantomjs.org/
- Comenzó phantomjs en modo webdriver apuntando al concentrador de selenio
- En mi aplicación de raspado instalé el paquete nuget del cliente de webdriver:
Install-Package Selenium.WebDriver
Aquí hay un ejemplo de uso del controlador de página phantomjs:
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");
Se puede encontrar más información sobre selenio, phantomjs y webdriver en los siguientes enlaces:
http://docs.seleniumhq.org/projects/webdriver/
EDITAR: Método más fácil
Parece que hay un paquete nuget para los phantomjs, por lo que no necesitas el concentrador (utilicé un clúster para realizar un desguace masivo de esta manera):
Instalar el controlador web:
Install-Package Selenium.WebDriver
Instalar exe incrustado:
Install-Package phantomjs.exe
Código actualizado:
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");
Tengo un webBrowser y una etiqueta en Visual Studio, y básicamente lo que intento hacer es tomar una sección de otra página web.
Intenté usar WebClient.DownloadString y WebClient.DownloadFile, y ambos me dieron el código fuente de la página web antes de que el javascript cargue el contenido. Mi siguiente idea fue utilizar una herramienta WebBrowser y simplemente llamar a webBrowser.DocumentText después de que la página cargó y eso no funcionó, todavía me da la fuente original de la página.
¿Hay alguna manera de capturar la página post-javascriptload?
Aquí está la página que estoy tratando de raspar.
http://www.regulations.gov/#!documentDetail;D=APHIS-2013-0013-0083
Necesito sacar el comentario de esa página, que se genera.
ok, te mostraré cómo habilitar javascript usando phantomjs y selenuim con c #
- crea un nuevo nombre de proyecto de consola como quieras
- vaya al explorador de soluciones en su mano derecha
- haga clic con el botón derecho en Referencias, haga clic en Administrar paquetes NuGet
- una ventana mostrará clic en navegar que instalar Selenium.WebDriver
- phantomjs bajados desde aquí Phantomjs
en su función principal escriba este código
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();
no se olvide de poner su sitio web y el elemento que está buscando y la ruta de acceso phantomjs.exe en su equipo en este código a continuación
tener un buen momento de codificación y gracias wbennett