Python爬虫DNS解析缓存方法实例分析

yipeiwu_com5年前Python爬虫

本文实例讲述了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才行。

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总

希望本文所述对大家Python程序设计有所帮助。

相关文章

Python爬虫抓取手机APP的传输数据

Python爬虫抓取手机APP的传输数据

大多数APP里面返回的是json格式数据,或者一堆加密过的数据 。这里以超级课程表APP为例,抓取超级课程表里用户发的话题。 1、抓取APP数据包 方法详细可以参考这篇博文:Fiddle...

python脚本爬取字体文件的实现方法

前言 大家应该都有所体会,为了提高验证码的识别准确率,我们当然要首先得到足够多的测试数据。验证码下载下来容易,但是需要人脑手工识别着实让人受不了,于是我就想了个折衷的办法——自己造验证码...

Python爬取破解无线网络wifi密码过程解析

Python爬取破解无线网络wifi密码过程解析

前言 今天从WiFi连接的原理,再结合代码为大家详细的介绍如何利用python来破解WiFi。 Python真的是无所不能,原因就是因为Python有数目庞大的库,无数的现成的轮子,让你...

Python爬虫之正则表达式基本用法实例分析

Python爬虫之正则表达式基本用法实例分析

本文实例讲述了Python爬虫之正则表达式基本用法。分享给大家供大家参考,具体如下: 一、简介 正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regu...

Python抓取百度查询结果的方法

本文实例讲述了Python抓取百度查询结果的方法。分享给大家供大家参考。具体实现方法如下: #win python 2.7.x import re,sys,urllib,codecs...