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读取mp3中ID3信息的方法
Mar 05 Python
Python中获取对象信息的方法
Apr 27 Python
python 采集中文乱码问题的完美解决方法
Sep 27 Python
python实现八大排序算法(1)
Sep 14 Python
Python实现的选择排序算法示例
Nov 29 Python
Python解析命令行读取参数--argparse模块使用方法
Jan 23 Python
python入门前的第一课 python怎样入门
Mar 06 Python
使用pytorch进行图像的顺序读取方法
Jul 27 Python
解决pyecharts在jupyter notebook中使用报错问题
Apr 23 Python
python pickle存储、读取大数据量列表、字典数据的方法
Jul 07 Python
Python 读取用户指令和格式化打印实现解析
Sep 02 Python
Django 实现jwt认证的示例
Apr 30 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 强制性文件下载功能的函数代码(任意文件格式)
2010/05/26 PHP
PHP中数组的三种排序方法分享
2012/05/07 PHP
PHP URL参数获取方式的四种例子
2014/02/28 PHP
php自定义函数转换html标签示例
2016/09/29 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
firefox中JS读取XML文件
2006/12/21 Javascript
点击文章内容处弹出页面代码
2009/10/01 Javascript
动态调用CSS文件的JS代码
2010/07/29 Javascript
jQuery Mobile页面跳转后未加载外部JS原因分析及解决
2013/03/18 Javascript
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
vue实现几秒后跳转新页面代码
2020/09/09 Javascript
Swiper实现导航栏滚动效果
2020/10/16 Javascript
[02:41]DOTA2英雄基础教程 谜团
2013/12/10 DOTA
Python类属性与实例属性用法分析
2015/05/09 Python
python相似模块用例
2016/03/04 Python
Python Pillow Image Invert
2019/01/22 Python
Python地图绘制实操详解
2019/03/04 Python
对Python的交互模式和直接运行.py文件的区别详解
2019/06/29 Python
python如何将多个PDF进行合并
2019/08/13 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
详解Python yaml模块
2020/09/23 Python
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
法律进企业活动方案
2014/03/04 职场文书
需求分析说明书
2014/05/09 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
群众路线教育实践活动调研报告
2014/11/03 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL
在Django中使用MQTT的方法
2021/05/10 Python
你真的了解redis为什么要提供pipeline功能
2021/06/22 Redis