使用请求库设置HTTP请求的DNS超时



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

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。作为参考,以下是我创建会话的方式:

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地址。此外,多年前的这个功能请求似乎很相关,但对我没有进一步的帮助。

到目前为止,对我来说,最好的解决方案似乎只是为每个链接/一批链接创建一个协同程序,然后异步地占用超时时间。

我使用的是Windows10,但这段代码将部署在Ubuntu服务器上。两者都使用Python 3.8。

那么,在给HTTP请求提供死链接的情况下,我如何才能最好地给它一个非常低的DNS解析超时?

那么,在向HTTP请求提供死链接的情况下,我如何才能最好地为其提供非常低的DNS解析超时?

分开。

使用urllib.parse从URL中提取主机名,然后使用dnspython解析该名称,无论需要什么超时。

然后,并且只有在分辨率正确的情况下,才启动requests来获取HTTP数据。

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

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

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

典型的解决方案有两种情况:

  • 使用异步库(它们同时存在于DNS和HTTP中(,在异步库中,您的调用不会被阻塞,您稍后会获得数据,因此您可以执行其他操作
  • 使用多处理或多线程将事情并行化,并通过代码的单独实例同时测试多个URL

它们并不是完全互斥的,你可以发现每种代码都有很多优点和缺点,异步代码的编写和理解可能会更复杂,所以多处理/多线程通常是实现"快速获胜";(尤其是如果您不需要在进程/线程之间共享任何内容,否则很快就会成为一个问题(,但对所有内容的异步处理会使代码随着数量的增长而更好地扩展。

最新更新