0

URLリンクを指定して、ページのコンテンツをhtml形式で取得したいと思います。Javaでは、これをgetInputStreamメソッドで実装できることを知っています。

質問は、今私は何百万ものURLを持っているということです。そしてそれらのhtmlページを取得したい。それでも使用する場合getInputStream。それは時間がかかり、パフォーマンスが悪いです。だから私はフェッチページのプロセスをスピードアップしたいと思います。

これを行うための効率的な方法と高速を取得したいと考えています。

前もって感謝します!

4

2 に答える 2

1

100 万の URL に対する大規模なスパイダーは、トリッキーなビジネスです。一方では、スレッド プール ( Executors.newFixedThreadPool(100)) とApache Http クライアントのプールを使用するのは簡単です。ただし、このコードを実行する中程度の速度のシステムでさえ、サーバー上でサービス拒否を完全に行うことができます。特定のサーバーに非常に多くのリクエストを送信して、フォールオーバーを開始します。

秘訣は、スレッドが同じサーバー (おそらく同じクラス C) に、それらを圧倒するような速度で要求しないように、スレッドを調整する方法です。これを行う 1 つの方法は、1 つのスレッドで名前 -> IP 解決を行うことです。これにより、スパイダー対象のキューに URL を慎重に追加できます。たとえば、Google は小さなサイトを 1 分間に 1 つの URL でスパイダーします。それらは 1 秒にまで短縮されており、スパイダー テクノロジがダウンロードのスケジューリングにいかに優れているかを示しています。ただし、それを正しく行うために、中程度のハードスレッドとキューロジックがいくつかあります。

これを行う最善の方法は、[願わくば] 既にこの問題を解決している既存の技術を使用することだと思います。以下に、既存の実装につながる可能性のあるリンクをいくつか示します。

于 2012-04-24T13:13:56.023 に答える
0

Crawler4jApache Nutchなどのオープンソースの Web クローラーを使用することをお勧めします。すべての URL をクローラーのシードとしてインポートし、深さを 1 に設定するだけです。
Crawler4j は軽量の Web クローラーで、ユーザーに非常にシンプルなインターフェースを提供します。Crawler4j をアプリケーションに統合するのは非常に簡単です。
Crawler4j と比較すると、Nutch は非常に複雑です。ナットを学習してカスタマイズするには、さらに時間がかかります。
自分で取得したい場合は、Apache HTTP クライアントが適しています。多くの Web クローラーはこれに基づいています。礼儀正しく、1 秒間のリクエスト数を制限することで、サービス拒否の問題を回避できます。

于 2012-04-28T04:15:24.933 に答える