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

how to fix python, urlopen error [Errno 8], using eventlet green

Python菜鸟来了

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

import eventlet
import urllib
from eventlet.green import urllib2

然后我发出了很多成功的异步 http 请求:

conn = urllib2.urlopen(signed_url, None)

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

URLError: <urlopen error [Errno 8] nodename nor servname provided, or not known>

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

我在帖子中跳来跳去,但找不到正确的调试策略。从概念上讲,是什么导致了这个错误?你建议我如何修复它?

我正在使用 Python 2.7.6.

谢谢。

'nodename not known'错误表示DNS解析失败。最可能的原因是上游 DNS 服务器速率限制。如果你认真做网络爬虫,我可以推荐两种方法:

  • 简单:收到此错误后,只需降低并发限制,每分钟发出更少的请求。将此错误的前 N ​​次出现视为暂时错误,稍等片刻后重复获取 URL。设置本地缓存递归 DNS 服务器(例如 dnsmasq、unbound)。
  • 困难:拆分 DNS 解析和 HTTP 获取。有单独的 queue DNS 名称来解析。将 URL http://1.2.3.4/pathHost: domain header 中解析的 IP 地址传递给 urlopen。这将允许分别限制 DNS 请求和实际 HTTP 请求的并发。如果您大多数情况下每个唯一主机只获取一个请求,这将无济于事。找到许多递归 DNS 服务器来分配工作,收集它们的响应时间统计数据,更频繁地使用更快的服务器。