2008-12-27 36 views
6

Tôi muốn xóa các trang người dùng của SO để cung cấp cho chủ sở hữu thanh công cụ của tôi thông tin được cập nhật về câu hỏi/câu trả lời của họ ...Cách thực hiện tải nền và cào của trang có XUL/Firefox Extension

Điều này có nghĩa là tôi cần làm điều này trong nền, phân tích các trang, trích xuất nội dung, so sánh nó với lần chạy cuối cùng và sau đó trình bày kết quả trên thanh công cụ hoặc thanh trạng thái, hoặc cách khác, trên cửa sổ bật lên của một số loại. Và tất cả điều này phải được thực hiện trong khi người dùng đang đi về kinh doanh của mình không bị gián đoạn hoặc thậm chí là trên SO.

Tôi đã tìm kiếm khá kỹ lưỡng cả trên Google và trên Mozilla Wiki cho một số loại gợi ý. Tôi thậm chí đã đi đến mức độ tải xuống một vài phần mở rộng khác mà tôi nghĩ rằng làm như vậy. Thật không may tôi đã không có thời gian để đi qua tất cả chúng và những cái tôi đã xem xét, tất cả các API sử dụng dữ liệu (Dịch vụ, WebServices, XML), không phải html scrapping.

Cũ câu hỏi văn bản

Tôi đang tìm kiếm một nơi đẹp để tìm hiểu làm thế nào tôi có thể tải một trang bên trong một hàm gọi là mua set_timeout khét tiếng() để xử lý một màn hình cào ở chế độ nền.

Ý tưởng của tôi là trình bày kết quả của việc cào như vậy trong tiện ích mở rộng thanh trạng thái, chỉ trong trường hợp có bất kỳ điều gì thay đổi từ lần chạy cuối cùng.

Có lớp phủ ẩn hoặc một số bộ phận phụ khác không?

Trả lời

6

Trong trường hợp XUL/Firefox, những gì bạn cần là giao diện nsIIOService, mà bạn có thể nhận được như thế này:

var mIOS = Components.classes["@mozilla.org/network/io-service;1"]. 
    getService(Components.interfaces.nsIIOService); 

Sau đó, bạn cần phải tạo ra một kênh, và mở một liên kết không đồng bộ:

var channel = mIOS.newChannel(urlToOpen, 0, null); 
channel.asyncOpen(new StreamListener(), channel); 

Mấu chốt ở đây là đối tượng StreamListener:

var StreamListener = function() { 
    return { 
     QueryInterface: function(aIID) { 
      if (aIID.equals(Components.interfaces.nsIStreamListener) || 
       aIID.equals(Components.interfaces.nsISupportsWeakReference) || 
       aIID.equals(Components.interfaces.nsISupports)) 
       return this; 
      throw Components.results.NS_NOINTERFACE; 

     onStartRequest: function(aRequest, aContext) 
      { return 0; }, 

     onStopRequest: function(aRequest, aChannel /* aContext */, aStatusCode) 
      { return 9; }, 

     onDataAvailable: function(aRequest, aContext, aStream, aOffset, aCount) 
      { return 0; } 
    }; 
} 

Bạn có để điền thông tin chi tiết vào các chức năng onStartRequest, onStopRequest, onDataAvailable, nhưng điều đó là đủ để bạn bắt đầu. Bạn có thể xem cách tôi sử dụng giao diện này trong phần mở rộng Firefox của tôi (nó được gọi là IdentFavIcon, và nó có thể được tìm thấy trên trang add-on mozilla).

Phần mà tôi không chắc chắn là cách bạn có thể kích hoạt yêu cầu trang này theo thời gian, mặc dù vậy, có lẽ set_timeout() có thể hoạt động.

Edit:

  1. Xem ví dụ here (xem phần Tải hình ảnh) cho một ví dụ về cách thu thập dữ liệu đã tải về vào một biến duy nhất; và
  2. Xem this page về cách chuyển đổi nguồn HTML thành cây DOM.

HTH.

+0

"trang" sau đó có thể được sử dụng làm đối tượng DOM không? –

+0

Tôi đã cố gắng trả lời câu hỏi này trong bản chỉnh sửa của mình. –

1

Từ JavaScript đặc quyền, tức là JS trong tiện ích, bạn được phép tạo ẩn iframe s; tải xuống trang được chỉ định cũng đơn giản như đặt vị trí trên khung này.

Nếu bạn đang kéo xuống một trang tĩnh đơn giản mà bạn sở hữu, set_timeout sẽ ổn. Nhưng trong trường hợp đó, tại sao không sử dụng XHR?

Nếu bạn đang kéo xuống các trang tùy ý, các trang có các yếu tố động hoặc nhiều nội dung, tôi khuyên bạn nên kích hoạt việc xóa trang bằng cách sử dụng Document.onload trình xử lý sự kiện thay thế. Đó là cách đáng tin cậy hơn, và bạn có thể nhận được thông minh về cạo trang tại thời điểm sớm nhất có thể, nhưng khi bạn biết nội dung cần thiết là có.

Tôi không nghĩ rằng có một hướng dẫn cụ thể về điều này, nhưng Mozilla Developer Center, mà tôi chắc chắn bạn đã tìm thấy, hoàn toàn tuyệt vời - tài liệu kỹ thuật trực tuyến tốt nhất theo ý kiến ​​của tôi!

+0

XHR có giấy phép mở rộng để truy cập các tên miền khác không? Tôi có thể sử dụng các tiện ích Firefox DOM trên HTML được lấy từ XHR không. –

3

Tôi không chắc chắn nếu tôi hiểu câu hỏi hoàn toàn, nhưng sẽ cố gắng trả lời một vài câu hỏi thay thế rõ ràng:

Nếu bạn đang tìm kiếm trang web tĩnh cào BeautifulSoup (Python) là một trong những cách dễ nhất và .

Nếu bạn đang tìm kiếm thay đổi trong trang dựa trên Ajax, thay đổi theo thời gian, bạn sẽ phải tiếp tục chạy mã trong vòng lặp vô hạn. Nhưng không thăm dò trang web quá thường xuyên, nó sẽ phát hiện mức tiêu thụ băng thông và có thể chặn IP của bạn, vì vậy hãy thăm dò ý kiến ​​trong một khoảng thời gian nào đó.

Nếu bạn đang tìm cách để loại bỏ một số mã được hiển thị javascript hoặc một cái gì đó, điều đó không thể được thực hiện cho đến khi trang được hiển thị, do đó không thể với BeautifulSoup một mình. bạn sẽ phải sử dụng một trình duyệt không đầu như Crowbar - Similie (sử dụng XULRunner) để hiển thị nội dung javascript trên trình duyệt không đầu và đầu ra của nội dung được hiển thị này có thể được sử dụng làm đầu vào cho trình thu thập BeautifulSoup.

+0

Tôi phải làm điều đó bên trong một thanh công cụ là một phần mở rộng của Firefox. Tham khảo làm rõ của tôi. –

Các vấn đề liên quan