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 学习笔记
Dec 27 Python
在Python编程过程中用单元测试法调试代码的介绍
Apr 02 Python
如何使用Python的Requests包实现模拟登陆
Apr 27 Python
Python多进程池 multiprocessing Pool用法示例
Sep 07 Python
python实现石头剪刀布程序
Jan 20 Python
Python+Selenium使用Page Object实现页面自动化测试
Jul 14 Python
对python中assert、isinstance的用法详解
Nov 27 Python
详解python metaclass(元类)
Aug 13 Python
python pymysql库的常用操作
Oct 16 Python
python 实现一个图形界面的汇率计算器
Nov 09 Python
matplotlib交互式数据光标mpldatacursor的实现
Feb 03 Python
Python 数据可视化之Matplotlib详解
Nov 02 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
从零开始学YII2框架(六)高级应用程序模板
2014/08/20 PHP
php实现mysql数据库连接操作及用户管理
2015/11/08 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
基于jquery的模态div层弹出效果
2010/08/21 Javascript
基于jquery 的一个progressbar widge
2010/10/29 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
JavaScript判断浏览器类型的方法
2015/02/10 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
2016/02/14 Javascript
浅析Bootstrap验证控件的使用
2016/06/23 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
javascript过滤数组重复元素的实现方法
2017/05/03 Javascript
vue 中directive功能的简单实现
2018/01/05 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
Vue中render函数的使用方法
2018/01/31 Javascript
解决npm安装Electron缓慢网络超时导致失败的问题
2018/02/06 Javascript
Vue中在新窗口打开页面及Vue-router的使用
2018/06/13 Javascript
JavaScript常用事件介绍
2019/01/21 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
2020/12/07 Vue.js
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
python为tornado添加recaptcha验证码功能
2014/02/26 Python
在Python的列表中利用remove()方法删除元素的教程
2015/05/21 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
2018/12/04 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
通过实例解析Python RPC实现原理及方法
2020/07/07 Python
令人啧啧称赞的经理推荐信
2013/11/07 职场文书
银行个人求职自荐信范文
2013/12/16 职场文书
2014年两会学习心得体会
2014/03/10 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
MySQL 逻辑备份 into outfile
2022/05/15 MySQL