3

wget 経由でダウンロードする必要がある URL の大きなテキスト ファイルがあります。基本的に各ドメイン名をループし、wget (os.system("wget "+URL)) を使用してダウンロードする小さな python スクリプトを作成しました。しかし問題は、接続後にリモートサーバーが応答しない場合、wget が接続でハングアップすることです。このような場合、時間制限を設定するにはどうすればよいですか? リモートサーバーが接続後に応答しない場合は、しばらくして wget を終了したいと思います。

よろしく、

4

4 に答える 4

3

--timeout seconds引数を使用して、リクエストの時間を制限します。必要に応じて、より具体的に使用することができます--connect-timeout seconds。詳細については、wget マニュアルを参照してください。

于 2012-09-27T14:55:16.613 に答える
3

などの外部ツールを使用する必要はありませんwget。ビルトインを使用しurllib2てファイルをダウンロードします。ドキュメントはこちらから入手できます

于 2012-09-27T14:55:24.180 に答える
2

wgetPythonからこのようなタスクを実行するためにバイナリを呼び出すべきではありません。代わりに、Pythonで利用可能なHTTPライブラリの1つを使用すると、エラー処理と制御が大幅に向上します。

標準ライブラリの一部である(urllib2公式ドキュメントMissing Manual )があります。

requestsただし、代わりに優れたモジュールを使用することを強くお勧めします。非常にクリーンなAPIを備えており、単純なタスクを必要に応じて単純にしますが、それでも多くの柔軟性ときめ細かい制御を提供します。

モジュールを使用すると、次のようにキーワード引数を使用してタイムアウト(秒単位)を指定requestsできます。timeout

response = requests.get(url, timeout=0.02)

タイムアウトを超えると、Timeout例外が発生します。例外をキャッチして、好きなように処理する必要があります。

import requests
from requests.exceptions import Timeout, ConnectionError

TIMEOUT = 0.02

urls = ['http://www.stackoverflow.com',
        'http://www.google.com']

for url in urls:
    try:
        response = requests.get(url, timeout=TIMEOUT)
        print "Got response %s" % response.status_code
        response_body = response.content
    except (ConnectionError, Timeout), e:
        print "Request for %s failed: %s" % (url, e)
        # Handle however you need to ...

サンプル出力:

http://www.stackoverflow.comのリクエストに失敗しました:リクエストがタイムアウトしました。
http://www.google.comのリクエストに失敗しました:リクエストがタイムアウトしました。
于 2012-09-27T15:27:14.523 に答える
1

これは python に関する質問ではなく、wget の使用方法に関する質問のようです。おそらく使用しているgnu wgetでは、デフォルトの再試行回数は20です。-tを使用して試行回数を設定できます。ファイルのダウンロードに失敗した場合、おそらくwget -t0はすぐにスキップします。または、 -S フラグを使用してサーバーの応答を取得し、python を適切に反応させることもできます。ただし、最も役立つオプションは -T またはタイムアウトです。これを -T10 に設定すると、10 秒後にタイムアウトして次に進みます。

編集:

リストを反復処理して URL のリストをダウンロードするだけの場合は、wget を使用します。ここでは Python は必要ありません。実際、1行でそれを行うことができます

awk '{print "wget -t2 -T5 --append-output=wget.log \"" $0 "\""}' listOfUrls | bash

これが行っていることは、URL のリストを実行し、wget を呼び出すことです。wget はファイルを 2 回ダウンロードしようとし、接続を終了する前に 5 秒待機します。また、応答を wget.log に追加します。これgrepは最後に行うことができます。 404 エラーを探しています。

于 2012-09-27T14:55:43.947 に答える