Skip to main content
 首页 » 编程设计

python仅使用urllib2获取标题

2025年05月04日14zfyouxi

我必须使用 urllib2 实现一个函数来仅获取 header (不执行 GET 或 POST)。这是我的功能:

def getheadersonly(url, redirections = True): 
    if not redirections: 
        class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler): 
            def http_error_302(self, req, fp, code, msg, headers): 
                return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers) 
            http_error_301 = http_error_303 = http_error_307 = http_error_302 
        cookieprocessor = urllib2.HTTPCookieProcessor() 
        opener = urllib2.build_opener(MyHTTPRedirectHandler, cookieprocessor) 
        urllib2.install_opener(opener) 
 
    class HeadRequest(urllib2.Request): 
        def get_method(self): 
            return "HEAD" 
 
    info = {} 
    info['headers'] = dict(urllib2.urlopen(HeadRequest(url)).info())  
    info['finalurl'] = urllib2.urlopen(HeadRequest(url)).geturl()  
    return info 

使用答案 this 中的代码和 this .但是,即使标志为 False,此仍在执行 重定向。我尝试了以下代码:

print getheadersonly("http://ms.com", redirections = False)['finalurl'] 
print getheadersonly("http://ms.com")['finalurl'] 

在这两种情况下,它都给了 morganstanley.com。这里有什么问题?

请您参考如下方法:

首先,您的代码包含几个错误:

  1. 在 getheadersonly 的每个请求中,您安装一个新的全局 urlopener,然后在 urllib2.urlopen

  2. 的后续调用中使用它
  3. 您发出两个 HTTP 请求以获得响应的两个不同属性。

  4. urllib2.HTTPRedirectHandler.http_error_302 的实现并不是那么简单,我不明白它是如何防止重定向的。

基本上,您应该了解每个处理程序都安装在一个开启器中以处理某种响应。 urllib2.HTTPRedirectHandler 用于将某些 http 代码转换为重定向。如果您不需要重定向,请不要将重定向处理程序添加到开启器中。如果不想打开ftp链接,就不要添加FTPHandler等

您只需要创建一个新的 opener 并在其中添加 urllib2.HTTPHandler(),将请求自定义为“HEAD”请求并将请求的实例传递给opener,读取属性,关闭响应。

class HeadRequest(urllib2.Request): 
    def get_method(self): 
        return 'HEAD' 
 
def getheadersonly(url, redirections=True): 
    opener = urllib2.OpenerDirector() 
    opener.add_handler(urllib2.HTTPHandler()) 
    opener.add_handler(urllib2.HTTPDefaultErrorHandler()) 
    if redirections: 
        # HTTPErrorProcessor makes HTTPRedirectHandler work 
        opener.add_handler(urllib2.HTTPErrorProcessor()) 
        opener.add_handler(urllib2.HTTPRedirectHandler()) 
    try: 
        res = opener.open(HeadRequest(url)) 
    except urllib2.HTTPError, res: 
        pass 
    res.close() 
    return dict(code=res.code, headers=res.info(), finalurl=res.geturl())