2011-02-12 19 views
5

私は大きなスクレイピングジョブを実行しています。ネットワーク待ち時間のためにスクリプトの時間のほとんどがブロックされています。私は、同時に複数の要求を行うことができますので、スクリプトをマルチスレッドしようとしているが、私のスレッドの約10%は、次のエラーPythonでのマルチスレッドWebリクエスト - '名前またはサービスが不明'

URLError: <urlopen error [Errno -2] Name or service not known> 

正常に完了し、他の90%は死にます。同じドメインから複数のページをリクエストしているため、DNSの問題があるようです。一度に25リクエスト(25スレッド)を作成します。私は一度に5つの要求に自分自身を制限すればすべてうまく動作しますが、約10回の要求に達すると、時々このエラーが見え始めます。

Repeated host lookups failing in urllib2 私はこの中にある提案と同じ問題を記述していますが、役に立たないと読んでいます。

マルチスレッドの代わりにマルチプロセッシングモジュールを使用してみましたが、同じ動作が発生します - 同じエラーでプロセスの約10%が死ぬ - これはurllib2の問題ではないと私につながりますしかし何か。

誰かが何が起こっているのか説明して修正する方法を提案できますか?

UPDATE

私は手動で私のスクリプトのすべてにサイトのIPアドレスをコーディングする場合は完璧に動作しますので、このエラーは、DNSルックアップ中にいつか起こります。

+0

サーバーにアクセスできますか?あなたは何らかのサービス妨害拒否の問題にぶつかっているかもしれませんし、サーバーがそれほど重いものでないなら、あなたは実際にそれを過負荷にしているかもしれません... – jswolf19

+0

それは何百ものものを扱うことができる主要なウェブサイトです何千もの同時リクエスト、私の25は小さな凹みさえしません。ドメイン名をIPアドレスに置き換えると、スクリプトが完璧に実行されるので、ウェブサイトが明示的に私をシャットアウトしないので、DNS解決の問題だと私は確信しています。この時点で、DNSルックアップが失敗している理由を理解したいだけです。 –

+0

それから、DNSサーバーで問題が発生する可能性があります。これは、特定の時間内にクライアントからの非常に多くの要求が許可されている場合に限られます。 – jswolf19

答えて

1

提案:nscdなど、ご使用のシステムでDNSキャッシュを有効にしてみてください。これにより、スクレーパーが常に同じドメインに要求を送信する場合、DNSルックアップの問題が解消されます。

リソースを解放するために、urllib2.urlopenによって返されたファイルオブジェクトが読み込まれた後に正しく閉じられていることを確認してください。さもなければ、システムの最大オープンソケットの限界に達するかもしれません。

また、politeness policyを考慮すると、Webクローラは複数のリクエストを持つサーバーのオーバーロードを避ける必要があります。

+1

私はこれらのことを両方行いました。私のポストにリンクしている他のスタックオーバーフローの質問は、これらの提案の両方を行いますが、私の問題は解決しません。ドメインではなくIPアドレスを直接使用していますが、DNSキャッシュに関連しているように見えるため、nscdがこの問題を解決しない理由を理解できません。 –

関連する問題