Ho bisogno di fare un po 'di scraping web. Dopo aver giocato con diversi framework di testing web, dei quali più troppo lento (Selenium) o troppo buggy per i miei bisogni (env.js), ho deciso che zombie.js sembra molto promettente, poiché utilizza un solido set di librerie per l'analisi HTML e manipolazione DOM. Tuttavia, mi sembra come se non ha nemmeno supporta il codice di base basata su eventi JavaScript come nella seguente pagina web:Problemi con scraping del sito web utilizzando 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>
Ho quindi deciso di attivare quegli eventi manualmente in questo modo:
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());
});
});
});
Che funziona per questa particolare pagina di test. Il mio problema è più generale, tuttavia: voglio essere in grado di grattare siti più complessi basati su AJAX come un elenco di amici su Facebook (qualcosa come http://www.facebook.com/profile.php?id=100000028174850&sk=friends&v=friends). Non è un problema accedere al sito usando zombie, ma alcuni contenuti come quelli sembrano caricati completamente dinamicamente usando AJAX, e non so come attivare i gestori di eventi che avviano il caricamento.
Ci sono diverse domande che ho per quanto riguarda questo problema:
- Ha qualcuno già implementato un raschietto simile complesso senza utilizzare un browser remoto-controllo soluzione come selenio?
- Esiste qualche riferimento sul processo di caricamento di una pagina complessa basata su Javascript?
- Qualcuno può fornire consigli su come eseguire il debug di un browser reale per vedere cosa potrebbe essere necessario eseguire per attivare i gestori di eventi di Facebook?
- Altre idee su questo argomento?
Ancora una volta, per favore non puntare a soluzioni che riguardano il controllo di un browser reale come il Selenium, come so di questi. Ciò che è comunque benvenuto sono i suggerimenti per un vero renderer in-memory come WebKit accessibile dal linguaggio di scripting di Ruby, ma preferibilmente con la possibilità di impostare cookie e preferibilmente caricare anche HTML non elaborato invece di attivare richieste HTTP reali.
Stai cercando un framework di test javascript o uno strumento di estrazione dei dati web? Se stai cercando uno strumento per la raschiatura dei graffi, è possibile analizzare la maggior parte dei siti senza eseguire Javascript, anche quelli pesanti AJAX. – chesles
La domanda riguarda il web scraping. Hai ragione, spesso è effettivamente possibile farlo senza eseguire Js, ad es. emettendo richieste REST manualmente. Nel caso di Facebook, raschiare la versione mobile del sito è del tutto possibile utilizzando solo l'analisi HTTP e HTML. Ma sono interessato a una soluzione generica che comprenda Javascript e non richieda una reale istanza del browser. Questo sembra essere possibile, come mostrano env.Js e zombie.Js, ma sembra essere un problema di trucchi. –