【问题标题】:Multi-threaded web requests in python -- 'Name or service not known'python中的多线程Web请求-'名称或服务未知'
【发布时间】:2011-06-26 04:16:51
【问题描述】:

我有大量的抓取工作要做——由于大量的网络延迟,脚本的大部分时间都花在了阻塞上。我正在尝试对脚本进行多线程处理,这样我就可以同时发出多个请求,但是我的线程中大约 10% 因以下错误而死

URLError: <urlopen error [Errno -2] Name or service not known>

其他 90% 成功完成。我从同一个域请求多个页面,所以似乎可能存在一些 DNS 问题。我一次发出 25 个请求(25 个线程)。如果我一次将自己限制为 5 个请求,一切正常,但是一旦我收到大约 10 个请求,我有时会开始看到此错误。

我已阅读Repeated host lookups failing in urllib2 它描述了我遇到的相同问题并遵循其中的建议,但无济于事。

我也尝试过使用多处理模块而不是多线程,我得到了相同的行为——大约 10% 的进程死于相同的错误——这让我相信这不是 urllib2 的问题,而是别的东西。

有人可以解释发生了什么并建议如何解决吗?

更新

如果我将站点的 IP 地址手动编码到我的脚本中,一切都会正常运行,因此在 DNS 查找期间有时会发生此错误。

【问题讨论】:

  • 您可以访问服务器吗?你可能会遇到一些反拒绝服务的东西,或者如果服务器不是那么重,那么你实际上可能会超载它......
  • 它是一个能够同时处理成百上千个请求的大型网站,我的 25 甚至连一点点都没有。我很确定这是一个 dns 解析问题,因为如果我用 ip 地址替换域名,我的脚本就会完美运行——所以网站并没有明确地将我拒之门外。在这一点上,我只想了解 DNS 查找失败的原因。
  • 那么这可能是 DNS 服务器的问题,在一定时间内只允许来自客户端的这么多请求,或者你有什么。
  • 我从来没有用过这个,所以我本身不推荐它,但这样的东西可能会解决你的问题:freshmeat.net/projects/pydnscache
  • 我现在在编码的刮刀上遇到了同样的问题。你有没有找到解决这个问题的方法?

标签: python multithreading dns urllib2 multiprocessing


【解决方案1】:

建议:尝试在系统中启用 DNS 缓存,例如 nscd。如果您的爬虫总是向同一个域发出请求,这应该可以消除 DNS 查找问题。

确保urllib2.urlopen返回的文件对象在被读取后正确关闭,以释放资源。否则,您可能会达到系统中最大打开套接字的限制。

另外,考虑到politeness policy 网络爬虫应该避免因多个请求而使服务器过载。

【讨论】:

  • 我已经完成了这两件事,我在帖子中链接到的另一个堆栈溢出问题提出了这两个建议,但它并没有解决我的问题。直接使用IP地址而不是域,但我不明白为什么nscd不能解决这个问题,因为它似乎与DNS缓存有关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 2019-12-05
  • 1970-01-01
  • 2013-08-08
  • 2016-01-06
  • 2019-07-07
相关资源
最近更新 更多