2010-12-12 3 views
23

Je suis en train de faire une requête HEAD d'une page en utilisant Python 2.Faire la demande HTTP HEAD urllib2 de Python 2

Je suis en train

import misc_urllib2 
..... 
opender = urllib2.build_opener([misc_urllib2.MyHTTPRedirectHandler(), misc_urllib2.HeadRequest()]) 

avec misc_urllib2.py contenant

class HeadRequest(urllib2.Request): 
    def get_method(self): 
     return "HEAD" 


class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler): 
    def __init__ (self): 
     self.redirects = [] 

    def http_error_301(self, req, fp, code, msg, headers): 
     result = urllib2.HTTPRedirectHandler.http_error_301(
       self, req, fp, code, msg, headers) 
     result.redirect_code = code 
     return result 

    http_error_302 = http_error_303 = http_error_307 = http_error_301 

Mais je reçois

TypeError: __init__() takes at least 2 arguments (1 given) 

Si je fais juste

opender = urllib2.build_opener(misc_urllib2.MyHTTPRedirectHandler()) 

il fonctionne très bien

Répondre

57

Cela fonctionne très bien:

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

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

Testé avec HTTPd rapide et sale piraté en python:

Server: BaseHTTP/0.3 Python/2.6.6 
Date: Sun, 12 Dec 2010 11:52:33 GMT 
Content-type: text/html 
X-REQUEST_METHOD: HEAD 

J'ai ajouté un champ d'en-tête personnalisé X-REQUEST_METHOD pour montrer cela fonctionne :)

est ici journal HTTPd:

Sun Dec 12 12:52:28 2010 Server Starts - localhost:8080 
localhost.localdomain - - [12/Dec/2010 12:52:33] "HEAD/HTTP/1.1" 200 - 

Edit: il y a aussi httplib2

import httplib2 
h = httplib2.Http() 
resp = h.request("http://www.google.com", 'HEAD') 
1

Essayez 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')] 

Voir How do you send a HEAD HTTP request in Python 2?

+0

Est-ce que vous permettent de définir d'autres obj demande? Voir mon OP, le MyHTTPRedirectHandler – Wizzard

+1

Nous avons rencontré un bug en utilisant cette approche. Plus tard, quelqu'un a voulu vérifier une URL HTTPS, pour laquelle vous devez utiliser une méthode différente: 'httplib.HTTPSConnection()' – ericzundel

0

Les mensonges de problème avec votre classe HeadRequest, qui hérite de urllib2.Request. Selon doc, signature urllib2.Request.__init__ est

__init__(self, url, data=None, headers={}, origin_req_host=None, unverifiable=False) 

vous devez donc passer un argument URL pour elle. Dans votre deuxième essai, vous n'utilisez pas HeadRequest, c'est pourquoi cela fonctionne.

0

vous shoud pas ajouter HeadRequest-build_opener ou add_handler il devrait être appelé comme celui-ci

opener = urllib2.build_opener(MyHTTPRedirectHandler) 
response = opener.open(HeadRequest(url)) 
print response.getheaders()