2009-02-05 22 views
17

Estoy usando C# HttpWebRequest para obtener algunos datos de una página web. El problema es que algunos de los datos se actualizan mediante javascript/ajax después de que se carga la página y no la obtengo en la cadena de respuestas. ¿Hay alguna manera de que la webrequest espere hasta que todos los scripts de la página hayan terminado de ejecutarse?C# httpwebrequest y javascript

Gracias

Amit

Respuesta

8

Si interpreto correctamente a su pregunta, no existe una solución simple para su problema.

Está raspando el HTML de un servidor y como su código C# no es un navegador web real, no ejecuta scripts de cliente.

De esta manera no puede acceder a la información que no contiene el código HTML que busca.

Editar: no sé cómo estos complejos llamadas AJAX desde el sitio web original son, pero se puede usar Firebug o Fiddler para IE para ver cómo se hacen las peticiones con el fin de llamar a estas llamadas AJAX en su Aplicación C# también. Entonces podrías agregar las piezas de información que necesitarás. Pero es solo una solución teórica.

+0

me lo imaginaba, Charlatán. Entonces no hay forma de que obtenga esos datos ... –

+0

Edité mi pregunta con una solución TEÓRICA ...depende de la circunstancia, con qué frecuencia cambian las páginas ... – splattne

+0

Estoy revisando los datos cada 30 minutos. Creo que eso es lo que tendré que hacer, ¡qué fastidio! –

5

Cuando abre una página web en un navegador web, es el navegador que ejecuta el javascript y descarga recursos adicionales utilizados por la página (imágenes, scripts, etc.). HttpWebRequest por sí solo no hará nada de esto, solo descargará el html de la página que solicitó. Nunca ejecutará ninguno de los códigos javascript/ajax por sí mismo.

3

HttpWebRequest no emula un navegador web, solo descarga el recurso al que lo apunta. Esto significa que no ejecutará o incluso descargará archivos JavaScript.

Tendría que utilizar algo como FireBug para obtener la URL de los datos que se extraen a través de JavaScript, y apunte su HttpWebRequest a eso.

+0

Pensé en eso, pero no es una URL es un número y cuando uso la solicitud http, la etiqueta en la que está el número está vacía –

+0

. Tenía la misma idea. Pero creo que será un PITA para mantener ese código funcionando a lo largo del tiempo ... – splattne

+0

de los 30 minutos que he probado, hacerlo de esta manera no parece ser nada simple. –

12

Sólo una idea, pero hay una manera de tener .NET cargar una página web como si fuera en un navegador: using System.Windows.Forms

se podría cargar la página web en un control WebBrowser

WebBrowser wb = new WebBrowser(); 
wb.ScrollBarsEnabled = false; 
wb.ScriptErrorsSuppressed = true; 
wb.Navigate(url); 
while (wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } 
wb.Document.DomDocument.ToString() 

Esto probablemente le dará el DOM pre ajax, pero tal vez haya una manera de dejar que ejecute primero el ajax.

+1

Lo probé, y realmente funciona. gracias –

+0

Tendrá que agregar una referencia a System.Windows.Forms para acceder a la clase WebBrowser (si todavía no se hace referencia en su proyecto). – grasmi

+0

Además, lo siguiente ayudó a que funcione una versión enhebrada de esta solución. https://stackoverflow.com/questions/4269800/webbrowser-control-in-a-new-thread/4271581#4271581 – Jerrill

4

Use HttpWebRequest para descargar la página, busque programáticamente el código fuente para la información relevante de ajax y luego use una nueva HttpWebRequest para bajar esos datos.

1

Usa HttpWebRequest para descargar la página. Busque el código fuente de la información relevante de AJAX y luego use un nuevo HttpWebRequest para bajar esos datos.

0

Puede usar el PhantomJs. Tenía este Issue, pero no encontré la solución para mi problema. En mi opinión, la mejor solución es This.

Mi solución es tener este aspecto:

var page = require('webpage').create(); 

page.open("https://sample.com", function(){ 
    page.evaluate(function(){ 
     var i = 0, 
     oJson = jsonData, 
     sKey; 
     localStorage.clear(); 

     for (; sKey = Object.keys(oJson)[i]; i++) { 
      localStorage.setItem(sKey,oJson[sKey]) 
     } 
    }); 

    page.open("https://sample.com", function(){ 
     setTimeout(function(){ 
     page.render("screenshoot.png") 
      // Where you want to save it  
      console.log(page.content); //page source 
      // You can access its content using jQuery 
      var fbcomments = page.evaluate(function(){ 
       return $("body").contents().find(".content") 
      }) 
      phantom.exit(); 
     },10000) 
    });  
}); 
Cuestiones relacionadas