python中的多线程web请求--';名称或服务未知';

python中的多线程web请求--';名称或服务未知';,python,multithreading,dns,urllib2,multiprocessing,Python,Multithreading,Dns,Urllib2,Multiprocessing,我有一个很大的抓取工作要做——由于大量的网络延迟,脚本的大部分时间都花在了阻塞上。我正在尝试对脚本进行多线程处理,以便可以同时发出多个请求,但大约10%的线程会因以下错误而死亡 URLError: <urlopen error [Errno -2] Name or service not known> URLError: 其余90%成功完成。我正在从同一个域请求多个页面,因此似乎有一些DNS问题。我一次发出25个请求(25个线程)。如果我一次只处理5个请求,那么一切都很好,但是一

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

URLError: <urlopen error [Errno -2] Name or service not known>
URLError:
其余90%成功完成。我正在从同一个域请求多个页面,因此似乎有一些DNS问题。我一次发出25个请求(25个线程)。如果我一次只处理5个请求,那么一切都很好,但是一旦我处理了大约10个请求,我有时就会看到这个错误

我读过 这篇文章描述了同样的问题,我也遵循了其中的建议,但没有任何效果

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

有人能解释一下发生了什么并建议如何修复吗

更新


如果我手动将站点的ip地址编码到我的脚本中,一切都会正常工作,因此在DNS查找过程中会出现此错误。

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

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


此外,还应考虑到网络爬虫必须避免服务器因多个请求而过载。

您有权访问服务器吗?你可能会遇到一些反拒绝服务的东西,或者如果服务器没有那么重,那么你可能实际上是超载了……这是一个能够处理数百或数千个同时请求的主要网站,my 25甚至没有造成一点影响。我很确定这是一个dns解析问题,因为如果我用ip地址替换域名,我的脚本运行得很好——因此网站不会明确地把我拒之门外。在这一点上,我只想了解DNS查找失败的原因。那么可能是DNS服务器在一定时间内只允许客户端发出如此多的请求的问题,或者是其他问题。我从来没有使用过这个,所以我不推荐它本身,但类似这样的事情可能会解决你的问题:我现在也有同样的问题,我正在编写一个报废程序。你找到这个问题的解决方案了吗?我已经做了这两件事,我在帖子中链接的另一个堆栈溢出问题提出了这两个建议,但它并没有解决我的问题。直接使用IP地址而不是域,但我不明白为什么nscd不能解决这个问题,因为它似乎与DNS缓存有关。