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多进程编程技术实例分析
Sep 16 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 Python
win系统下为Python3.5安装flask-mongoengine 库
Dec 20 Python
用Python写王者荣耀刷金币脚本
Dec 21 Python
python 对象和json互相转换方法
Mar 22 Python
python+selenium实现简历自动刷新的示例代码
May 20 Python
使用python+whoosh实现全文检索
Dec 09 Python
Python猴子补丁知识点总结
Jan 05 Python
pytorch-RNN进行回归曲线预测方式
Jan 14 Python
python 串行执行和并行执行实例
Apr 30 Python
快速解决pymongo操作mongodb的时区问题
Dec 05 Python
利用Python实现翻译HTML中的文本字符串
Jun 21 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
php代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
2013/08/06 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
2016/07/18 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
javascript 文章截取部分无损html显示实现代码
2010/05/04 Javascript
浏览器的JavaScript引擎的识别方法
2013/10/20 Javascript
Javascript的严格模式strict mode详细介绍
2014/06/06 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
Bootstrap基本插件学习笔记之标签切换(17)
2016/12/08 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
2017/03/29 Javascript
AngularJS使用ng-repeat遍历二维数组元素的方法详解
2017/11/11 Javascript
node vue项目开发之前后端分离实战记录
2017/12/13 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
vue keep-alive 动态删除组件缓存的例子
2019/11/04 Javascript
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
实例讲解python中的序列化知识点
2018/10/08 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
Python-接口开发入门解析
2019/08/01 Python
windows下Python安装、使用教程和Notepad++的使用教程
2019/10/06 Python
使用Django实现把两个模型类的数据聚合在一起
2020/03/28 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
浅谈HTML5 Web Worker的使用
2018/01/05 HTML / CSS
HTML5语义化元素你真的用对了吗
2019/08/22 HTML / CSS
在Java开发中如何选择使用哪种集合类
2016/08/09 面试题
法警的竞聘演讲稿
2014/01/02 职场文书
工作检讨书500字
2014/10/19 职场文书
房产公证书格式
2015/01/26 职场文书
学术会议邀请函
2015/01/30 职场文书
会议通知
2015/04/15 职场文书
JS Object构造函数之Object.freeze
2021/04/28 Javascript
SQL语法CONSTRAINT约束操作详情
2022/01/18 MySQL