python3中获取head请求的最有效方法

2024-09-29 23:33:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现了这段代码,它对我来说是可靠和高效的,但不幸的是,它是为python2编写的,而且它还使用了urllib2,而大家都在说请求更快。在python3中,下面的代码(或者更高效、更可靠)的等价代码是什么?在

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import sys
import urllib2

# This script uses HEAD requests (with fallback in case of 405)
# to follow the redirect path up to the real URL
# (c) 2012 Filippo Valsorda - FiloSottile
# Released under the GPL license

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

class HEADRedirectHandler(urllib2.HTTPRedirectHandler):
    """
    Subclass the HTTPRedirectHandler to make it use our
    HeadRequest also on the redirected URL
    """
    def redirect_request(self, req, fp, code, msg, headers, newurl):
        if code in (301, 302, 303, 307):
            newurl = newurl.replace(' ', '%20')
            newheaders = dict((k,v) for k,v in req.headers.items()
                              if k.lower() not in ("content-length", "content-type"))
            return HeadRequest(newurl,
                               headers=newheaders,
                               origin_req_host=req.get_origin_req_host(),
                               unverifiable=True)
        else:
            raise urllib2.HTTPError(req.get_full_url(), code, msg, headers, fp)

class HTTPMethodFallback(urllib2.BaseHandler):
    """
    Fallback to GET if HEAD is not allowed (405 HTTP error)
    """
    def http_error_405(self, req, fp, code, msg, headers):
        fp.read()
        fp.close()

        newheaders = dict((k,v) for k,v in req.headers.items()
                          if k.lower() not in ("content-length", "content-type"))
        return self.parent.open(urllib2.Request(req.get_full_url(),
                                         headers=newheaders,
                                         origin_req_host=req.get_origin_req_host(),
                                         unverifiable=True))

# Build our opener
opener = urllib2.OpenerDirector()
for handler in [urllib2.HTTPHandler, urllib2.HTTPDefaultErrorHandler,
                HTTPMethodFallback, HEADRedirectHandler,
                urllib2.HTTPErrorProcessor, urllib2.HTTPSHandler]:
    opener.add_handler(handler())

response = opener.open(HeadRequest(sys.argv[1]))

print(response.geturl())

顺便说一句,我并不需要Head请求。我只想知道这个链接是不是坏了(在一些网站,如果你给他们一个坏代码,他们会把你重定向回网站的主页,我想我的代码也认识到这一点)和头请求是最有效的解决方案,我想到了这一点,所以如果你知道任何更好的方法,我也会很感激。在


Tags: theto代码inselfgetifcode
1条回答
网友
1楼 · 发布于 2024-09-29 23:33:27

看看请求:http://docs.python-requests.org/en/master/

要执行head请求,只需:

import requests

r=requests.head('http://www.example.com')

然后您可以访问该对象以获取所需的内容。例如,状态代码:

^{pr2}$

更新: 如果您想检查一个页面是否处于活动状态,您需要执行一个GET请求。我见过HEAD请求返回一个200响应,在同一个URL上,GET请求返回500

相关问题 更多 >

    热门问题