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


Posted in Python onJune 02, 2017

本文实例讲述了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 相关文章推荐
Python selenium 父子、兄弟、相邻节点定位方式详解
Sep 15 Python
python实现list由于numpy array的转换
Apr 04 Python
Python 批量合并多个txt文件的实例讲解
May 08 Python
django反向解析和正向解析的方式
Jun 05 Python
Python socket套接字实现C/S模式远程命令执行功能案例
Jul 06 Python
Python 实现两个列表里元素对应相乘的方法
Nov 14 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
Jun 18 Python
python中的线程threading.Thread()使用详解
Dec 17 Python
Python如何在DataFrame增加数值
Feb 14 Python
python中使用you-get库批量在线下载bilibili视频的教程
Mar 10 Python
python实现计算器简易版
Dec 17 Python
python制作微博图片爬取工具
Jan 16 Python
Python编程实现二叉树及七种遍历方法详解
Jun 02 #Python
Python递归函数定义与用法示例
Jun 02 #Python
matplotlib绘制符合论文要求的图片实例(必看篇)
Jun 02 #Python
Python 爬虫图片简单实现
Jun 01 #Python
Python 通过URL打开图片实例详解
Jun 01 #Python
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 #Python
python 内置函数filter
Jun 01 #Python
You might like
PHP+AJAX实现无刷新注册(带用户名实时检测)
2006/12/02 PHP
php 操作符与控制结构
2012/03/07 PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
基于xcache的配置与使用详解
2013/06/18 PHP
php获取一定范围内取N个不重复的随机数
2016/05/28 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
2019/10/11 PHP
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
Javascript 自定义类型方法小结
2010/03/02 Javascript
url地址自动加#号问题说明
2010/08/21 Javascript
jQuery 名称冲突的解决方法
2011/04/08 Javascript
chrome浏览器不支持onmouseleave事件的解决技巧
2013/05/31 Javascript
Js中获取frames中的元素示例代码
2013/07/30 Javascript
js中创建对象的几种方式示例介绍
2014/01/26 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
AngularJS实现路由实例
2017/02/12 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
微信小程序实现左右列表联动
2020/05/19 Javascript
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
浅谈django的render函数的参数问题
2018/10/16 Python
python 实现提取某个索引中某个时间段的数据方法
2019/02/01 Python
如何基于python实现归一化处理
2020/01/20 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
英语自荐信常用语句
2013/12/13 职场文书
经典演讲稿开场白
2014/08/25 职场文书
党员三严三实心得体会
2014/10/13 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
2014年小学图书室工作总结
2014/12/09 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
民事起诉状范文
2015/05/19 职场文书
职工食堂管理制度
2015/08/06 职场文书
小学班主任培训心得体会
2016/01/07 职场文书
python基础之匿名函数详解
2021/04/21 Python
mysql全面解析json/数组
2022/07/07 MySQL