0

Web API を使用して、Old Bailey Online アーカイブ全体のサブセットを取得しようとしています。

私の問題は、私の実装が遅いだけでなく、サーバーがかなり迅速に (約 10 分) リクエストの処理を停止することです。

現在、urllib3 の開発バージョンを次のように使用しています。

import urllib3
retry = urllib3.util.Retry(total=1000, read=200, connect=200, backoff_factor=0.5)
timeout = urllib3.util.Timeout(connect=2.0, read=4.0)
http=urllib3.PoolManager(retry=retry, timeout=timeout, maxsize=10)

次に、この http プールを使用してすべてのリクエストを実行します。私が選んだ数字はかなりばかげていますが、これまでで最高の 8(

毎年、243 年以上にわたり、さまざまなシナリオで 70 件の同時リクエストを行う必要があります。@shazow ( https://stackoverflow.com/a/24046895/398969に従って python3.4 で動作するように変更) でワーカープールを使用してみました。主にサーバーのタイムアウトと私の無知が原因です。

DNS ルックアップによってかなりの遅延が発生していますか? ドメインがApache仮想ホストであるため、IPを使用できません(または使用できますか?)

スー。本当の質問: 同じサーバーから何十万回も「うまく」タイムリーにダウンロードするにはどうすればよいでしょうか? まだ1日かそこらかかると思います 8)

4

1 に答える 1

1

あまりにも多くのリクエストを頻繁に行うために、サーバーが IP を抑制/禁止しているようです。

まず、ドメインの robots.txt をチェックして、自動リクエストの頻度に関するガイダンスがあるかどうかを確認することをお勧めします。そうでない場合は、ウェブサイトの所有者に、サイトを最適にクロールする方法についてアドバイスを求めることができます。それ以外の場合は、レート制限を実験的に決定する必要がある場合があります。

リクエストを調整するには、 apiclient .RateLimiter* ( source )などを使用できます。次のようになります。

from apiclient import RateLimiter
from urllib3 import PoolManager

lock = RateLimiter(max_messages=30, every_seconds=60)
http = PoolManager(...)
...

for url in crawl_list:
    lock.acquire()
    r = http.request(...)

Google または archive.org から入手できる場合は、サイトのキャッシュ バージョンをクロールすることもできます。

[*]免責事項: 私もずっと前に apiclient を書きました。それは非常によく文書化されていません。不足している場合に使用できる同様のモジュールが他にもあると思いますが、ソースは理解しやすく拡張しやすいはずです。

于 2014-10-29T17:33:13.867 に答える