Question

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

Était-ce utile?

La solution

modifier : cette réponse fonctionne, mais vous devez simplement utiliser le demande à la bibliothèque comme indiqué dans les réponses ci-dessous.

Utilisez 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 existe également un getheader (nom) pour obtenir un en-tête spécifique.

Autres conseils

urllib2 peut être utilisé pour exécuter une demande HEAD. C'est un peu plus agréable que d'utiliser httplib car urllib2 analyse l'URL pour vous au lieu de vous demander de la scinder 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 auparavant. Fait intéressant, vous pouvez trouver l’URL vers laquelle vous avez été redirigé:

>>> print response.geturl()
http://www.google.com.au/index.html

Obligatoire Demandes façon:

import requests

resp = requests.head("http://www.google.com")
print resp.status_code, resp.text, resp.headers

Je pense que la bibliothèque Requests doit également être mentionnée.

Juste:

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

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

Edit: Je viens juste de réaliser qu'il existe 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

Pour être complet, une réponse Python3 équivalente à la réponse acceptée à l'aide de httplib .

Il s'agit fondamentalement du même code, à la différence près 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)
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

En passant, lors de l'utilisation de la httplib (au moins sur la version 2.5.2), essayer de lire la réponse d'une requête HEAD bloquera (sur la ligne de lecture) et échouera par la suite. Si vous n'émettez pas de lecture sur la réponse, vous ne pouvez pas envoyer une autre demande sur la connexion, vous devrez en ouvrir une nouvelle. Ou acceptez un long délai entre les requêtes.

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

Et urllib2 , le total des statistiques est de: réel 9m1.380s                                                                     utilisateur 0m16.666s                                                                     sys 0m28.565s

Quelqu'un d'autre a-t-il un mot à dire?

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

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 sans limite au niveau instance.

Probablement plus facile: utilisez urllib ou urllib2.

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

f.info () est un objet semblable à un dictionnaire, vous pouvez donc 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

La documentation note que httplib n’est normalement pas utilisé directement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top