Necesito hacer un poco de raspado web. Después de jugar con diferentes frameworks de pruebas web, de los cuales la mayoría eran demasiado lentos (Selenium) o demasiado caídos para mis necesidades (env.js), decidí que zombie.js parecía el más prometedor, ya que usa un sólido conjunto de bibliotecas para analizar HTML y manipulación DOM. Sin embargo, me parece como si ni siquiera se admite el código Javascript básica basada en eventos como en la siguiente página web:Problemas con el raspado del sitio web usando zombie.js
<html>
<head>
<title>test</title>
<script type="text/javascript">
console.log("test script executing...");
console.log("registering callback for event DOMContentLoaded on " + document);
document.addEventListener('DOMContentLoaded', function(){
console.log("DOMContentLoaded triggered");
}, false);
function loaded() {
console.log("onload triggered");
}
</script>
</head>
<body onload="loaded();">
<h1>Test</h1>
</body>
</html>
Entonces me decidí a desencadenar estos eventos manualmente así:
zombie = require("zombie");
zombie.visit("http://localhost:4567/", { debug: true }, function (err, browser, status) {
doc = browser.document;
console.log("firing DOMContentLoaded on " + doc);
browser.fire("DOMContentLoaded", doc, function (err, browser, status) {
body = browser.querySelector("body");
console.log("firing load on " + body);
browser.fire("load", body, function (err, browser, status) {
console.log(browser.html());
});
});
});
que funciona para esta página de prueba en particular. Sin embargo, mi problema es más general: quiero ser capaz de eliminar sitios más complejos basados en AJAX, como una lista de amigos en Facebook (algo así como http://www.facebook.com/profile.php?id=100000028174850&sk=friends&v=friends). No es ningún problema iniciar sesión en el sitio usando zombies, pero algunos contenidos como esas listas parecen estar completamente cargados dinámicamente usando AJAX, y no sé cómo activar los controladores de eventos que inician la carga.
Hay varias preguntas que tenga con respecto a este problema:
- Ha alguien ya implementado un raspador igualmente compleja sin necesidad de utilizar un navegador solución como selenio se controla a distancia?
- ¿Hay alguna referencia sobre el proceso de carga de una página compleja basada en Javascript?
- ¿Puede alguien dar consejos sobre cómo depurar un navegador real para ver lo que podría necesitar para ejecutar los manejadores de eventos de Facebook?
- ¿Alguna otra idea sobre este tema?
De nuevo, por favor no me dirijan a soluciones que impliquen controlar un navegador real como Selenium, como yo sé. Sin embargo, lo que sí es bienvenido son sugerencias para un renderizador en memoria real como WebKit accesible desde el lenguaje de scripting Ruby, pero preferiblemente con la posibilidad de establecer cookies y, preferiblemente, cargar HTML sin procesar en lugar de generar solicitudes HTTP reales.
¿Está buscando un marco de prueba de JavaScript o una herramienta de extracción de datos web? Si solo está buscando una herramienta de raspado, es posible raspar la mayoría de los sitios sin ejecutar su Javascript, incluso los pesados AJAX. – chesles
La pregunta es sobre raspado web. Tienes razón, a menudo es posible hacer esto sin ejecutar Js, p. emitiendo solicitudes REST de forma manual. En el caso de Facebook, raspar la versión móvil del sitio es bastante posible usando únicamente el análisis HTTP y HTML. Pero estoy interesado en una solución genérica que entienda Javascript y no requiera una instancia real del navegador. Esto parece ser posible, como lo muestran env.Js y zombie.Js, pero parece ser un problema de trucos. –