Python 使用requests.head的max_retries设置获取状态代码

Python 使用requests.head的max_retries设置获取状态代码,python,python-requests,Python,Python Requests,如图所示,可以为请求.Session()设置最大重试次数,但我只需要头.status\u code来检查url是否有效且处于活动状态 有没有一种方法可以让头部在装载过程中移动 import requests def valid_active_url(url): try: site_ping = requests.head(url, allow_redirects=True) except requests.exceptions.ConnectionError:

如图所示,可以为
请求.Session()
设置
最大重试次数
,但我只需要
头.status\u code
来检查url是否有效且处于活动状态

有没有一种方法可以让头部在装载过程中移动

import requests
def valid_active_url(url):
    try:
        site_ping = requests.head(url, allow_redirects=True)
    except requests.exceptions.ConnectionError:
        print('Error trying to connect to {}.'.format(url))

    try:
        if (site_ping.status_code < 400):
            return True
        else:
            return False
    except Exception:
        return False
    return False
我们是否只使用
s.mount()
进入并设置
最大重试次数
?除了预先建立http连接之外,这似乎是一种冗余

另外,
resp.status\u code
返回
200
,我希望看到
301
(这是
请求的。head
返回的内容)


注意:
resp.ok
可能就是我在这里所需要的全部内容。

在仅仅两个小时的问题发展之后,答案花了五分钟:

def valid_url(url):
    if (url.lower() == 'none') or (url == ''):
        return False
    try:
        s = requests.Session()
        a = requests.adapters.HTTPAdapter(max_retries=5)
        s.mount(url, a)
        resp = s.head(url)
        return resp.ok
    except requests.exceptions.MissingSchema:
        # If it's missing the schema, run again with schema added
        return valid_url('http://' + url)
    except requests.exceptions.ConnectionError:
        print('Error trying to connect to {}.'.format(url))
        return False
基于此,看起来
head
请求的资源密集度略低于get,尤其是在url包含大量数据的情况下

是作为请求库基础的urllib3库的内置适配器


另一方面,我不确定我在这里检查的正确术语或短语是什么。如果url返回错误代码,它可能仍然有效。

。mount
不会发出请求。“装载调用将传输适配器的特定实例注册到前缀。装载后,使用该会话(其URL以给定前缀开头)发出的任何HTTP请求都将使用给定的传输适配器。”是的。我想我不会只是盯着“传输适配器到前缀”,我应该看看这是什么意思。这与“我尝试过的第一种方法”有什么不同?第一种方法没有重试。我一直在一些URL上得到连接错误,这些URL是301 Forward。我指的是你引用的部分。我想你在写问题时已经回答了这个问题,只是没有将它包装在错误处理中!唯一的区别是在解决方案中,我替换了
s.get
with
s.head
我希望它需要更少的网络活动,但是在写了这么多问题之后,我认为它值得发布。如果你有时间发布一个更雄辩的答案,我很乐意接受。
def valid_url(url):
    if (url.lower() == 'none') or (url == ''):
        return False
    try:
        s = requests.Session()
        a = requests.adapters.HTTPAdapter(max_retries=5)
        s.mount(url, a)
        resp = s.head(url)
        return resp.ok
    except requests.exceptions.MissingSchema:
        # If it's missing the schema, run again with schema added
        return valid_url('http://' + url)
    except requests.exceptions.ConnectionError:
        print('Error trying to connect to {}.'.format(url))
        return False