6

SOのユーザーページをスクレイピングして、ツールバーの所有者に質問/回答などの最新情報を提供したい...

これは、これをバックグラウンドで実行し、ページを解析し、コンテンツを抽出し、前回の実行と比較して、結果をツールバーまたはステータス バー、あるいは一部のポップアップ ウィンドウに表示する必要があることを意味します。親切。そして、これはすべて、ユーザーがビジネスを中断せずに、または SO でさえ行っている間に実行する必要があります。

Google と Mozilla Wiki の両方で、何らかのヒントを求めて徹底的に検索しました。私は、同じことをすると思われる他のいくつかの拡張機能をダウンロードする程度まで行きました. 残念ながら、私はそれらすべてを調べる時間がありませんでした。私が見たものはすべて、html スクレイピングではなく、データ API (サービス、Web サービス、XML) を使用しています。

古い質問文

悪名高い set_timeout() という関数内にページをロードして、バックグラウンドでスクリーンスクレイピングを処理する方法を学ぶのに最適な場所を探しています。

私の考えは、前回の実行から何らかの変更があった場合に備えて、このようなスクレイピングの結果をステータス バーの拡張機能に表示することです。

隠されたオーバーレイやその他の策略はありますか?

4

4 に答える 4

6

XUL/Firefox の場合、次のように取得できる nsIIOService インターフェースが必要です。

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

次に、チャネルを作成し、非同期リンクを開く必要があります。

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

ここで重要なのは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; }
    };
}

onStartRequestonStopRequest、関数の詳細を入力するonDataAvailable必要がありますが、それで十分です。このインターフェイスを Firefox 拡張機能でどのように使用したかをご覧ください (これは IdentFavIcon と呼ばれ、mozilla アドオン サイトにあります)。

私が確信していない部分は、このページ要求を時々トリガーする方法ですが、 set_timeout()おそらくうまくいくはずです.

編集:

  1. ダウンロードしたデータを単一の変数に収集する方法の例については、こちらの例を参照してください (画像のダウンロードのセクションを参照)。と
  2. HTML ソースを DOM ツリーに変換する方法については、このページを参照してください。

HTH。

于 2009-01-10T21:16:04.863 に答える
3

質問を完全に理解したかどうかはわかりませんが、いくつかの明らかな別の質問に答えようとします。

静的な Web ページのスクレイピングを探している場合は、BeautifulSoup (Python) が最も簡単な方法の 1 つです。

時間の経過とともに変化する Ajax ベースのページで変更を探している場合は、コードを無限ループで実行し続ける必要があります。ただし、サイトを頻繁にポーリングしないでください。帯域幅の消費が検出され、IP がブロックされる可能性があるため、一定の間隔でポーリングしてください。

JavaScriptでレンダリングされたティッカーなどをスクレイピングしようとしている場合、それはページがレンダリングされるまで実行できないため、BeautifulSoupだけでは不可能です。ヘッドレス ブラウザで JavaScript コンテンツをレンダリングするCrowbar - Similie (XULRunner を使用)のようなヘッドレス ブラウザを使用する必要があります。このレンダリングされたコンテンツの出力は、BeautifulSoup スクレーパーへの入力として使用できます。

于 2008-12-27T18:16:00.867 に答える
1

特権のある JavaScript、つまり拡張機能の JS から、非表示iframeの を作成できます。指定したページをダウンロードするのは、このフレームで場所を設定するのと同じくらい簡単です。

所有している単純な静的ページをプルダウンする場合は、set_timeout問題ありません。しかし、その場合、なぜ XHR を使用しないのでしょうか?

任意のページ、動的要素または大量のコンテンツを含むページをプルダウンする場合は、Document.onload代わりにイベント ハンドラーを使用してページのスクレイプをトリガーすることをお勧めします。それははるかに信頼性が高く、必要なコンテンツがそこにあることがわかっているときに、可能な限り早い段階でページをスクレイピングすることを賢くすることができます.

これに関する特定のチュートリアルはないと思いますが、Mozilla Developer Centerは、あなたがすでに見つけたと確信している、非常に優れたものです。私の意見では、最高のオンライン技術文書です!

于 2008-12-27T17:21:56.810 に答える
0

XMLHttpRequestを見てください。開始する必要があります。

于 2009-01-07T21:14:56.060 に答える