こけこっこー

がんばる

urllibでurlから画像ダウンロードするときにタイムアウトを設定する

pythonで画像ダウンロードする方法を調べたら出てきたのが urllib.request.urlretrieve を使う方法だったので、これを使っていました。

課題

しかしながら、たくさんの画像を一度にダウンロードしようとしたときにurllib.request.urlretrieve を使う方法だとタイムアウトをセットできず、 無駄に時間がかかってしまう問題がありました。

解決方法

urllib.request.urlopenタイムアウトをセットできます。 これを使えば問題を解決できそうです。

21.6. urllib.request — URL を開くための拡張可能なライブラリ — Python 3.6.5 ドキュメント

実装

実装は以下のように一度 read() でメモリ上に読み込んでからファイルに 書き込む必要があるみたいです。 timeoutは秒単位で設定できるということなので、10秒でセットしてみました。

try:
    data = urllib.request.urlopen(url, timeout=10).read()
    with open(file_name, mode="wb") as f:
        f.write(data)
except:
    print("failed to download")

うまく動いてそうです。