0

APIがないため、Webから一部のデータをクロールします。残念ながら、それはいくつかの異なるサイトからの非常に多くのデータであり、私はすぐに私が同じサイトに数千のリクエストを短時間で行うことができないことを学びました...私はできるだけ早くデータにアプローチしたいのですが、私はしませんDOS攻撃を引き起こしたくない:)

問題は、サーバーごとに機能が異なり、事前にそれらを知らないことです。サイトは私のクライアントに属しているので、私の意図は、スクリプトによって引き起こされる可能性のあるダウンタイムを防ぐことです。したがって、「最初に100万件のリクエストを試行し、失敗した場合は50万件を試行し、失敗した場合は... 」のようなポリシーはありません:)

これに関するベストプラクティスはありますか?Googleのクローラーは、同じサイトに対して同じ間に実行できるリクエストの数をどのように知るのでしょうか。たぶん、彼らは「プレイリストをシャッフル」するので、単一のサイトへの同時リクエストはそれほど多くありません。どういうわけかHTTP経由でこのようなものを検出できますか?単一の要求を待ち、応答時間を数え、サーバーのバランスがどれほど良いかを概算してから、どういうわけか同時要求の最大数を構成しますか?

私はPythonスクリプトを使用していますが、これは答えにはあまり関係ありません。潜在的なコードスニペットをどの言語で使用したいかをお知らせするためです。

4

1 に答える 1

1

グーグルスパイダーはかなり賢いです。私の小さなサイトでは、1分あたり1ページから1秒になります。彼らは明らかに時間とサイトを念頭に置いていっぱいになるページキューを持っています。また、同じサーバー上の複数のドメインにアクセスしないことについても十分に賢いのではないかと思います。そのため、URLだけでなくIP範囲もある程度認識されます。

特定の時間にスパイダーされるURLをキューに入れるジョブを、実際のスパイダージョブから分離することは、どのスパイダーにとっても優れたアーキテクチャです。すべてのスパイダーはurlToSpiderService.getNextUrl()、次のURLがスパイダーされない限り、(必要に応じて)ブロックするメソッドを使用できます。

グーグルはクモの速度を決定するためにサイトのページ数を調べていると思います。特定の時間に更新されるページが多いほど、その特定のサーバーに到達するまでの時間が短くなります。最初のクロールを実行する前に判断するのは難しいでしょうが、確かにそれをメトリックとして使用できるはずです。

1分ごとに1ページから始めて、特定のサイトでスパイダーされるページが増えるにつれて、遅延を減らすことができます。次のような何らかの機能が必要になります。

 public Period delayBetweenPages(String domain) {
     take the number of pages in the to-do queue for the domain
     divide by the overall refresh period that you want to complete in
     if more than a minute then just return a minute
     if less than some minimum then just return the minimum
 }

どういうわけかHTTP経由でこのようなものを検出できますか?

現代のインターネットでは、どうすればよいかわかりません。確かに、サーバーが数秒後に戻ってきたり、500エラーを返したりする場合は、に戻す必要がありますが、最近のサーバーの大部分では、通常の接続とダウンロードは1秒未満であり、多くのサーバーがあるかどうかはわかりません。その領域の統計から学ぶ必要があります。

于 2012-09-07T13:18:55.847 に答える