爬虫中的DNS缓存的实现
一、实验背景
在实现爬虫的过程中,需要对域名进行DNS解析,要向DNS服务器发起请求。当爬虫的量达到十万、千万级别时,这一部分的耗时就非常可观了,同时也给服务器增大了复旦。因此需要对其进行优化,使其能实现DNS缓存,不必发起太多请求。
二、实现方法
首先想到的就是修改hosts文件,这样能直接省下向DNS发起请求的时间。但是缺点是无法实时更新,如果域名和IP发生了变化则需要手动更改。若未及时更新,甚至可能导致爬虫没有结果。
于是我们想到的方法就是每次查询之前查询请求的域名是否存在于缓存中,查阅资料后可以得出代码:
import socket
_dnscache = {}#dns缓存list,用来记录域名和对应的IP
def _setDNSCache():
def igetaddrinfo(*args,**kwargs):
if args in _dnscache: #查询请求的域名是否在DNS缓存中
return_dnscache[args]
else:
_dnscache[args] = socket.igetaddrinfo(*args,**kwargs)
#调用igetaddrinfo将DNS加入缓存
return _dnscache[args]
if not hasattr(socket, 'igetaddrinfo'):
#将socket类的getddrinfo打一个patch&#