2008-11-04 12 views

Respuesta

49

general:

pantalla Todos los raspar primero requiere la revisión manual de la página que desea extraer recursos. Al tratar con AJAX, generalmente solo necesita analizar un poco más que simplemente el HTML.

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

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


Ejemplo:

tomar esto como un ejemplo, supongamos que la página que desea raspar desde tiene la siguiente secuencia de comandos:

<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 tiene que hacer es en vez hacer una solicitud HTTP a time.asp del mismo servidor en su lugar. Example from w3schools.


avanzada raspando con C++:

Para el uso compleja, y si usted está usando C++ también se puede considerar el uso del motor de Firefox Javascript SpiderMonkey para ejecutar el código JavaScript en una página.

avanzada raspando con Java:

Para el uso compleja, y si usted está usando Java también se puede considerar el uso del motor de Firefox Javascript para Java Rhino

avanzada raspando con .NET:

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

+0

+100 !!!! trabajado como un encanto. – Atul

+0

Guau, esta fue información increíblemente útil incluso con herramientas como phantomjs ahora disponibles, saber cómo raspar una página personalizada utilizando el método indicado es mucho más conveniente una vez que hayas investigado lo que está sucediendo detrás de la escena muchas gracias Brian +1 – brendosthoughts

+0

Perffect! ! Muchas gracias –

2

Depende de la página de ajax. La primera parte del raspado de pantalla es determinar cómo funciona la página. ¿Existe algún tipo de variable que pueda repetir para solicitar todos los datos de la página? Personalmente he usado Web Scraper Plus para muchas tareas relacionadas con el screen scraping porque es barato, no es difícil de comenzar, los que no son programadores pueden hacerlo funcionar con relativa rapidez.

Nota al margen: es probable que los términos de uso estén en algún lugar que desee comprobar antes de hacer esto. Dependiendo del sitio iterando a través de todo, puede levantar algunas banderas.

7

Si puede conseguirlo, intente examinar el árbol DOM. Selenium hace esto como parte de probar una página. También tiene funciones para hacer clic en los botones y seguir enlaces, que pueden ser útiles.

+2

En una secuencia de comandos de cliente de selenio puede usar la función 'get_html_source()' pero devuelve la fuente normal, no la fuente generada (posterior a AJAX). Si sabe cómo acceder a la fuente generada, díganos. – Jabba

1

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

0

He vinculado anteriormente al solvente de MIT y EnvJS como mis respuestas para raspar las páginas de Ajax. Estos proyectos parecen no ser accesibles.

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

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

  1. utilizar secuencias de comandos de contenido para acceder al DOM, mediante el uso de xpath. Más o menos obtienes toda la lista o tabla o el contenido renderizado dinámicamente usando xpath en una variable como cadena de nodos HTML. (Solo las secuencias de comandos de contenido pueden acceder a DOM pero no pueden contactar a una URL usando XMLHTTP)
  2. Desde la secuencia de comandos de contenido, utilizando el envío de mensajes, envíe el DOM completo como cadena a un script de fondo. (Las secuencias de comandos de fondo pueden comunicarse con las URL pero no pueden tocar el DOM). Usamos el mensaje que pasa 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 la secuencia de comandos de fondo, para hablar con un servidor externo (en localhost), uno simple creado usando Nodejs/python. Simplemente envíe todos los Nodos HTML como cadena al servidor, donde el servidor simplemente persistiría en el contenido publicado, en archivos, con las variables adecuadas para identificar los números de página o las URL.
  5. Ahora ha raspado el contenido AJAX (nodos HTML como cadena), pero estos son nodos html parciales. Ahora puede usar su biblioteca XPATH favorita para cargarlas en la memoria y usar XPATH para raspar información en tablas o texto.

Comenta si no puedes entenderlo y puedo escribirlo mejor. (primer intento). Además, estoy tratando de liberar el código de muestra lo antes posible.

3

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

he escrito muchos artículos sobre este tema como web scraping Ajax and Javascript sites y automated browserless OAuth authentication for Twitter. Al final del primer artículo hay una gran cantidad de recursos adicionales que he estado compilando desde 2011.

1

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

Por ejemplo, una captura de paquetes 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 

A continuación, 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 
7

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

Toda la página está cargada, y es muy fácil eliminar datos relacionados con ajax. Puede comprobar este tutorial básico para aprender Automating & Scraping with PhantomJS and CasperJS

También puede dar un vistazo a este código de ejemplo, en la forma de raspar Google sugiere palabras clave:

/*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(); 
}); 
+0

Pero, ¿cómo usar con PHP? –

+0

Lo ejecuta con shell_exec. Sin otra opción. – mattspain

1

me gusta PhearJS, pero que podrían ser en parte porque Lo construí.

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

1

El controlador web Selenium 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 REAL, las páginas (incluyendo javascript y Ajax) se cargan como lo hacen con un humano que usa ese navegador.

La desventaja es que es lenta (ya que lo más probable es que le gustaría esperar a que se carguen todas las imágenes y scripts antes de realizar su raspado en esa única página).

Cuestiones relacionadas