En realidad, parece que urllib2 puede hacer una solicitud HTTP HEAD.
El question que @reto vinculado a, arriba, muestra cómo obtener urllib2 para hacer una solicitud HEAD.
Aquí está mi opinión sobre ella:
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 marca esto con algo como la red Wireshark protocolo analazer, se puede ver que en realidad está enviando una petición HEAD, en lugar de un GET.
Esta es la petición HTTP y la respuesta desde el código anterior, como capturados por Wireshark:
CABEZA/doFeT HTTP/1.1
Accept-Encoding: identidad
Host: bit.ly
Connection: close
User-Agent: Python-urllib/2.7
HTTP/1.1 301 Moved
Servidor: nginx
Fecha: Dom 19 Feb 2012 13:20:56 GMT
Content-Type: text/html; charset = utf-8
Control de caché: privado; max-edad = 90
Lugar: http://www.kidsidebyside.org/?p=445
MIME-Version: 1.0
Content-Length: 127
Connection: close
Set-Cookie: _bit = 4f40f738-00153-02ed0-421cf10a; domain = .bit.ly; expira = vie 17 de agosto 13:20:56 2012; path = /; HttpOnly
Sin embargo, como se menciona en uno de los comentarios en la otra pregunta, si la URL en cuestión incluye una redirección a continuación urllib2 hacer una solicitud GET para el destino, no una cabeza. Esto podría ser una deficiencia importante, si realmente quisiera hacer solo solicitudes HEAD.
La solicitud anterior implica un redireccionamiento. Aquí está la solicitud al destino, como se recoge en Wireshark:
GET/2009/05/come-and-sorteo-del-circulo-de-unidad-con-nosotros/HTTP/1.1
Accept-Encoding : identidad
anfitrión: www.kidsidebyside.org
Connection: close
User-Agent: Pitón-urllib/2,7
Una alternativa al uso urllib2 es utilizar httplib2 biblioteca de Joe Gregorio:
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)
Tiene la ventaja de usar solicitudes HEAD tanto para la solicitud HTTP inicial como para la solicitud redirigida a la URL de destino.
Aquí está la primera solicitud:
CABEZA/doFeT HTTP/1.1
Host: bit.ly
Accept-Encoding:
de agente de usuario gzip, desinflar: Python-httplib2/0.7.2 (gzip)
Aquí está la segunda petición, al destino:
CABEZA/2009/05/come-and-sorteo-la -círculo-de-unidad-con-nosotros/HTTP/1.1
Host: www.kidsidebyside.org
Accept-Encoding: gzip, desinflar
de agente de usuario: Python-httplib2/0.7.2 (gzip)
*** Python 3 Nota *** Primero, no hay nada como 'response.info(). Headers', do a' dict (response.info()) '. En segundo lugar, para el código de estado HTTP, haga 'response.status'. – treecoder
¿Esto ** solo recibe ** el encabezado o ** solo imprime ** el encabezado? –
¿Dónde se documentan los 'encabezados'? También considere usar 'response.info(). Items()' que devuelve un valor clave dict. –