¿Hay alguna manera de ver el origen generado de una página web (el código después de todas las llamadas AJAX y manipulaciones DOM de JavaScript) desde una aplicación C# sin abrir una navegador desde el código?Ver fuente generada (después de AJAX/JavaScript) en C#
Ver la página inicial utilizando un objeto WebRequest o WebClient funciona bien, pero si la página hace un uso extensivo de JavaScript para modificar el DOM en la carga de la página, estos no proporcionan una imagen precisa de la página.
He intentado utilizar Selenium y Watin UI pruebas de marcos y funcionan perfectamente, suministrando la fuente generada como aparece después de que se completen todas las manipulaciones de JavaScript. Desafortunadamente, lo hacen abriendo un navegador web real, que es muy lento. Implementé un servidor de selenio que descarga este trabajo a otra máquina, pero todavía hay un retraso considerable.
¿Hay una biblioteca .Net que cargará y analizará una página (como un navegador) y escupirá el código generado? Claramente, Google y Yahoo no están abriendo navegadores para cada página que quieren arañar (por supuesto, pueden tener más recursos que yo ...).
¿Existe tal biblioteca o no tengo suerte a menos que esté dispuesto a diseccionar el código fuente de un navegador de código abierto?
SOLUCIÓN
Bueno, gracias a todos por la ayuda que eres. Tengo una solución de trabajo que es aproximadamente 10 veces más rápida que el selenio. ¡Cortejar!
Gracias a esto old article from beansoftware pude usar el control System.Windows.Forms.WebBrowser para descargar la página y analizarla, y luego darles la fuente generada. Aunque el control está en Windows.Forms, aún puede ejecutarlo desde Asp.Net (que es lo que estoy haciendo), solo recuerde agregar System.Window.Forms a las referencias de su proyecto.
Hay dos cosas notables sobre el código. Primero, se llama al control WebBrowser en un nuevo hilo. Esto se debe a que debe ejecutarse en un single threaded apartment.
En segundo lugar, la variable GeneratedSource se establece en dos lugares. Esto no se debe a una decisión inteligente de diseño :) Aún estoy trabajando en ello y actualizaré esta respuesta cuando haya terminado. wb_DocumentCompleted() se llama varias veces. Primero, cuando se descarga el código HTML inicial, cuando se completa la primera ronda de JavaScript. Desafortunadamente, el sitio que estoy raspando tiene 3 etapas de carga diferentes. 1) Cargue HTML inicial 2) Haga la primera ronda de manipulación DOM de JavaScript 3) pausa durante medio segundo y luego realice una segunda ronda de manipulación JS DOM.
Por alguna razón, la segunda ronda no es causada por la función wb_DocumentCompleted(), pero siempre se captura cuando wb.ReadyState == Complete. Entonces, ¿por qué no eliminarlo de wb_DocumentCompleted()? Todavía no estoy seguro de por qué no está atrapado allí y ahí es donde el artículo de beadsoftware recomienda ponerlo. Voy a seguir investigando. Solo quería publicar este código para que cualquiera que esté interesado pueda usarlo. ¡Disfrutar!
using System.Threading;
using System.Windows.Forms;
public class WebProcessor
{
private string GeneratedSource{ get; set; }
private string URL { get; set; }
public string GetGeneratedHTML(string url)
{
URL = url;
Thread t = new Thread(new ThreadStart(WebBrowserThread));
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
return GeneratedSource;
}
private void WebBrowserThread()
{
WebBrowser wb = new WebBrowser();
wb.Navigate(URL);
wb.DocumentCompleted +=
new WebBrowserDocumentCompletedEventHandler(
wb_DocumentCompleted);
while (wb.ReadyState != WebBrowserReadyState.Complete)
Application.DoEvents();
//Added this line, because the final HTML takes a while to show up
GeneratedSource= wb.Document.Body.InnerHtml;
wb.Dispose();
}
private void wb_DocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser wb = (WebBrowser)sender;
GeneratedSource= wb.Document.Body.InnerHtml;
}
}
Se podría tratar de cortar las fuentes de Firebug. –
Mi intento habría sido con Watin y amigos también. Gran pregunta! – orip
Intenta ejecutar el código en "http://www.host.com/path/page.html?ast=3" o "http://gwt.google.com/samples/Showcase/Showcase.html". Notarás que no busca el HTML correcto. ¿Hay alguna idea de cómo arreglar eso? – Cosmo