2011-09-07 21 views
8

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.

+0

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

+1

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. –

Trả lời

12

Với mục đích khai thác dữ liệu, chạy "trình duyệt không đầu" và kích hoạt các sự kiện javascript theo cách thủ công sẽ không phải là điều dễ nhất để thực hiện. Trong khi không phải là không thể, có những cách đơn giản hơn để làm điều đó.

Hầu hết các trang web, ngay cả các trang web AJAX-nặng, có thể được cạo mà không cần thực hiện một dòng mã Javascript của chúng. Trong thực tế, thường dễ hơn là cố gắng tìm ra mã Javascript của trang web, thường bị làm xáo trộn, rút ​​gọn và khó gỡ lỗi. Nếu bạn hiểu rõ về HTTP, bạn sẽ hiểu tại sao: (gần như) tất cả các tương tác với máy chủ được mã hóa dưới dạng yêu cầu HTTP, cho dù chúng được bắt đầu bằng Javascript hay người dùng nhấp vào liên kết hoặc mã tùy chỉnh trong chương trình bot, không có sự khác biệt với máy chủ. (Tôi nói gần như bởi vì khi Flash hoặc applet tham gia, không có dữ liệu nào đang bay ở đâu; chúng có thể là ứng dụng cụ thể. Nhưng mọi thứ được thực hiện trong Javascript sẽ đi qua HTTP.)

Điều đó đang được nói, có thể bắt chước người dùng trên bất kỳ trang web nào bằng phần mềm tùy chỉnh. Trước tiên, bạn phải có khả năng xem các yêu cầu HTTP thô được gửi đến máy chủ. Bạn có thể sử dụng máy chủ proxy để ghi lại các yêu cầu được thực hiện bởi trình duyệt thực đến trang web mục tiêu. Có rất nhiều công cụ bạn có thể sử dụng cho việc này: Charles hoặc Fiddler tiện dụng, được dành riêng nhất screen-scraper tools có proxy cơ bản tích hợp, tiện ích mở rộng Firebug cho Firefox và Chrome có các công cụ tương tự để xem yêu cầu AJAX ... bạn có ý tưởng .

Khi bạn có thể thấy các yêu cầu HTTP được thực hiện do kết quả của một hành động cụ thể trên trang web, thật dễ dàng để viết chương trình để bắt chước các yêu cầu này; chỉ cần gửi cùng một yêu cầu đến máy chủ và nó sẽ xử lý chương trình của bạn giống như một trình duyệt trong đó một hành động cụ thể đã được thực hiện.

Có các thư viện khác nhau cho các ngôn ngữ khác nhau cung cấp các khả năng khác nhau. Đối với ruby, tôi đã thấy rất nhiều người sử dụng mechanize for ruby.

Nếu khai thác dữ liệu là mục tiêu duy nhất của bạn, thì bạn hầu như luôn có thể có được những gì bạn cần bằng cách mô phỏng các yêu cầu HTTP theo cách này. Không yêu cầu Javascript.

Lưu ý - Vì bạn đã đề cập đến Facebook, nên đề cập đến việc cạo Facebook đặc biệt khó khăn (mặc dù không thể), vì Facebook có các biện pháp để phát hiện truy cập tự động (chúng sử dụng nhiều hơn chỉ là captchas); họ sẽ vô hiệu hóa một tài khoản nếu họ thấy hoạt động đáng ngờ đến từ nó. Đó là, sau khi tất cả, chống lại terms of service của họ (phần 3.2).

+1

Cảm ơn bạn đã xây dựng câu trả lời phức tạp này cho câu hỏi. Tôi đã sử dụng Firebug và Fiddler2 để giám sát lưu lượng HTTP đến và từ máy chủ web, tuy nhiên điều này không hữu ích nếu chủ đề giao tiếp khó đảo ngược được sử dụng, do nhiều trang mạng xã hội thực hiện. Nhưng ngay cả khi nó có thể sử dụng giao diện cấp thấp để nói chuyện với một máy chủ web và trích xuất thông tin, điều này sẽ yêu cầu chỉnh liên tục của scraper, mà có thể rất tốn thời gian. Env.js (mà tôi _almost_ đã làm việc như tôi muốn) cho thấy rằng trên thực tế có thể mô phỏng một trình duyệt thực sự theo chương trình. –

+0

Đó là sự thật, facebook và các trang web khác cố gắng để làm cho nó càng khó càng tốt để bạn có thể cạo các trang web của họ; họ thích bạn sử dụng API của họ để họ có thể kiểm soát tốt hơn những gì chương trình của bạn truy cập và do đó bảo vệ quyền riêng tư của người dùng tốt hơn. – chesles

+0

Tuy nhiên, việc mô phỏng người dùng lướt sóng bằng công cụ như Selenium dường như không hoạt động (trừ chậm), tôi không gặp phải bất kỳ trở ngại nào ngoại trừ việc sử dụng rộng rãi nội dung động. Ngay cả OAuth cũng không được bảo đảm chống lại truy cập tự động, việc xác thực có thể được viết kịch bản mà không gặp bất kỳ vấn đề gì và thậm chí không yêu cầu Javascript hoạt động. –