Comment envoyer une requête HTTP HEAD en Python 2?

ce que j'essaie de faire ici, c'est d'obtenir les en-têtes d'une URL donnée pour que je puisse déterminer le type MIME. Je veux voir si http://somedomain/foo/ renvoie un document HTML ou une image JPEG par exemple. Ainsi, je dois comprendre comment envoyer une demande HEAD afin que je puisse lire le type MIME sans avoir à télécharger le contenu. Quelqu'un sait-il d'un moyen facile de faire cela?

106
demandé sur Anthony Geoghegan 2008-09-20 10:38:38

11 réponses

edit : cette réponse fonctionne, mais de nos jours, vous devez simplement utiliser la bibliothèque requests comme mentionné par d'autres réponses ci-dessous.


Utiliser httplib .

>>> import httplib
>>> conn = httplib.HTTPConnection("www.google.com")
>>> conn.request("HEAD", "/index.html")
>>> res = conn.getresponse()
>>> print res.status, res.reason
200 OK
>>> print res.getheaders()
[('content-length', '0'), ('expires', '-1'), ('server', 'gws'), ('cache-control', 'private, max-age=0'), ('date', 'Sat, 20 Sep 2008 06:43:36 GMT'), ('content-type', 'text/html; charset=ISO-8859-1')]

il y a aussi un getheader(name) pour obtenir un en-tête spécifique.

100
répondu Eevee 2016-06-27 13:45:46

urllib2 peut être utilisé pour effectuer une requête HEAD. C'est un peu plus agréable que d'utiliser httplib puisque urllib2 parse L'URL pour vous au lieu de vous demander de diviser L'URL en nom d'hôte et chemin.

>>> import urllib2
>>> class HeadRequest(urllib2.Request):
...     def get_method(self):
...         return "HEAD"
... 
>>> response = urllib2.urlopen(HeadRequest("http://google.com/index.html"))
Les en-têtes

sont disponibles via response.info () comme avant. Fait intéressant, vous pouvez trouver L'URL que vous avez été redirigé vers:

>>> print response.geturl()
http://www.google.com.au/index.html
105
répondu doshea 2016-06-27 13:39:27

obligatoire Requests voie:

import requests

resp = requests.head("http://www.google.com")
print resp.status_code, resp.text, resp.headers
54
répondu K Z 2012-10-22 02:05:01

je crois que le Demandes de la bibliothèque doivent être mentionnés.

35
répondu Dalius 2013-06-06 21:07:27

juste:

import urllib2
request = urllib2.Request('http://localhost:8080')
request.get_method = lambda : 'HEAD'

response = urllib2.urlopen(request)
response.info().gettype()

Edit: je viens de réaliser qu'il y a httplib2: d

import httplib2
h = httplib2.Http()
resp = h.request("http://www.google.com", 'HEAD')
assert resp[0]['status'] == 200
assert resp[0]['content-type'] == 'text/html'
...

texte du lien

15
répondu Paweł Prażak 2011-09-20 17:05:12

pour être complet, avoir une réponse Python3 équivalente à la réponse acceptée en utilisant httplib .

c'est essentiellement le même code que la bibliothèque n'est plus appelée httplib mais http.client

from http.client import HTTPConnection

conn = HTTPConnection('www.google.com')
conn.request('HEAD', '/index.html')
res = conn.getresponse()

print(res.status, res.reason)
7
répondu Octavian Damiean 2013-03-14 21:38:44
import httplib
import urlparse

def unshorten_url(url):
    parsed = urlparse.urlparse(url)
    h = httplib.HTTPConnection(parsed.netloc)
    h.request('HEAD', parsed.path)
    response = h.getresponse()
    if response.status/100 == 3 and response.getheader('Location'):
        return response.getheader('Location')
    else:
        return url
2
répondu Pranay Agarwal 2016-02-15 21:56:39

comme une mise à part, en utilisant le httplib (au moins sur 2.5.2), essayer de lire la réponse d'une requête en tête bloquera (sur readline) et échouera par la suite. Si vous n'avez pas de problème de lecture sur la réponse, vous ne pouvez pas envoyer une autre demande sur la connexion, vous devrez ouvrir un nouveau. Ou accepter un long délai entre les demandes.

1
répondu 2009-04-23 01:39:05

j'ai trouvé que httplib est légèrement plus rapide que urllib2. J'ai chronométré deux programmes - l'un en utilisant httplib et l'autre en utilisant urllib2 - en envoyant des requêtes HEAD à 10 000 URL. La httplib one était plus rapide de plusieurs minutes. Les statistiques totales de httplib" 151920920 sont les suivantes:334s l'utilisateur 0m2.124s sys 0m16.372s

Et urllib2 's au total statistiques ont été: real 9m1.380 l'utilisateur 0m16.666s sys 0m28.565

Quelqu'un d'autre a son mot à dire?

1
répondu Igor Ganapolsky 2010-04-13 15:10:00

Et encore une autre approche (similaire à Pawel réponse):

import urllib2
import types

request = urllib2.Request('http://localhost:8080')
request.get_method = types.MethodType(lambda self: 'HEAD', request, request.__class__)

juste pour éviter d'avoir des méthodes illimitées au niveau de l'instance.

0
répondu estani 2013-06-06 10:55:31

probablement plus facile: utilisez urllib ou urllib2.

>>> import urllib
>>> f = urllib.urlopen('http://google.com')
>>> f.info().gettype()
'text/html'

f.info () est un dictionnaire-comme objet, de sorte que vous pouvez faire f.info () ['content-type'], etc.

http://docs.python.org/library/urllib.html

http://docs.python.org/library/urllib2.html

http://docs.python.org/library/httplib.html

le docs noter que httplib n'est normalement pas utilisé directement.

-4
répondu 2008-12-11 00:11:48