Potrzebuję wykonać skrobanie w Internecie. Po zabawie z różnymi frameworkami do testowania stron internetowych, z których większość jest albo zbyt wolna (Selenium), albo zbyt niepoprawna dla moich potrzeb (env.js), zdecydowałem, że najbardziej obiecująca jest wersja zombie.js, ponieważ używa ona stałego zestawu bibliotek do analizy parsowania HTML i manipulacja DOM. Jednak wydaje mi się, że nawet nie obsługiwać podstawowe opartego na zdarzeniu kod Javascript, jak w poniższej stronie internetowej:Problemy ze skrobaniem witryny za pomocą 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>
I wtedy postanowił wyzwolić te wydarzenia ręcznie tak:
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());
});
});
});
Która działa dla tej konkretnej strony testowej. Mój problem jest jednak bardziej ogólny: chcę być w stanie zadrapać bardziej złożone witryny oparte na AJAX, takie jak lista znajomych na Facebooku (coś w stylu: http://www.facebook.com/profile.php?id=100000028174850&sk=friends&v=friends). Nie ma problemu z zalogowaniem się do witryny za pomocą zombie, ale niektóre treści, takie jak te, wydają się być całkowicie załadowane dynamicznie przy użyciu AJAX i nie wiem, jak wywołać procedury obsługi zdarzeń inicjujące ładowanie.
Istnieje kilka pytań mam odnośnie tego problemu:
- Czy ktoś już wdrożyła kompleksowy skrobaczki podobnie bez użycia przeglądarki zdalnej kontroli rozwiązanie jak selen?
- Czy istnieje odniesienie do procesu ładowania złożonej strony opartej na Javascript?
- Czy ktoś może doradzić, jak debugować prawdziwą przeglądarkę, aby zobaczyć, co może być konieczne do uruchomienia funkcji obsługi zdarzeń Facebook?
- Jakieś inne pomysły na ten temat?
Jeszcze raz proszę, nie kierujcie mnie do rozwiązań dotyczących kontrolowania prawdziwej przeglądarki, takiej jak Selenium, o czym ja wiem. Jednakże mile widziane są sugestie dotyczące prawdziwego mechanizmu renderowania w pamięci, takiego jak WebKit, dostępnego z języka skryptowego Ruby, ale preferowanie z możliwością ustawienia plików cookie i preferowane jest również ładowanie nieprzetworzonego HTML zamiast wyzwalania prawdziwych żądań HTTP.
Szukasz platformy testowej javascript lub internetowego narzędzia do wyodrębniania danych? Jeśli szukasz tylko narzędzia do zdrapywania piargów, możliwe jest zeskanowanie większości witryn bez wykonywania ich Javascript, nawet ciężkich AJAX. – chesles
Pytanie dotyczy skrobaczki internetowej. Masz rację, często jest to możliwe, bez wykonywania Js, np. poprzez ręczne wysyłanie żądań REST. W przypadku Facebooka, zbieranie wersji mobilnej witryny jest całkiem możliwe przy użyciu tylko analizy HTTP i HTML. Ale interesuje mnie ogólne rozwiązanie, które rozumie Javascript i nie wymaga prawdziwej instancji przeglądarki. Wydaje się to być możliwe, jak pokazuje to JJ i zombie.Js, ale wydaje się, że jest to problem sztuczek. –