Pregunta

Indique cómo raspar páginas AJAX.

¿Fue útil?

Solución

Descripción general :

Todos los raspados de pantalla primero requieren una revisión manual de la página de la que desea extraer recursos. Cuando se trata de AJAX, generalmente solo necesita analizar un poco más que simplemente el HTML.

Cuando se trata con AJAX, esto solo significa que el valor que desea no está en el documento HTML inicial que solicitó, sino que se ejecutará javascript que le solicita al servidor la información adicional que desea.

Por lo tanto, generalmente puede simplemente analizar el javascript y ver qué solicitud hace el javascript y simplemente llamar a esta URL desde el principio.


Ejemplo :

Tome esto como ejemplo, suponga que la página desde la que desea rascar tiene el siguiente script:

<script type="text/javascript">
function ajaxFunction()
{
var xmlHttp;
try
  {
  // Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
  }
catch (e)
  {
  // Internet Explorer
  try
    {
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
  catch (e)
    {
    try
      {
      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    catch (e)
      {
      alert("Your browser does not support AJAX!");
      return false;
      }
    }
  }
  xmlHttp.onreadystatechange=function()
    {
    if(xmlHttp.readyState==4)
      {
      document.myForm.time.value=xmlHttp.responseText;
      }
    }
  xmlHttp.open("GET","time.asp",true);
  xmlHttp.send(null);
  }
</script>

Entonces, todo lo que necesita hacer es hacer una solicitud HTTP a time.asp del mismo servidor. Ejemplo de w3schools .


Raspado avanzado con C ++:

Para uso complejo, y si está usando C ++, también podría considerar usar el motor de JavaScript de Firefox SpiderMonkey para ejecutar el javascript en una página.

Raspado avanzado con Java:

Para un uso complejo, y si está utilizando Java, también podría considerar utilizar el motor javascript firefox para Java Rhino

Raspado avanzado con .NET:

Para uso complejo, y si está usando .Net, también podría considerar usar el ensamblado Microsoft.vsa. Recientemente reemplazado por ICodeCompiler / CodeDOM.

Otros consejos

En mi opinión, la solución más simple es usar Casperjs , un marco basado en el navegador sin cabeza WebKit phantomjs.

Se carga toda la página, y es muy fácil raspar cualquier información relacionada con ajax. Puede consultar este tutorial básico para aprender Automatización & amp; Raspado con PhantomJS y CasperJS

También puede echar un vistazo a este código de ejemplo, sobre cómo raspar las palabras clave de sugerencias de Google:

/*global casper:true*/
var casper = require('casper').create();
var suggestions = [];
var word = casper.cli.get(0);

if (!word) {
    casper.echo('please provide a word').exit(1);
}

casper.start('http://www.google.com/', function() {
    this.sendKeys('input[name=q]', word);
});

casper.waitFor(function() {
  return this.fetchText('.gsq_a table span').indexOf(word) === 0
}, function() {
  suggestions = this.evaluate(function() {
      var nodes = document.querySelectorAll('.gsq_a table span');
      return [].map.call(nodes, function(node){
          return node.textContent;
      });
  });
});

casper.run(function() {
  this.echo(suggestions.join('\n')).exit();
});

Si puede hacerlo, intente examinar el árbol DOM. Selenium hace esto como parte de la prueba de una página. También tiene funciones para hacer clic en botones y seguir enlaces, lo que puede ser útil.

La mejor manera de raspar páginas web usando Ajax o, en general, páginas usando Javascript es con un navegador en sí o un navegador sin cabeza (un navegador sin GUI). Actualmente phantomjs es un navegador sin cabeza bien promocionado que utiliza WebKit. Una alternativa que utilicé con éxito es HtmlUnit (en Java o .NET a través de IKVM , que es un navegador simulado. Otra alternativa conocida es utilizar una herramienta de automatización web como Selenio .

Escribí muchos artículos sobre este tema, como web scraping Ajax y Javascript sitios y autenticación de OAuth sin navegador automatizada para Twitter . Al final del primer artículo hay muchos recursos adicionales que he estado compilando desde 2011.

Depende de la página ajax. La primera parte del raspado de pantalla es determinar cómo funciona la página. ¿Hay algún tipo de variable que pueda recorrer para solicitar todos los datos de la página? Personalmente, he usado Web Scraper Plus para muchas tareas relacionadas con el raspado de pantalla porque es barato, no es difícil para comenzar, los no programadores pueden hacer que funcione relativamente rápido.

Nota al margen: los Términos de uso probablemente estén en algún lugar que desee consultar antes de hacer esto. Dependiendo del sitio, iterar a través de todo puede levantar algunas banderas.

Me gusta PhearJS , pero eso podría deberse en parte a que lo construí.

Dicho esto, es un servicio que ejecuta en segundo plano que habla HTTP (S) y representa las páginas como JSON para usted, incluidos los metadatos que pueda necesitar.

Como solución de bajo costo, también puede probar SWExplorerAutomation (SWEA). El programa crea una API de automatización para cualquier aplicación web desarrollada con HTML, DHTML o AJAX.

Creo que la respuesta de Brian R. Bondy es útil cuando el código fuente es fácil de leer. Prefiero una manera fácil de usar herramientas como Wireshark o HttpAnalyzer para capturar el paquete y obtener la URL del " Host " campo y el " OBTENER " campo.

Por ejemplo, capturo un paquete como el siguiente:

GET /hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330 
 HTTP/1.1
Accept: */*
Referer: http://quote.hexun.com/stock/default.aspx
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: quote.tool.hexun.com
Connection: Keep-Alive

Entonces la URL es:

http://quote.tool.hexun.com/hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330

Selenium WebDriver es una buena solución: programa un navegador y automatiza lo que debe hacerse en el navegador. Los navegadores (Chrome, Firefox, etc.) proporcionan sus propios controladores que funcionan con Selenium. Como funciona como un navegador REAL automatizado, las páginas (incluidos javascript y Ajax) se cargan como lo hacen con un humano que usa ese navegador.

El inconveniente es que es lento (ya que lo más probable es que desee esperar a que se carguen todas las imágenes y scripts antes de raspar en esa página).

Me he vinculado previamente al solvente del MIT y al EnvJS como mis respuestas para eliminar las páginas de Ajax. Parece que estos proyectos ya no son accesibles.

Por pura necesidad, he inventado otra forma de eliminar las páginas de Ajax, y ha funcionado para sitios difíciles como findthecompany, que tienen métodos para encontrar motores de JavaScript sin cabeza y no mostrar datos.

La técnica es usar extensiones de cromo para hacer scraping. Las extensiones de Chrome son el mejor lugar para eliminar las páginas de Ajax porque en realidad nos permiten acceder a DOM modificado con JavaScript. La técnica es la siguiente, ciertamente abriré el código en algún momento. Cree una extensión de Chrome (suponiendo que sepa cómo crear una, y su arquitectura y capacidades. Esto es fácil de aprender y practicar, ya que hay muchas muestras),

  1. Utilice secuencias de comandos de contenido para acceder al DOM, utilizando xpath. Obtenga casi toda la lista o tabla o contenido renderizado dinámicamente usando xpath en una variable como Nodos HTML de cadena. (Solo los scripts de contenido pueden acceder a DOM pero no pueden contactar una URL usando XMLHTTP)
  2. Desde la secuencia de comandos de contenido, utilizando el paso de mensajes, envíe un mensaje de texto a todo el DOM despojado como cadena, a una secuencia de comandos de fondo. (Los scripts de fondo pueden comunicarse con las URL pero no pueden tocar el DOM). Utilizamos el envío de mensajes para que estos hablen.
  3. Puede usar varios eventos para recorrer las páginas web y pasar cada contenido de Nodo HTML eliminado al script de fondo.
  4. Ahora use el script de fondo, para hablar con un servidor externo (en localhost), uno simple creado usando Nodejs / python. Simplemente envíe los Nodos HTML completos como una cadena al servidor, donde el servidor simplemente conservaría el contenido publicado en él, en archivos, con las variables apropiadas para identificar números de página o URL.
  5. Ahora ha raspado contenido AJAX (nodos HTML como cadena), pero estos son nodos html parciales. Ahora puede usar su biblioteca XPATH favorita para cargarlos en la memoria y usar XPATH para raspar información en tablas o texto.

Por favor comente si no puede entenderlo y puedo escribirlo mejor. ( primer intento ). Además, intento liberar el código de muestra lo antes posible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top