1

URLから画像にアクセスしようとしています:

http://www.lifeasastrawberry.com/wp-content/uploads/2013/04/IMG_1191-1024x682.jpg

ただし、最後のステップで IOError("画像ファイルを識別できません") で失敗します。何が起こっているのか、それを修正する方法がわかりません。他の多くの URL 画像で動作します。

    opener = urllib2.build_opener()
    opener.addheaders = [('User-agent', 'Mozilla/5.0')]
    opener.addheaders = [('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')]
    opener.addheaders = [('Accept-Encoding', 'gzip,deflate,sdch')]

    response = opener.open(image_url,None,5)
    img_file = cStringIO.StringIO(response.read())  

    image = Image.open(img_file)

この URL も失敗します。

http://www.canadianliving.com/img/photos/biz/Greek-Yogurt-Ceaser-Salad-Dressi1365783448.jpg

4

1 に答える 1

1

問題は、サーバーからの gzip エンコードされた結果を要求するように URL レトリーバーに指示しているため、受け取る画像データが gzip エンコードされていることです。accept-encodingこれは、リクエストからヘッダーを除外するか、gzip でエンコードされた結果を手動で解凍することで解決できます。

from PIL import Image
import urllib2
import gzip
import cStringIO

opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.addheaders = [('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')]
opener.addheaders = [('Accept-Encoding', 'gzip,deflate,sdch')]

gzipped_file = cStringIO.StringIO(opener.open(url, None, 5).read())
image = Image.open(gzip.GzipFile(fileobj=gzipped_file))

このアプローチの問題は、HTTP リクエストで複数のエンコーディングを受け入れる場合、結果の HTTP ヘッダーを調べて実際に取得したエンコーディングを確認し、その値が示すものに基づいて手動でデコードする必要があることです。

accept-encoding ヘッダーを 1 つのエンコーディング (たとえば、'identity;q=1, *;q=0'またはそのようなもの)のみを受け入れるような値に設定するか、 HTTP を行うためにrequests パッケージを使用し始める方が簡単だと思います。

于 2013-09-01T18:02:35.140 に答える