我需要做一些網絡抓取。在使用不同的Web測試框架之後,其中大多數地方的速度太慢(Selenium)或者我的需求太多(env.js),我認爲zombie.js看起來最有希望,因爲它使用一組可靠的庫進行HTML解析和DOM操作。然而,在我看來,像它竟然不支持基本的基於事件的Javascript代碼如以下網頁:網站抓取使用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>
我於是決定手動觸發這些事件是這樣的:
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());
});
});
});
這適用於這個特定的測試頁面。不過,我的問題是更普遍的問題:我希望能夠在Facebook上抓取更復雜的基於AJAX的網站(如http://www.facebook.com/profile.php?id=100000028174850&sk=friends&v=friends)。使用殭屍登錄到網站並不是問題,但是像這些列表這樣的內容似乎完全使用AJAX加載,我不知道如何觸發啓動加載的事件處理程序。
有幾個問題我有一個關於這個問題:
- 已有人已經實施了類似的複雜刮不使用瀏覽器進行遠程控制一樣硒的解決方案?
- 是否有一些有關基於JavaScript的複雜頁面加載過程的參考?
- 有人可以提供關於如何調試真正的瀏覽器,看看我可能需要執行觸發Facebook事件處理程序的建議嗎?
- 有關此主題的任何其他想法?
再次,請不要指出我涉及控制像Selenium這樣的真正瀏覽器的解決方案,因爲我知道這些。不過,歡迎提供一些真正的內存中渲染器的建議,如WebKit可以從Ruby腳本語言訪問,但最好能夠設置cookie,並且最好還可以加載原始HTML,而不是觸發真正的HTTP請求。
你正在尋找一個JavaScript測試框架或Web數據提取工具嗎?如果你只是在尋找一個scree-scraping工具,那麼可以在不執行Javascript的情況下刮掉大多數網站,甚至是AJAX重量級的網站。 – chesles
問題是關於網絡抓取。你是對的,通常確實有可能在不執行Js的情況下做到這一點,例如通過手動發佈REST請求。在Facebook的情況下,只需使用HTTP和HTML解析就可以抓取該網站的移動版本。但我對通用解決方案感興趣,它理解Javascript並且不需要真正的瀏覽器實例。這似乎是可能的,因爲env.Js和zombie.Js顯示,但它似乎是一個技巧問題。 –