2

だから私は特定のウェブサイトのウェブスクレイピングに取り組んでいます。問題は:

URL のセット (100 から 1000 の順序) が与えられた場合、各 URL の HTML を効率的な方法で、特に時間的に取得したいと考えています。5分ごとに1000件のリクエストを処理できる必要があります。

これは通常、スレッドのプールを使用して、まだリクエストされていない一連の URL からのリクエストを実行することを意味します。しかし、これを実装する前に、ここで質問する価値があると思います。これは、Web スクレイピングや Web クロールを行う際によくある問題だと思うからです。

必要なものが含まれているライブラリはありますか?

4

4 に答える 4

1

だから私は特定のウェブサイトのウェブスクレイピングに取り組んでいます。

単一のサーバーをスクレイピングしていますか、それとも他の複数のホストからウェブサイトをスクレイピングしていますか? 前者の場合、スクレイピングしているサーバーは、単一の i/p からの同時接続が多すぎることを好まない可能性があります。

後者の場合、これは実際には、マシンからいくつのアウトバウンド接続を開く必要があるかについての一般的な質問です. 物理的な限界はありますが、かなり大きいです。実際には、そのクライアントが展開される場所によって異なります。接続性が優れているほど、対応できる接続数が多くなります。

優れたダウンロード マネージャーのソース コードを調べて、アウトバウンド接続の数に制限があるかどうかを確認することをお勧めします。

間違いなくユーザーの非同期 I/O ですが、それでも数を制限することをお勧めします。

于 2013-01-17T02:17:14.387 に答える
0

帯域幅の使用率は、どのように分割しても、取得するすべての HTML ドキュメント (および少しのオーバーヘッド) の合計になります (一部の Web サーバーは圧縮された HTTP ストリームをサポートする場合があるため、圧縮された HTTP ストリームを受け入れることができるクライアントを必ず使用してください)。

同時スレッドの最適な数は、問題のサイトへのネットワーク接続に大きく依存します。実験だけが最適な数を見つけることができます。確かに、HTML ドキュメントを取得するために 1 つのスレッド セットを使用し、それらを処理するために別のスレッド セットを使用して、適切なバランスを見つけやすくすることができます。

私は .NET の世界での Web スクレイピング用のHTML Agility Packの大ファンですが、Java について具体的に推奨することはできません。次の質問は、適切な Java ベースのスクレイピング プラットフォームを見つけるのに役立つ場合があります。

JavaによるWebスクレイピング

于 2013-01-17T01:53:13.763 に答える
0

http://wwww.Jsoup.orgパーツを廃棄するためだけに!スレッドプーリングは、urself を実装する必要があると思います。

アップデート

このアプローチがニーズに合っている場合は、完全なクラス ファイルをhttp://codetoearn.blogspot.com/2013/01/concurrent-web-requests-with-thread.htmlからダウンロードできます。

    AsyncWebReader webReader = new AsyncWebReader(5/*number of threads*/, new String[]{
              "http://www.google.com",
              "http://www.yahoo.com",
              "http://www.live.com",
              "http://www.wikipedia.com",
              "http://www.facebook.com",
              "http://www.khorasannews.com",
              "http://www.fcbarcelona.com",
              "http://www.khorasannews.com",
            });

    webReader.addObserver(new Observer() {
      @Override
      public void update(Observable o, Object arg) {
        if (arg instanceof Exception) {
          Exception ex = (Exception) arg;
          System.out.println(ex.getMessage());
        } /*else if (arg instanceof List) {
          List vals = (List) arg;
          System.out.println(vals.get(0) + ": " + vals.get(1));
        } */else if (arg instanceof Object[]) {
          Object[] objects = (Object[]) arg;
          HashMap result = (HashMap) objects[0];
          String[] success = (String[]) objects[1];
          String[] fail = (String[]) objects[2];

          System.out.println("Failds");
          for (int i = 0; i < fail.length; i++) {
            String string = fail[i];
            System.out.println(string);
          }

          System.out.println("-----------");
          System.out.println("success");
          for (int i = 0; i < success.length; i++) {
            String string = success[i];
            System.out.println(string);
          }

          System.out.println("\n\nresult of Google: ");
          System.out.println(result.remove("http://www.google.com"));
        }
      }
    });
    Thread t = new Thread(webReader);
    t.start();
    t.join();
于 2013-01-17T04:03:56.383 に答える
0

非同期通信の研究から始めます。次に、Nettyを見てください。

Web ページの読み込み速度には常に制限があることを覚えておいてください。平均的なホーム接続の場合、約 1 秒かかります。アプリケーションをプログラミングするときは、この点を考慮してください。

于 2013-01-17T01:52:31.013 に答える