ejemplos - python: verifica si existe url a jpg
django (10)
En Python, ¿cómo puedo verificar si existe una url que termina en .jpg?
ej: http://www.fakedomain.com/fakeImage.jpg
Gracias
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.
El código a continuación es equivalente a la respuesta de tikiboy , pero utilizando una biblioteca de requests 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://www.fakedomain.com/fakeImage.jpg'')
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 exception 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 .
Esto podría ser lo suficientemente bueno para ver si existe una url para un archivo.
import urllib
if urllib.urlopen(''http://www.fakedomain.com/fakeImage.jpg'').code == 200:
print ''File exists''
Gracias por todas las respuestas a todos, terminamos usando lo siguiente:
try:
f = urllib2.urlopen(urllib2.Request(url))
deadLinkFound = False
except:
deadLinkFound = True
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
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, hice una lectura compulsiva sobre las hazañas en línea y cómo defenderme hoy: P
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
Pruébalo con mechanize :
import mechanize
br = mechanize.Browser()
br.set_handle_redirect(False)
try:
br.open_novisit(''http://www.fakedomain.com/fakeImage.jpg'')
print ''OK''
except:
print ''KO''
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.
>>> 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)
.