如何使用 eventlet green 修复 python、urlopen 错误 [Errno 8]

hac*_*r15 1 urllib2 urlopen eventlet python-2.7

Python新手来了。

我使用 eventlet 和 urllib2 发出大量异步 http 请求。在我的文件顶部有

import eventlet
import urllib
from eventlet.green import urllib2
Run Code Online (Sandbox Code Playgroud)

然后我发出了很多异步 http 请求,并通过这一行成功:

conn = urllib2.urlopen(signed_url, None)
Run Code Online (Sandbox Code Playgroud)

突然间,我收到这个错误:

URLError: <urlopen error [Errno 8] nodename nor servname provided, or not known>
Run Code Online (Sandbox Code Playgroud)

这个错误发生在同一个 urllib2.urlopen 行上,这很奇怪,因为它之前成功过很多次。另外,当我打印signed_url 然后将其粘贴到浏览器时,我会得到正确的响应,因此该url 的格式正确。

我已经浏览过帖子,但找不到合适的调试策略。从概念上讲,什么可能导致此错误?您建议我如何修复它?

我正在使用Python 2.7.6。

谢谢。

tem*_*oto 5

“节点名称未知”错误表示 DNS 解析失败。最可能的原因是上游 DNS 服务器速率限制。如果您认真进行网络爬行,我可以推荐两种方法:

  • 简单:收到此错误后,只需降低并发限制,减少每分钟的请求即可。将此错误的前 N ​​次出现视为临时错误,稍有延迟后重复获取 URL。设置本地缓存递归DNS 服务器(例如dnsmasq、unbound)。
  • Hard:分离 DNS 解析和 HTTP 获取。有一个单独的 DNS 名称队列需要解析。http://1.2.3.4/path将 URL和标头中解析的 IP 地址传递Host: domain给 urlopen。这将允许分别限制 DNS 请求和实际 HTTP 请求的并发性。如果您主要为每个唯一主机只获取一个请求,这将无济于事。为自己找到许多递归 DNS 服务器来分配工作、收集其响应时间统计数据、更频繁地使用更快的服务器。