python中的多线程Web请求 - "名称或服务未知"

Jes*_*hen 5 python dns multithreading urllib2 multiprocessing

我有一个很大的刮擦工作要做 - 由于大量的网络延迟,大部分脚本的时间都花在阻塞上.我正在尝试多线程化脚本,以便我可以同时发出多个请求,但是大约10%的线程死于以下错误

URLError: <urlopen error [Errno -2] Name or service not known>
Run Code Online (Sandbox Code Playgroud)

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

我已经读过在urllib2失败的重复主机查找,它描述了我所遇到的相同问题,并遵循其中的建议,但无济于事.

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

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

UPDATE

如果我手动将网站的IP地址编码到我的脚本中,一切都运行正常,因此在DNS查找过程中会发生此错误.

sco*_*fey 1

建议:尝试在系统中启用 DNS 缓存,例如nscd。如果您的抓取工具始终向同一域发出请求,这应该可以消除 DNS 查找问题。

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

另外,请考虑网络爬虫应避免因多个请求而使服务器过载的礼貌策略。