最近、URL に画像をダウンロードするための小さなクローラーに取り組んでいます。
f.open()/f.write() で urllib2 の openurl() を使用します。
コード スニペットは次のとおりです。
# the list for the images' urls
imglist = re.findall(regImg,pageHtml)
# iterate to download images
for index in xrange(1,len(imglist)+1):
img = urllib2.urlopen(imglist[index-1])
f = open(r'E:\OK\%s.jpg' % str(index), 'wb')
print('To Read...')
# potential timeout, may block for a long time
# so I wonder whether there is any mechanism to enable retry when time exceeds a certain threshold
f.write(img.read())
f.close()
print('Image %d is ready !' % index)
上記のコードでは、 img.read() が長時間ブロックされる可能性があります。この問題の下で、画像の URL 操作を再試行/再オープンしたいと考えています。
また、上記のコードの効率的な観点にも関心があります。ダウンロードする画像の数が多少多い場合は、スレッド プールを使用してダウンロードする方がよいようです。
助言がありますか?前もって感謝します。
ps img オブジェクトの read() メソッドがブロックを引き起こす可能性があることを発見したため、タイムアウト パラメータを urlopen() に追加するだけでは役に立たないようです。しかし、ファイル オブジェクトには read() のタイムアウト バージョンがないことがわかりました。これに関する提案はありますか?どうもありがとう 。