web-dev-qa-db-fra.com

python: vérifie si l'URL à jpg existe

En python, comment puis-je vérifier si une URL se terminant par .jpg existe?

ex: http://www.fakedomain.com/fakeImage.jpg

merci

25
user257543
>>> 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 l'état est autre que 200, la ressource n'existe pas à l'URL. Cela ne signifie pas qu'il est complètement disparu. Si le serveur renvoie 301 ou 302, cela signifie que la ressource existe toujours, mais à une URL différente. Pour modifier la fonction afin de gérer ce cas, la ligne de vérification d'état doit simplement être remplacée par return response.status in (200, 301, 302).

32
tikiboy

Le code ci-dessous est équivalent à réponse de tikiboy , mais en utilisant une bibliothèque de haut niveau et facile à utiliser requêtes .

import requests

def exists(path):
    r = requests.head(path)
    return r.status_code == requests.codes.ok

print exists('http://www.fakedomain.com/fakeImage.jpg')

Le requests.codes.ok est égal à 200, vous pouvez donc remplacer le code de statut exact si vous le souhaitez.

requests.head peut lancer un exception si le serveur ne répond pas, vous pouvez donc ajouter une construction try-except.

De même, si vous souhaitez inclure les codes 301 et 302, considérez également le code 303, en particulier si vous URI de déréférencement qui désignent des ressources dans Données liées . Un URI peut représenter une personne, mais vous ne pouvez pas télécharger une personne. Le serveur vous redirigera alors vers une page décrivant cette personne à l'aide de 303 redirect .

29
Mirzhan Irkegulov

merci pour toutes les réponses tout le monde, fini par utiliser ce qui suit:

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

Il y a des problèmes avec les réponses précédentes lorsque le fichier est en serveur ftp ( ftp://url.com/file ), le code suivant fonctionne lorsque le fichier est en ftp, http ou 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
4
XavierCLL

On dirait que http://www.fakedomain.com/fakeImage.jpg est automatiquement redirigé vers http://www.fakedomain.com/index.html sans erreur.

La redirection pour les réponses 301 et 302 se fait automatiquement sans donner de réponse à l'utilisateur.

S'il vous plaît jeter un coup d'oeil HTTPRedirectHandler , vous devrez peut-être sous-classe pour gérer cela.

Voici un exemple de Dive Into Python:

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

4
YOU

Essayez-le avec 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'
1
systempuntoout

Cela peut être suffisant pour voir si une URL vers un fichier existe.

import urllib
if urllib.urlopen('http://www.fakedomain.com/fakeImage.jpg').code == 200:
  print 'File exists'
0
z3moon

Je pense que vous pouvez essayer d'envoyer une requête http à l'URL et lire la réponse. Si aucune exception n'a été interceptée, elle existe probablement.

0
Young

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, le module httplib a été renommé en http.client

Et vous devez supprimer le http:// et le https:// de votre URL, car la httplib considère : en tant que numéro de port et que le numéro de port doit être numérique.

0
dengApro

Je ne sais pas pourquoi vous faites cela, mais dans tous les cas: il convient de noter que le simple fait de demander une "image" réussit ne signifie pas que c'est ce que vous pensez (cela pourrait rediriger vers n'importe quoi, ou renvoyer des données de tout type et potentiellement causer des problèmes en fonction de ce que vous faites avec la réponse).

Désolé, je me suis lancé dans une frénésie de lecture sur les exploits en ligne et sur la façon de les défendre aujourd'hui: P

0
Carson Myers