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中使用socket发送HTTP请求数据接收不完整问题解决方法
Feb 04 Python
在Django框架中设置语言偏好的教程
Jul 27 Python
带你了解python装饰器
Jun 15 Python
Python实现端口检测的方法
Jul 24 Python
python制作mysql数据迁移脚本
Jan 01 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
Python中numpy模块常见用法demo实例小结
Mar 16 Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 Python
Python3标准库之threading进程中管理并发操作方法
Mar 30 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
Apr 14 Python
python3实现无权最短路径的方法
May 12 Python
如何在向量化NumPy数组上进行移动窗口
May 18 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中SERIALIZE和JSON的序列化与反序列化操作区别分析
2016/10/11 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
2016/12/07 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
yii2中关于加密解密的那些事儿
2018/06/12 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
用js实现控制内容的向上向下滚动效果
2007/06/26 Javascript
CLASS_CONFUSION JS混淆 全源码
2007/12/12 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
js中indexof的用法详细解析
2013/12/24 Javascript
不要使用jQuery触发原生事件的方法
2014/03/03 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
AngularJS 实现按需异步加载实例代码
2015/10/18 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
基于javascript实现tab选项卡切换特效调试笔记
2016/03/30 Javascript
Ajax基础知识详解
2017/02/17 Javascript
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
原生js实现简单的焦点图效果实例
2017/12/14 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
使用简单工厂模式来进行Python的设计模式编程
2016/03/01 Python
Python_LDA实现方法详解
2017/10/25 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
基于python的socket实现单机五子棋到双人对战
2020/03/24 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
python读文件的步骤
2019/10/08 Python
python实现logistic分类算法代码
2020/02/28 Python
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
夏洛特和乔治婴儿和儿童时装精品店:Charlotte and George
2018/06/06 全球购物
Stührling手表官方网站:男女高品质时尚手表的领先零售商
2021/01/07 全球购物
金蝶的一道SQL笔试题
2012/12/18 面试题
节能宣传周活动总结
2014/05/08 职场文书
个人安全承诺书
2014/05/22 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript