En python, comment puis-je vérifier si une URL se terminant par .jpg existe?
ex: http://www.fakedomain.com/fakeImage.jpg
merci
>>> 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)
.
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 .
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
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
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
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'
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'
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.
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.
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