gpt4 book ai didi

python仅使用urllib2获取标题

转载 作者:太空宇宙 更新时间:2023-11-04 07:11:12 25 4
gpt4 key购买 nike

我必须使用 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())

关于python仅使用urllib2获取标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9890815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com