Tôi cần thực hiện một số thao tác cạo web. Sau khi chơi xung quanh với các khung kiểm tra web khác nhau, trong đó phần lớn là quá chậm (Selenium) hoặc quá lỗi cho nhu cầu của tôi (env.js), tôi quyết định rằng zombie.js trông có vẻ hứa hẹn nhất, vì nó sử dụng một bộ các thư viện để phân tích cú pháp HTML và thao tác DOM. Tuy nhiên, có vẻ như với tôi như nó thậm chí không hỗ trợ sự kiện dựa trên mã Javascript cơ bản như trong trang web sau đây:Các vấn đề với việc xoá trang web bằng cách sử dụng 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>
sau đó tôi quyết định để kích hoạt những sự kiện bằng tay như thế này:
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());
});
});
});
Làm việc cho trang thử nghiệm cụ thể này. Vấn đề của tôi là một vấn đề tổng quát hơn, mặc dù: Tôi muốn có thể loại bỏ các trang web dựa trên AJAX phức tạp hơn như một danh sách bạn bè trên Facebook (giống như http://www.facebook.com/profile.php?id=100000028174850&sk=friends&v=friends). Không có vấn đề gì khi đăng nhập vào trang web bằng cách sử dụng zombie, nhưng một số nội dung như những danh sách đó có vẻ hoàn toàn được tải động bằng AJAX và tôi không biết cách kích hoạt trình xử lý sự kiện bắt đầu tải.
Có một số câu hỏi tôi đã liên quan đến vấn đề này:
- Có ai đó đã thực hiện một scraper phức tạp tương tự mà không sử dụng một trình duyệt từ xa kiểm soát giải pháp như Selenium?
- Có một số tham chiếu về quá trình tải của trang phức tạp dựa trên Javascript không?
- Ai đó có thể cung cấp lời khuyên về cách gỡ lỗi một trình duyệt thực để xem những gì tôi có thể cần thực thi để kích hoạt trình xử lý sự kiện trên Facebook?
- Bất kỳ ý tưởng nào khác về chủ đề này?
Một lần nữa, vui lòng không chỉ cho tôi các giải pháp liên quan đến việc kiểm soát trình duyệt thực như Selenium, như tôi biết. Tuy nhiên, những gì được chào đón là những gợi ý cho một renderer trong bộ nhớ thực như WebKit có thể truy cập từ ngôn ngữ kịch bản lệnh Ruby, nhưng tốt nhất là khả năng thiết lập cookie và cũng thích tải HTML thô thay vì kích hoạt các yêu cầu HTTP thực.
Bạn đang tìm kiếm một khung kiểm tra javascript hay một công cụ trích xuất dữ liệu web? Nếu bạn chỉ đang tìm kiếm một công cụ scree-scraping, nó có thể để cạo hầu hết các trang web mà không cần thực hiện Javascript của họ, ngay cả những cái AJAX-nặng. – chesles
Câu hỏi đặt ra là về cào web. Bạn nói đúng, thường thực sự có thể làm được điều này mà không cần thi hành Js, ví dụ: bằng cách phát hành các yêu cầu REST theo cách thủ công. Trong trường hợp của Facebook, việc cạo phiên bản di động của trang web hoàn toàn có thể chỉ bằng cách sử dụng phân tích cú pháp HTTP và HTML. Nhưng tôi quan tâm đến một giải pháp chung để hiểu Javascript và không yêu cầu một phiên bản trình duyệt thực sự. Điều này có vẻ là có thể, như env.Js và zombie.Js cho thấy, nhưng nó có vẻ là một vấn đề thủ đoạn. –