首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用请求库为HTTP请求设置DNS超时

使用请求库为HTTP请求设置DNS超时
EN

Stack Overflow用户
提问于 2021-11-06 01:16:29
回答 1查看 288关注 0票数 0

我有一个函数,用于检查特定的HTTP(S) URL是否是重定向的,如果是的话,返回新的位置(但不是递归的)。它使用requests库。看起来是这样的:

代码语言:javascript
复制
    try:
        response = http_session.head(sent_url, timeout=(1, 1))
        if response.is_redirect:
            return response.headers["location"]
        return sent_url
    except requests.exceptions.Timeout:
        return sent_url

这里,我正在检查的URL是sent_url。作为参考,我是这样创建会话的:

代码语言:javascript
复制
http_session = requests.Session()
http_adapter = requests.adapters.HTTPAdapter(max_retries=0)
http_session.mount("http://", http_adapter)
http_session.mount("https://", http_adapter)

然而,该程序的要求之一是,这必须对死链接工作。基于,我设置了连接超时(并读取超时以获得良好的度量)。在遍历了这些值之后,无论我选择什么值,请求在堆栈跟踪中失败仍然需要5-10秒时间。(可能相关:在浏览器中,它给出了DNS_PROBE_POSSIBLE。)

现在,我的问题是:如果链接死了,5-10秒太长了,无法等待。有许多链接,这个程序需要检查,我不希望一些死链接成为如此大的瓶颈,因此我想配置这个DNS查找超时。

我发现这个职位似乎是相关的(OP想要增加超时,我想减少它),但是这个解决方案似乎不适用。我不知道这些URL指向的IP地址。此外,几年前的此功能请求似乎与此相关,但它并没有对我有进一步的帮助。

到目前为止,对我来说最好的解决方案似乎只是为每个链接/一批链接旋转一个协同线,然后异步地吸收超时。

我在Windows 10上,但是这段代码将部署在Ubuntu服务器上。两者都使用Python3.8。

那么,如果HTTP请求是一个死链接,我如何才能给它一个非常低的DNS解析超时呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-06 05:23:26

那么,如果HTTP请求是一个死链接,我如何才能给它一个非常低的DNS解析超时呢?

分开的东西。

使用urllib.parse从URL中提取主机名,然后使用dnspython解析该名称,并使用所需的超时时间。

然后,并且只有在解析正确的情况下,启动requests以获取HTTP数据。

@blurfus:在requests中,您只能在HTTP中使用timeout参数,不能将其附加到会话。文档中没有明确说明这一点,但代码在这一点上非常清楚。

这个程序需要检查许多链接,

事实上,这是一个完全独立的问题,即使所有的链接都是好的,也是存在的,这只是一个量的问题。

典型的解决办法有两种:

  • 使用异步库(它们同时存在于DNS和HTTP中),其中您的调用没有阻塞,您稍后会得到数据,所以您可以做其他事情
  • 使用多线程或多线程将事物并行化,并通过代码的不同实例同时测试多个URL。

它们并不是完全相互排斥的,您可以为每个进程找到许多优点和缺点,异步代码以后编写和理解可能会更加复杂,因此多进程/多线程通常是“快速获胜”的第一步(特别是如果您不需要在进程/线程之间共享任何东西,否则很快就会成为一个问题),但是异步处理所有的东西都会使代码随体积的增长变得更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69860751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档