Я экспериментирую с чтением размеров изображений через Интернет (используя Python 2.7 и requests
).
URL тестового изображения 1: https://img-9gag-fun.9cache.com/photo/ax1WByM_460s.jpg
URL тестового изображения 2: https://img-9gag-fun.9cache.com/photo/abMego9_460s.jpg
Код довольно минимален:
from io import BytesIO
from PIL import Image
def get_web_img_dimensions(url):
"""
Returns image dimensions
"""
req = requests.get(url, headers={"Range": "bytes=0-1023",'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7'})
im = Image.open(BytesIO(req.content))
print im.size
Выполнение этого на предоставленном URL тестового изображения 1 заняло 127
секунд. Затем я попытался текстовое изображение URL 2 . На этот раз мой код вернул правильный ответ через 0.5
секунд. Оба изображения загружаются почти мгновенно в мой браузер, что заставляет меня думать, что чтение 1024 байтов не должно быть большой проблемой.
Через некоторое время я снова попробовал URL-адрес тестового изображения 1 . На этот раз потребовалось 0.5
секунды, чтобы вернуть размеры изображения. Но примерно в то же время попытка URL тестового изображения 2 заняла 128
секунд. Странное изменение ролей!
Что здесь происходит под капотом? Эти колебания во времени вообще не связаны с размерами изображения. Во-вторых, как мне закоротить этот код - чтобы он занимал больше x секунд, он ломался и возвращал None
? Кстати, обратите внимание, что результаты, использующие urllib
или urllib2
, также ошибочны.