En fait, il semble que urllib2 puisse faire une requête HTTP HEAD.
Le site question que @reto a mis en lien, ci-dessus, montre comment faire en sorte que urllib2 fasse une requête HEAD.
Voici ce que j'en pense :
import urllib2
# Derive from Request class and override get_method to allow a HEAD request.
class HeadRequest(urllib2.Request):
def get_method(self):
return "HEAD"
myurl = 'http://bit.ly/doFeT'
request = HeadRequest(myurl)
try:
response = urllib2.urlopen(request)
response_headers = response.info()
# This will just display all the dictionary key-value pairs. Replace this
# line with something useful.
response_headers.dict
except urllib2.HTTPError, e:
# Prints the HTTP Status code of the response but only if there was a
# problem.
print ("Error code: %s" % e.code)
Si vous vérifiez cela avec quelque chose comme l'analyste de protocole réseau Wireshark, vous pouvez voir qu'il envoie en fait une demande HEAD, plutôt qu'une demande GET.
Voici la demande et la réponse HTTP du code ci-dessus, telles que capturées par Wireshark :
HEAD /doFeT HTTP/1.1
Accept-Encoding : identité
Hôte : bit.ly
Connexion : close
User-Agent : Python-urllib/2.7
HTTP/1.1 301 Déplacement
Serveur : nginx
Date : Sun, 19 Feb 2012 13:20:56 GMT
Content-Type : text/html ; charset=utf-8
Cache-control : private ; max-age=90
Emplacement : http://www.kidsidebyside.org/?p=445
MIME-Version : 1.0
Content-Length : 127
Connexion : close
Set-Cookie : _bit=4f40f738-00153-02ed0-421cf10a;domain=.bit.ly;expires=Fri Aug 17 13:20:56 2012;path=/ ; HttpOnly
Cependant, comme mentionné dans l'un des commentaires de l'autre question, si l'URL en question inclut une redirection, urllib2 fera une requête GET vers la destination, et non HEAD. Cela pourrait être un inconvénient majeur, si vous vouliez vraiment ne faire que des requêtes HEAD.
La demande ci-dessus implique une redirection. Voici la requête vers la destination, telle que capturée par Wireshark :
GET /2009/05/come-and-draw-the-circle-of-unity-with-us/ HTTP/1.1
Accept-Encoding : identité
Hôte : www.kidsidebyside.org
Connexion : close
User-Agent : Python-urllib/2.7
Une alternative à l'utilisation d'urllib2 est d'utiliser l'application de Joe Gregorio httplib2 bibliothèque :
import httplib2
url = "http://bit.ly/doFeT"
http_interface = httplib2.Http()
try:
response, content = http_interface.request(url, method="HEAD")
print ("Response status: %d - %s" % (response.status, response.reason))
# This will just display all the dictionary key-value pairs. Replace this
# line with something useful.
response.__dict__
except httplib2.ServerNotFoundError, e:
print (e.message)
Cela présente l'avantage d'utiliser les requêtes HEAD à la fois pour la requête HTTP initiale et pour la requête redirigée vers l'URL de destination.
Voici la première demande :
HEAD /doFeT HTTP/1.1
Hôte : bit.ly
accepter-encodage : gzip, deflate
agent utilisateur : Python-httplib2/0.7.2 (gzip)
Voici la deuxième demande, vers la destination :
HEAD /2009/05/come-and-draw-the-circle-of-unity-with-us/ HTTP/1.1
Hôte : www.kidsidebyside.org
Accepter l'encodage : gzip, deflate
agent utilisateur : Python-httplib2/0.7.2 (gzip)