Python PIL: IOError: не удается идентифицировать файл изображения
Я пытаюсь получить изображение из следующего URL:
image_url = http://www.eatwell101.com/wp-content/uploads/2012/11/Potato-Pancakes-recipe.jpg?b14316
Когда я перехожу к нему в браузере, он выглядит как изображение. Но я получаю ошибку, когда пытаюсь:
import urllib, cStringIO, PIL
from PIL import Image
img_file = cStringIO.StringIO(urllib.urlopen(image_url).read())
image = Image.open(img_file)
Я скопировал сотни изображений таким образом, так что я не уверен, что здесь особенного. Могу я получить это изображение?IOError: не удается идентифицировать файл изображения
3 ответа:
Проблема существует не в образе.
>>> urllib.urlopen(image_url).read() '\n<?xml version="1.0" encoding="utf-8"?>\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\n "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n<html>\n <head>\n <title>403 You are banned from this site. Please contact via a different client configuration if you believe that this is a mistake.</title>\n </head>\n <body>\n <h1>Error 403 You are banned from this site. Please contact via a different client configuration if you believe that this is a mistake.</h1>\n <p>You are banned from this site. Please contact via a different client configuration if you believe that this is a mistake.</p>\n <h3>Guru Meditation:</h3>\n <p>XID: 1806024796</p>\n <hr>\n <p>Varnish cache server</p>\n </body>\n</html>\n'
Использование заголовка user agent решит проблему.
opener = urllib2.build_opener() opener.addheaders = [('User-agent', 'Mozilla/5.0')] response = opener.open(image_url) img_file = cStringIO.StringIO(response.read()) image = Image.open(img_file)
Когда я открываю файл с помощью
In [3]: f = urllib.urlopen('http://www.eatwell101.com/wp-content/uploads/2012/11/Potato-Pancakes-recipe.jpg') In [9]: f.code Out[9]: 403
Это не возврат изображения.
Вы можете попробовать указать заголовок user-agent, чтобы посмотреть, сможете ли вы обмануть сервер, думая, что вы браузер.
Использование библиотеки
requests
(так как проще отправлять информацию заголовка)In [7]: f = requests.get('http://www.eatwell101.com/wp-content/uploads/2012/11/Potato-Pancakes-recipe.jpg', headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:16.0) Gecko/20100101 Firefox/16.0,gzip(gfe)'}) In [8]: f.status_code Out[8]: 200
Чтобы получить некоторое изображение , вы можете сначала сохранить изображение, а затем загрузить его в PIL . например:
import urllib2,PIL opener = urllib2.build_opener(urllib2.HTTPRedirectHandler(), urllib2.HTTPCookieProcessor()) image_content = opener.open("http://www.eatwell101.com/wp-content/uploads/2012/11/Potato-Pancakes-recipe.jpg?b14316").read() opener.close() save_dir = r"/some/folder/to/save/image.jpg" f = open(save_dir,'wb') f.write(image_content) f.close() image = Image.open(save_dir) ...