【发布时间】: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