首页 > 代码库 > [Python网络编程] DNS缓存解决方案
[Python网络编程] DNS缓存解决方案
记得以前写爬虫的时候为了防止dns多次查询,是直接修改/etc/hosts文件的,最近看到一个优美的解决方案,修改后记录如下:
import socket _dnscache={} def _setDNSCache(): """ Makes a cached version of socket._getaddrinfo to avoid subsequent DNS requests. """ def _getaddrinfo(*args, **kwargs): global _dnscache if args in _dnscache: print str(args)+" in cache" return _dnscache[args] else: print str(args)+" not in cache" _dnscache[args] = socket._getaddrinfo(*args, **kwargs) return _dnscache[args] if not hasattr(socket, ‘_getaddrinfo‘): socket._getaddrinfo = socket.getaddrinfo socket.getaddrinfo = _getaddrinfo def test(): _setDNSCache() import urllib urllib.urlopen(‘http://www.baidu.com‘) urllib.urlopen(‘http://www.baidu.com‘) test()
结果如下:
(‘www.baidu.com‘, 80, 0, 1) not in cache (‘www.baidu.com‘, 80, 0, 1) in cache不过这个方案虽好,但也有缺陷,罗列如下:
1.相当于只对socket.getaddrinfo打了一个patch,但socket.gethostbyname,socket.gethostbyname_ex还是走之前的策略
2.只对本程序有效,而修改/etc/hosts将对所有程序有效,包括ping
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。