python: verifica si existe url a jpg

En Python, ¿cómo puedo verificar si existe una url que termina en .jpg?

ej: http://sofes.miximages.com/validation/f

Gracias

>>> import httplib >>> >>> def exists(site, path): ... conn = httplib.HTTPConnection(site) ... conn.request('HEAD', path) ... response = conn.getresponse() ... conn.close() ... return response.status == 200 ... >>> exists('http://www.fakedomain.com', '/fakeImage.jpg') False 

Si el estado es diferente a 200, el recurso no existe en la URL. Esto no significa que se haya ido por completo. Si el servidor devuelve un 301 o 302, esto significa que el recurso todavía existe, pero en una URL diferente. Para modificar la función para manejar este caso, la línea de verificación de estado solo debe cambiarse para return response.status in (200, 301, 302) .

El código a continuación es equivalente a la respuesta de tikiboy , pero utilizando una biblioteca de solicitudes de alto nivel y fácil de usar.

 import requests def exists(path): r = requests.head(path) return r.status_code == requests.codes.ok print exists('http://sofes.miximages.com/validation/f') 

El requests.codes.ok es igual a 200 , por lo que puede sustituir el código de estado exacto si lo desea.

requests.head puede generar una excepción si el servidor no responde, por lo que es posible que desee agregar una construcción try-except.

Además, si desea incluir los códigos 301 y 302 , considere también el código 303 , especialmente si no hace referencia a los URI que denotan recursos en los datos vinculados . Un URI puede representar a una persona, pero no puede descargar a una persona, por lo que el servidor lo redireccionará a una página que describe a esta persona utilizando 303 redirect .

Gracias por todas las respuestas a todos, terminamos usando lo siguiente:

 try: f = urllib2.urlopen(urllib2.Request(url)) deadLinkFound = False except: deadLinkFound = True 

Parece que http://www.fakedomain.com/fakeImage.jpg se redirige automáticamente a http://www.fakedomain.com/index.html sin ningún error.

La redirección para 301 y 302 respuestas se realiza automáticamente sin devolver ninguna respuesta al usuario.

Por favor, eche un vistazo a HTTPRedirectHandler , puede que tenga que subclasificarlo para manejar eso.

Aquí está una muestra de Dive Into Python:

http://diveintopython3.ep.io/http-web-services.html#redirects

Hay problemas con las respuestas anteriores cuando el archivo está en el servidor ftp ( ftp://url.com/file ), el siguiente código funciona cuando el archivo está en ftp, http o https:

 import urllib2 def file_exists(url): request = urllib2.Request(url) request.get_method = lambda : 'HEAD' try: response = urllib2.urlopen(request) return True except: return False 

Pruébalo con mecanizar :

 import mechanize br = mechanize.Browser() br.set_handle_redirect(False) try: br.open_novisit('http://sofes.miximages.com/validation/f') print 'OK' except: print 'KO' 

Creo que puede intentar enviar una solicitud http a la url y leer la respuesta. Si no se detectó una excepción, es probable que exista.

No sé por qué está haciendo esto, pero en cualquier caso: debe tenerse en cuenta que solo porque una solicitud a una “imagen” tenga éxito, no significa que sea lo que cree que es (podría redirigirse a cualquier cosa, o devuelva cualquier dato de cualquier tipo, y posiblemente cause problemas dependiendo de lo que haga con la respuesta).

Perdón, seguí leyendo en exceso sobre las hazañas en línea y cómo defenderme hoy: P

Esto podría ser lo suficientemente bueno para ver si existe una url para un archivo.

 import urllib if urllib.urlopen('http://sofes.miximages.com/validation/f').code == 200: print 'File exists' 

en Python 3.6.5:

 import http.client def exists(site, path): connection = http.client.HTTPConnection(site) connection.request('HEAD', path) response = connection.getresponse() connection.close() return response.status == 200 exists("www.fakedomain.com", "/fakeImage.jpg") 

En Python 3, el módulo httplib ha sido renombrado a http.client

Y necesita eliminar http:// y https:// de su URL, ya que httplib está considerando : como número de puerto y el número de puerto debe ser numérico.