Python爬虫——DNS解析缓存

Posted 九茶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python爬虫——DNS解析缓存相关的知识,希望对你有一定的参考价值。

前言:

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

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


代码:

# encoding=utf-8
# ---------------------------------------
#   版本:0.1
#   日期:2016-04-26
#   作者:九茶<bone_ace@163.com>
#   开发环境:Win64 + Python 2.7
# ---------------------------------------

import socket
# from gevent import socket

_dnscache = 

def _setDNSCache():
    """ DNS缓存 """

    def _getaddrinfo(*args, **kwargs):
        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


说明:

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

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



转载请注明出处,谢谢!(原文链接:http://blog.csdn.net/bone_ace/article/details/55000101

以上是关于Python爬虫——DNS解析缓存的主要内容,如果未能解决你的问题,请参考以下文章

常见面试题整理---前端(不论出处)

[爬虫学习笔记]MemoryCache缓存的用法学习

DNS服务器解析域名ping不通,在线等,急!!!

企业dns服务器部署详解(上)—高速缓存dns搭建/dns正反向解析

Python爬虫--初识爬虫

[爬虫学习笔记]C#基于ARSoft.Tools.Net的DNS解析模块(半成品)