Python中的多线程网页请求 - '名称或服务未知

6 投票
1 回答
1929 浏览
提问于 2025-04-16 11:42

我有一个很大的抓取任务要做——这个脚本大部分时间都在等待,因为网络延迟很高。我想让脚本支持多线程,这样可以同时发送多个请求,但大约有10%的线程会因为以下错误而崩溃。

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

其余90%的线程都能成功完成。我是在请求同一个网站的多个页面,所以看起来可能是DNS的问题。我一次发25个请求(也就是25个线程)。如果我把请求数量限制在5个以内,一切都正常,但一旦请求数量达到10个左右,我就会偶尔看到这个错误。

我看过一篇文章,讲的是在urllib2中重复的主机查找失败的问题,描述的就是我遇到的同样情况,我也按照里面的建议去做了,但没有效果。

我还尝试过使用多进程模块,而不是多线程,结果也是一样——大约10%的进程会因为同样的错误而崩溃——这让我觉得问题可能不在于urllib2,而是其他地方。

有人能解释一下发生了什么,并建议如何解决吗?

更新

如果我在脚本中手动写入网站的IP地址,一切都能正常工作,所以这个错误是在DNS查找的过程中发生的。

1 个回答

1

建议:试着在你的系统中启用一个DNS缓存,比如nscd。这样,如果你的爬虫总是向同一个域名发送请求,就可以解决DNS查找的问题。

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

另外,要考虑到礼貌政策,爬虫在发送多个请求时应该遵循这个政策,以避免给服务器带来过大的负担。

撰写回答