Cómo probar si una página web es una imagen.

Lamento que el título no fuera muy claro, básicamente tengo una lista con toda una serie de url, con la intención de descargar los que son imágenes. ¿Hay alguna forma de comprobar si la página web es una imagen, para poder omitir las que no están?

Gracias por adelantado

Puede utilizar el módulo de solicitudes . Haga una solicitud de cabeza y verifique el tipo de contenido. Solicitud de cabeza no descargará el cuerpo de respuesta.

import requests response = requests.head(url) print response.headers.get('content-type') 

No hay una forma confiable. Pero podría encontrar una solución que podría ser “lo suficientemente buena” en su caso.

Puede mirar la extensión del archivo si está presente en la url, por ejemplo, .png , .jpg podría indicar una imagen:

 >>> import os >>> name = url2filename('http://example.com/a.png?q=1') >>> os.path.splitext(name)[1] '.png' >>> import mimetypes >>> mimetypes.guess_type(name)[0] 'image/png' 

donde la función url2filename() se define aquí .

Podrías inspeccionar el encabezado http de Content-Type :

 >>> import urllib.request >>> r = urllib.request.urlopen(url) # make HTTP GET request, read headers >>> r.headers.get_content_type() 'image/png' >>> r.headers.get_content_maintype() 'image' >>> r.headers.get_content_subtype() 'png' 

Puede consultar el principio del cuerpo http para obtener números mágicos que indiquen archivos de imagen, por ejemplo, jpeg puede comenzar con b'\xff\xd8\xff\xe0' o:

 >>> prefix = r.read(8) >>> prefix # .png image b'\x89PNG\r\n\x1a\n' 

Como @pafcu sugirió en la respuesta a la pregunta relacionada , podría usar la función imghdr.what() :

 >>> import imghdr >>> imghdr.what(None, b'\x89PNG\r\n\x1a\n') 'png' 

Puede usar mimetypes https://docs.python.org/3.0/library/mimetypes.html

 import urllib from mimetypes import guess_extension url="http://example.com/image.png" source = urllib.urlopen(url) extension = guess_extension(source.info()['Content-Type']) print extension 

esto devolverá “png”