Python爬虫DNS解析缓存方法实例分析
作者:九茶 发布时间:2021-02-10 11:56:54
标签:Python,爬虫,DNS
本文实例讲述了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程序设计有所帮助。


猜你喜欢
- 本文介绍了react-native ListView下拉刷新上拉加载实现。分享给大家,具体如下:先看效果图下拉刷新React Native提
- Go对字符串格式化提供了良好的支持。下面我们看些常用的字符串格式化的例子。package mainimport "fmt"
- 本篇阅读的代码片段来自于30-seconds-of-python。1. count_bydef count_by(arr, fn=lambd
- 图片的上传上传图片使用了表单提交, 下面是html部分, enctype="multipart/form-data"表示
- 目录代码分享一、安装并创建Scrapy项目二、爬取应用市场评论过程1. Scrapy爬虫运行流程2. 页面分析页面分析过程一页面分析过程二页
- CREATE DATABASE 临时的 ON ( NAME='临时的_Data', FILENAME='h:\临时的
- String转换为time存进数据库很久没试过将String类型转换并存进数据库中的date类型的字段,今天刚好遇到并解决了这个小问题,故写
- 先学会文件的读写!比如像以前在学校读书的时候,第一门编程课设计要求是制作学生管理系统。这就需要使用文件来处理(也可以用数据库,但是一般C语言
- 在项目开发过程中,遇到如下用户体验提升需求:需要实现错误提示时根据后台返回错误列表信息,换行展示。实现方式如下:通过F12元素查看,在对应的
- 本文实例讲述了Python常见字符串操作函数。分享给大家供大家参考,具体如下:str.split(' ')1.按某一个字符分
- 题目描述给定一个只包括 '(',')','{','}','['
- 原文:Unobtrusive Ajax。今天才看见的一个Presentation,是Jesse Skinner在06年10月发表的。虽然题目
- 物体跟踪效果展示 过程:一、初始化def Motor_Init(): global L_Motor, R
- 前言pymssql模块是用于sql server数据库(一种数据库通用接口标准)的连接。另外pyodbc不仅限于SQL server,还包括
- 索引1、 什么是索引索引就是数据表中数据和相应的存储位置的列表,利用索引可以提高在表或视图中的查找数据的速度。2、 索引分类数据库中索引主要
- 在新旧版的torch中的傅里叶变换函数在定义和用法上存在不同,记录一下。1、旧版fft = torch.rfft(input, 2, nor
- pycurl是功能强大的python的url包,是用c语言写的,速度很快,比urllib和httplib都快调用方法:import pycu
- 这篇文章介绍如何利用Selenium的方法进行截图,在测试过程中,是有必要截图,特别是遇到错误的时候进行截图。在selenium for P
- 本文实例讲述了JS实现FLASH幻灯片图片切换效果的方法。分享给大家供大家参考。具体实现方法如下:<!DOCTYPE html PUB
- 概述我一直在找一种好的方法来解释 go 语言的并发模型:不要通过共享内存来通信,相反,应该通过通信来共享内存但是没有发现一个好的解释来满足我