Как скопировать удаленное изображение в python?

Мне нужно скопировать удаленное изображение (например, http://example.com/image.jpg) на мой сервер. Возможно ли это?

Как вы подтверждаете, что это действительно изображение?

Ответы

Ответ 1

Загрузить:

import urllib2
img = urllib2.urlopen("http://example.com/image.jpg").read()

Для проверки можно использовать PIL

import StringIO
from PIL import Image
try:
    im = Image.open(StringIO.StringIO(img))
    im.verify()
except Exception, e:
    # The image is not valid

Если вы просто хотите проверить, что это изображение, даже если данные изображения недействительны: Вы можете использовать imghdr

import imghdr
imghdr.what('ignore', img)

Метод проверяет заголовки и определяет тип изображения. Он будет возвращать None, если изображение не было идентифицировано.

Ответ 2

Загрузка файлов

import urllib
url = "http://example.com/image.jpg"
fname = "image.jpg"
urllib.urlretrieve( url, fname )

Проверка того, что это изображение, может быть сделано разными способами. Самая сложная проверка - это открыть файл с помощью библиотеки изображений Python и посмотреть, вызывает ли она ошибку.

Если вы хотите проверить тип файла перед загрузкой, посмотрите на тип mime, который дает удаленный сервер.

import urllib
url = "http://example.com/image.jpg"
fname = "image.jpg"
opener = urllib.urlopen( url )
if opener.headers.maintype == 'image':
    # you get the idea
    open( fname, 'wb').write( opener.read() )

Ответ 3

То же самое с помощью httplib2...

from PIL import Image
from StringIO import StringIO
from httplib2 import Http

# retrieve image
http = Http()
request, content = http.request('http://www.server.com/path/to/image.jpg')
im = Image.open(StringIO(content))

# is it valid?
try:
    im.verify()
except Exception:
    pass  # not valid

Ответ 4

Для части вопроса относительно копирования удаленного образа, вот ответ, вызванный этим ответом:

import urllib2
import shutil

url = 'http://dummyimage.com/100' # returns a dynamically generated PNG
local_file_name = 'dummy100x100.png'

remote_file = urllib2.urlopen(url)
with open(local_file_name, 'wb') as local_file:
    shutil.copyfileobj(remote_file, local_file)

Обратите внимание, что этот подход будет работать для копирования удаленного файла любого типа двоичного носителя.