サーバで画像に動的にExif情報を付加して、それをローカルのPythonで大量取得しようとしてハマったのでメモ。
ローカル側は超省略するけど、以下のような感じ。
# URLをXMLから取得 image_path = i.find("Url").text # 認証のかかっている場所から画像取得 img = urllib2.urlopen(urllib2.Request(unicode(image_path), None, {"Authorization": "Basic " + basicAuth})) localfile = file('./' + id + ".jpg", "wb") # 読み書き localfile.write(img.read()) img.close() localfile.close()
上記を10000ファイルくらい繰り返しで取得する。
が。
img.read()のところでなぜか止まる。
大体10個くらい読み込んだ時点で止まる。
Traceback (most recent call last): File "***.py", line 62, in <module> localfile.write(img.read()) File "C:Python25libsocket.py", line 291, in read data = self._sock.recv(recv_size) File "C:Python25libhttplib.py", line 509, in read return self._read_chunked(amt) File "C:Python25libhttplib.py", line 573, in _read_chunked line = self.fp.readline() File "C:Python25libsocket.py", line 331, in readline data = recv(1) KeyboardInterrupt
色々調べた結果、サーバ側でContent-Lengthを返さないと止まることがあるっぽい。
ということでサーバ側をちょこちょこ修正。
無事、止まらずに実行できるようになりました。