指引网

当前位置: 主页 > 编程开发 > Python >

Python爬虫DNS解析缓存方法

来源:网络 作者:佚名 点击: 时间:2017-06-21 20:09
[摘要]  本篇文章结合具体实例形式分析了Python使用socket模块解析DNS缓存的相关操作技巧与注意事项,有需要朋友可以参考一下。

本文实例讲述了Python爬虫DNS解析缓存方法。分享给大家供大家参考,具体如下:

前言:

这是Python爬虫中DNS解析缓存模块中的核心代码,是去年的代码了,现在放出来 有兴趣的可以看一下。

一般一个域名的DNS解析时间在10~60毫秒之间,这看起来是微不足道,但是对于大型一点的爬虫而言这就不容忽视了。例如我们要爬新浪微博,同个域名下的请求有1千万(这已经不算多的了),那么耗时在10~60万秒之间,一天才86400秒。也就是说单DNS解析这一项就用了好几天时间,此时加上DNS解析缓存,效果就明显了。

下面直接放代码,说明在后面。

代码:

 

 代码如下复制代码

# encoding=utf-8

# ---------------------------------------

#  版本:0.1

#  日期:2016-04-26

#  作者:九茶

#  开发环境:Win64 + Python 2.7

# ---------------------------------------

importsocket

# from gevent import socket

_dnscache={}

def_setDNSCache():

  """ DNS缓存 """

  def_getaddrinfo(*args,**kwargs):

    ifargsin_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]

  ifnothasattr(socket,'_getaddrinfo'):

    socket._getaddrinfo=socket.getaddrinfo

    socket.getaddrinfo=_getaddrinfo

 

说明:

其实也没什么难度,就是将socket里面的缓存保存下来,避免重复获取。
可以将上面的代码放在一个dns_cache.py文件里,爬虫框架里调用一下这个_setDNSCache()方法就行了。

需要说明一下的是,如果你使用了gevent协程,并且用上了monkey.patch_all(),要注意此时爬虫已经改用gevent里面的socket了,DNS解析缓存模块也应该要用gevent的socket才行。

------分隔线----------------------------