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 相关文章推荐
win10环境下python3.5安装步骤图文教程
Feb 03 Python
分享一个可以生成各种进制格式IP的小工具实例代码
Jul 28 Python
python之线程通过信号pyqtSignal刷新ui的方法
Jan 11 Python
python暴力解压rar加密文件过程详解
Jul 05 Python
python安装本地whl的实例步骤
Oct 12 Python
python pyenv多版本管理工具的使用
Dec 23 Python
Python中用pyinstaller打包时的图标问题及解决方法
Feb 17 Python
django xadmin中form_layout添加字段显示方式
Mar 30 Python
基于Django OneToOneField和ForeignKey的区别详解
Mar 30 Python
python TCP包注入方式
May 05 Python
Python机器学习算法之决策树算法的实现与优缺点
May 13 Python
Python获取指定日期是"星期几"的6种方法
Mar 13 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
晶体管来复再生式二管收音机
2021/03/02 无线电
PHP 字符串分割和比较
2009/10/06 PHP
PHP可逆加密/解密函数分享
2012/09/25 PHP
基于PHP一些十分严重的缺陷详解
2013/06/03 PHP
php ckeditor上传图片文件名乱码解决方法
2013/11/15 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
2018/03/30 PHP
使用PHPExcel导出Excel表
2018/09/08 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
2019/01/28 PHP
jQuery 常见学习网站与参考书
2009/11/09 Javascript
页面中iframe相互传值传参
2009/12/13 Javascript
LazyLoad 延迟加载(按需加载)
2010/05/31 Javascript
javascript:;与javascript:void(0)使用介绍
2013/06/05 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
JavaScript将字符串转换成字符编码列表的方法
2015/03/19 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
vuejs指令详解
2017/02/07 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
利用jqprint插件打印页面内容的实现方法
2018/01/09 Javascript
解决小程序无法触发SESSION问题
2020/02/03 Javascript
JS sort方法基于数组对象属性值排序
2020/07/10 Javascript
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
运动检测ViBe算法python实现代码
2018/01/09 Python
使用Python从零开始撸一个区块链
2018/03/14 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
法国体育用品商店:GO Sport
2019/10/23 全球购物
英语国培研修感言
2014/02/13 职场文书
毕业生写求职信的要点
2014/03/04 职场文书
团代会宣传工作方案
2014/05/08 职场文书
爱与责任师德演讲稿
2014/08/26 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
2014年高中教师工作总结
2014/12/19 职场文书
消防安全月活动总结
2015/05/08 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
2021/04/05 Python