查看主机dns缓存内容,windows的dns缓存文件怎么查看

  查看主机dns缓存内容,windows的dns缓存文件怎么查看

  爬虫中DNS缓存的实现

  

一、实验背景

  在实现爬虫的过程中,需要对域名进行DNS解析,并向DNS服务器发出请求。当爬虫数量达到10万到10000的时候,这部分时间会非常可观,也会增加服务器的数量。因此,有必要对其进行优化,使其能够在不发出过多请求的情况下实现DNS缓存。

  

二、实现方法

  首先想到的是修改hosts文件,这样可以直接节省向DNS发出请求的时间。但缺点是不能实时更新。如果域名和IP发生变化,需要手动更改。如果不及时更新,甚至可能导致爬虫没有结果。

  所以我们想到的方法就是在每次查询之前,检查请求的域名是否存在于缓存中。查阅资料后,我们可以得到代码:

  导入插座

  _dnscache={}#dns缓存列表,用于记录域名和对应的IP

  def _setDNSCache():

  def igetaddrinfo(*args,**kwargs):

  If args in _dnscache: #查询请求的域名是否在DNS缓存中

  return_dnscache[args]

  否则:

  _ DNS cache[args]=socket . igetaddrinfo(* args,**kwargs)

  #调用igetaddrinfo将DNS添加到缓存中

  return _dnscache[args]

  如果没有hasattr(socket, igetaddrinfo ):

  #修补socket类的getddrinfo,并在已知DNS的方向上解析。

  socket . igetaddrinfo=socket . getaddrinfo

  socket . getaddrinfo=igetaddrinfo

  将以上内容另存为dnscache.py

  要使用DNS缓存,只需要导入DNS cache,然后_ set dncache()。

  

三、实现实例

  实验环境:WIN10 python3.6请求2.8.1

  实验开始前,需要关闭windows的DNS缓存功能,否则会影响后续的执行和时间对比。在命令提示符(administrator)下输入net stop dnscache,然后重新启动。

  以抓取哔哩哔哩视频网站的视频标题为例。

  因为实现了静态页面的抓取,所以观察网页的源代码可以看出视频标题是用h1标签关闭的。爬虫的代码可以通过使用请求库获得。

  #编码:utf-8

  if __name__==__main__ :

  导入dns_cache

  #dns_cache。_setDNSCache() #如果需要

  导入时间

  导入请求

  i=0

  f=打开( ans_dns.txt , w )

  number=int(input(你想从1号知道多少?))

  start1=time.clock()

  当11月:

  tem=str(i)

  i=i 1

  URL= http://www . bilibili . com/video/av tem

  req=requests.post(url)。文本

  h1_start=req.find(h1 )

  h1_end=req.find(/h1 )

  req=req[h1_start:h1_end]

  start=req.find(title=) 7

  end=req . find( )-1

  req=req[开始:结束]

  if (h1_start0):

  if.write(req n )

  end1=time.clock()

  #打印(结束1-开始1)

  times=round(end1-start1,2)

  f.write(此程序花费 str(times)秒)

  f.close()

  爬虫不使用正则表达式,请求库发送的请求基于urllib3。在抓取过程中,发现哔哩哔哩视频网站的网页被gzip加压,所幸被解压并集成在。请求数据库中的文本。如果使用urllib库打开url,需要经过下面的代码解压缩:

  从gzip导入gzip文件

  从StringIO进口StringIO

  def gzip(数据):

  buf=StringIO(数据)

  f=gzip。GzipFile(fileobj=buf)

  返回f.read()

  爬一万。

  没有DNS缓存:

  拥有DNS缓存:

  以上两者都很好的吻合了DNS请求所需的时间,在过程中使用wireshark抓取数据包时也可以看到明显的对比。

  没有DNS缓存机制的数据包捕获:

  使用DNS缓存机制的数据包捕获:

  

四、实验结论

  这个爬虫DNS缓存的实现思路是,请求域名时,如果没有本地缓存,则调用socket.igetaddrinfo请求解析;如果有缓存,直接使用缓存的内容。实现DNS缓存的爬虫一般比普通爬虫要快,也能减轻服务器的负担。

  

五、反思

  在实验过程中,有DNS缓存的爬虫所花费的时间超过了没有DNS缓存的爬虫,这与估计值并不总是很吻合。猜测原因可能是爬虫在真实进程中可以使用的带宽因为其他程序的波动而一直波动,导致DNS请求时间不稳定。

  另外,本次只抓取了哔哩哔哩视频站下的部分标题,没有调查爬虫在不同域抓取的影响。不同域的爬虫要有DNS缓存,这样也能加快速度。

查看主机dns缓存内容,windows的dns缓存文件怎么查看