全球彩票平台_全球彩票注册平台|官网下载地址

热门关键词: 全球彩票平台,全球彩票注册平台,全球彩官网下载地址

MemoryCache缓存的用法学习,python实例分析

[爬虫学习笔记]C#基于AWranglerSoft.Tools.Net的DNS深入分析模块(半成品),

         最近在做爬虫的作业,今天学习的内容是关于DNS解析模块的制作的。使用的库为ARSoft.Tools.Net,它是一个非常强大的开源DNS控件库,包含.Net SPF validation, SenderID validation以及DNS Client、DNS Server接口。使用该接口可轻松实现DNS客户请求端及服务器解析端。项目地址:http://arsofttoolsnet.codeplex.com/,Nuget包地址:https://www.nuget.org/packages/ARSoft.Tools.Net/。 

   首先引入Nuget包:         Install-Package ARSoft.Tools.Net           

   下面开始具体实现:         /// <summary>
/// DNS解析
/// </summary>
/// <param name="dnsServer">DNS服务器IP</param>
/// <param name="timeOut">解析超时时间</param>
/// <param name="url">解析网址</param>
/// <param name="isSuccess">是否解析成功</param>
/// <returns>解析到的IP信息</returns>
public static IPAddress DnsResolver(string dnsServer, int timeOut, string url, out bool isSuccess)
{
    //初始化DnsClient,第一个参数为DNS服务器的IP,第二个参数为超时时间
    var dnsClient = new DnsClient(IPAddress.Parse(dnsServer), timeOut);
    //解析域名。将域名请求发送至DNS服务器解析,第一个参数为需要解析的域名,第二个参数为
    //解析类型, RecordType.A为IPV4类型
    //DnsMessage dnsMessage = dnsClient.Resolve("www.sina.com", RecordType.A);
    var s = new Stopwatch();
    s.Start();
    var dnsMessage = dnsClient.Resolve(DomainName.Parse(url));
    s.Stop();
    Console.WriteLine(s.Elapsed.Milliseconds);
    //若返回结果为空,或者存在错误,则该请求失败。
    if (dnsMessage == null || (dnsMessage.ReturnCode != ReturnCode.NoError && dnsMessage.ReturnCode != ReturnCode.NxDomain))
    {
        isSuccess= false;
    }
    //循环遍历返回结果,将返回的IPV4记录添加到结果集List中。
    if (dnsMessage != null)
        foreach (var dnsRecord in dnsMessage.AnswerRecords)
        {
            var aRecord = dnsRecord as ARecord;
            if (aRecord == null) continue;
            isSuccess = true;
            return aRecord.Address;
        }
    isSuccess= false;
    return null;
}

  调用方法:


    bool isSuccess;
IPAddress ip = DnsResolver("223.5.5.5", 200, "shaoweicloud.cn", out isSuccess);
if (isSuccess)
    Console.WriteLine(ip);

 

 

  懂的使用方法后我们可以对它做进一步封装,得到DnsResolver类:


    using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net;
using ARSoft.Tools.Net;
using ARSoft.Tools.Net.Dns;

namespace Crawler.Protocol
{
    public class DnsResolver
    {
        public TimeSpan TimeSpan { get; set; }
        public string Url { get; set; }
        public List Record { get; set; }
        public string DnsServer { get; set; }
        public int TimeOut { get; set; }
        public ReturnCode ReturnCode { get; set; }
        public bool IsSuccess { get; private set; }
        public DnsResolver(string url, string dnsServer = "223.5.5.5", int timeOut = 200)
        {
            Url = url;
            DnsServer = dnsServer;
            TimeOut = timeOut;
            Record=new List();
            Dig();
        }

        public void Dig()
        {
            //初始化DnsClient,第一个参数为DNS服务器的IP,第二个参数为超时时间
            var dnsClient = new DnsClient(IPAddress.Parse(DnsServer), TimeOut);
            var s = new Stopwatch();
            s.Start();
            //解析域名。将域名请求发送至DNS服务器解析,参数为需要解析的域名
            var dnsMessage = dnsClient.Resolve(DomainName.Parse(Url));
            s.Stop();
            TimeSpan = s.Elapsed;
            //若返回结果为空,或者存在错误,则该请求失败。
            if (dnsMessage == null || (dnsMessage.ReturnCode != ReturnCode.NoError && dnsMessage.ReturnCode != ReturnCode.NxDomain))
                IsSuccess = false;
            //循环遍历返回结果,将返回的IPV4记录添加到结果集List中。
            if (dnsMessage != null)
                foreach (var dnsRecord in dnsMessage.AnswerRecords)
                {
                    var aRecord = dnsRecord as ARecord;
                    if (aRecord == null) continue;
                    IsSuccess = true;
                    Record.Add(aRecord);
                }
            if (dnsMessage != null) ReturnCode = dnsMessage.ReturnCode;
        }
    }
}

  调用方法:


    DnsResolver dns = new DnsResolver("shaoweicloud.cn");
if (dns.IsSuccess)
    Console.WriteLine(dns.Record[0]);

        至此,DNS解析模块就基本结束了,至于为什么标题中标注了半成品,是因为我想在基本的DNS解析功能的基础上根据解析到DNS信息中的TTL做一套信息缓存机制,减少不必要的重复查询,目前还在考虑使用何种方法,后续实现会更新。

方今在做爬虫的功课,后天上学的开始和结果是关于DNS解析模块的创设的。使用的库...

Python爬虫DNS剖析缓存方法实例深入分析,python实例剖判

正文实例陈诉了Python爬虫DNS深入分析缓存方法。分享给我们供大家参谋,具体如下:

前言:

那是Python爬虫中DNS分析缓存模块中的主题代码,是二零一八年的代码了,以后放出去 有意思味的可以看一下。

一般三个域名的DNS分析时间在10~60微秒之间,那看起来是何足挂齿,可是对于大型一点的爬虫来讲那就不容忽视了。比如我们要爬天涯论坛乐乎,同个域名下的乞请有1千万(那曾经不算多的了),那么耗费时间在10~60万秒之内,一天才86400秒。也便是说单DNS分析这一项就用了一些天时间,此时足够DNS解析缓存,效果就明摆着了。

上面直接放代码,表达在前面。

代码:

# encoding=utf-8
# ---------------------------------------
#  版本:0.1
#  日期:2016-04-26
#  作者:九茶<[email protected]>
#  开发环境: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爬虫DNS深入分析缓存方法。分享给大家供大家参谋,具体如下: 前言:...

      # print str(args) " in cache"

返回值

 

      # print str(args) " not in cache"

[爬虫学习笔记]MemoryCache缓存的用历史学习,memorycache

         在完成了DNS解析模块之后,我意识到了DNS缓存机制也很有必要。在Redis,Memcache,和.Net自带的Cache之间,考虑到部署问题,最终选择了后者,之前在学习Web及开发的过程中用过System.Web.Caching.Cache这个类库,但是这次的爬虫程序我打算部署为桌面软件,所以选用了System.Runtime.Caching.MemoryCache(后期如有必要也会加入System.Web.Caching.Cache来适配Web端程序)。          MemoryCache的使用网上介绍的不多,不过这个是.NET4.0新引入的缓存对象,估计主要是替换原来企业库的缓存模块,使得.NET的缓存可以无处不在,而不用基于特定的Windows版本上使用。          出于方便考虑,我们将不再实例化新的MemoryCache对象,只对MemoryCache的默认示例Memory.Default进行增删查操作。 

   基础篇    增加:    var item = new CacheItem("习大大", "两学一做");
var policy = new CacheItemPolicy();
policy.SlidingExpiration = new TimeSpan(500);
//插入一条key为"习大大",value为"两学一做",500毫秒后自动销毁的缓存
MemoryCache.Default.Add(item, policy);
//重新设置policy的过期时间为当前时间 十分钟
policy.AbsoluteExpiration = DateTimeOffset.Now   TimeSpan.FromMinutes(10);
//注意,如果要使用Sliding时间,则Absolute必须为DateTimeOffset.MaxValue,反之,则Sliding必须为TimeSpan.Zero
policy.SlidingExpiration = TimeSpan.Zero;
//重新插入,覆盖前一条数据
MemoryCache.Default.Add(item, policy);

注意,如果要使用Sliding时间,则Absolute必须为DateTimeOffset.MaxValue,反之,则Sliding必须为TimeSpan.Zero 

  查询:

  缓存对象类似于字典集,查询可以直接采用memoryCache[key]来进行,例如我们查询一下前面插入的那条数据:


    var idea = MemoryCache.Default["习大大"];

  移除:

  参数

key:要移除的缓存项的独一标志符。

regionName:缓存中的贰个加多了缓存项的命名区域。不要为该参数字传送递值。私下认可情形下,此参数为null,因为 MemoryCache 类未达成区域。

      近日在做爬虫的学业,明日上学的从头到尾的经过是关于DNS剖判模块的创设的。使用的库为AENVISIONSoft.Tools.Net,它是一个格外强劲的开源DNS控件库,包蕴.Net SPF validation, SenderID validation以及DNS Client、DNS Server接口。使用该接口可轻便完成DNS顾客乞请端及服务器分析端。

项目地址:,

Nuget包地址:。

首先引进Nuget包:

 

Install-Package ARSoft.Tools.Net

 

 

上边初始具体贯彻:

/// <summary>
/// DNS解析
/// </summary>
/// <param name="dnsServer">DNS服务器IP</param>
/// <param name="timeOut">解析超时时间</param>
/// <param name="url">解析网址</param>
/// <param name="isSuccess">是否解析成功</param>
/// <returns>解析到的IP信息</returns>
public static IPAddress DnsResolver(string dnsServer, int timeOut, string url, out bool isSuccess)
{
    //初始化DnsClient,第一个参数为DNS服务器的IP,第二个参数为超时时间
    var dnsClient = new DnsClient(IPAddress.Parse(dnsServer), timeOut);
    //解析域名。将域名请求发送至DNS服务器解析,第一个参数为需要解析的域名,第二个参数为
    //解析类型, RecordType.A为IPV4类型
    //DnsMessage dnsMessage = dnsClient.Resolve("www.sina.com", RecordType.A);
    var s = new Stopwatch();
    s.Start();
    var dnsMessage = dnsClient.Resolve(DomainName.Parse(url));
    s.Stop();
    Console.WriteLine(s.Elapsed.Milliseconds);
    //若返回结果为空,或者存在错误,则该请求失败。
    if (dnsMessage == null || (dnsMessage.ReturnCode != ReturnCode.NoError && dnsMessage.ReturnCode != ReturnCode.NxDomain))
    {
        isSuccess= false;
    }
    //循环遍历返回结果,将返回的IPV4记录添加到结果集List中。
    if (dnsMessage != null)
        foreach (var dnsRecord in dnsMessage.AnswerRecords)
        {
            var aRecord = dnsRecord as ARecord;
            if (aRecord == null) continue;
            isSuccess = true;
            return aRecord.Address;
        }
    isSuccess= false;
    return null;
}

调用方法:

bool isSuccess;
IPAddress ip = DnsResolver("223.5.5.5", 200, "shaoweicloud.cn", out isSuccess);
if (isSuccess)
    Console.WriteLine(ip);

 

代码:

Type: System.Object  纵然在缓存中找到该项,则为已移除的缓存项;否则为 null。

删除后边参与的那一项:

MemoryCache.Default.Remove("习大大");





  进阶篇

  明白了基本的用法之后,我们就可以对它做进一步的封装,使之使用起来更为便捷:


    using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Caching;

namespace Crawler.Common
{
    /// <summary>
    /// 基于MemoryCache的缓存辅助类
    /// </summary>
    public static class MemoryCacheHelper
    {
        private static readonly object _locker = new object();

        public static bool Contains(string key)
        {
            return MemoryCache.Default.Contains(key);
        }


        /// <summary>
        /// 获取Catch元素
        /// </summary>
        /// <typeparam name="T">所获取的元素的类型</typeparam>
        /// <param name="key">元素的键</param>
        /// <returns>特定的元素值</returns>
        public static T Get<T>(string key)
        {
            if (string.IsNullOrWhiteSpace(key)) throw new ArgumentException("不合法的key!");
            if (!MemoryCache.Default.Contains(key))
                throw new ArgumentException("获取失败,不存在该key!");
            if (!(MemoryCache.Default[key] is T))
                throw new ArgumentException("未找到所需类型数据!");
            return (T)MemoryCache.Default[key];
        }

        /// <summary>
        /// 添加Catch元素
        /// </summary>
        /// <param name="key">元素的键</param>
        /// <param name="value">元素的值</param>
        /// <param name="slidingExpiration">元素过期时间(时间间隔)</param>
        /// <param name="absoluteExpiration">元素过期时间(绝对时间)</param>
        /// <returns></returns>
        public static bool Add(string key, object value, TimeSpan? slidingExpiration = null, DateTime? absoluteExpiration = null)
        {
            var item = new CacheItem(key, value);
            var policy = CreatePolicy(slidingExpiration, absoluteExpiration);
            lock (_locker)
                return MemoryCache.Default.Add(item, policy);
        }

        /// <summary>
        /// 移出Cache元素
        /// </summary>
        /// <typeparam name="T">待移出元素的类型</typeparam>
        /// <param name="key">待移除元素的键</param>
        /// <returns>已经移出的元素</returns>
        public static T Remove<T>(string key)
        {
            if (string.IsNullOrWhiteSpace(key)) throw new ArgumentException("不合法的key!");
            if (!MemoryCache.Default.Contains(key))
                throw new ArgumentException("获取失败,不存在该key!");
            var value = MemoryCache.Default.Get(key);
            if (!(value is T))
                throw new ArgumentException("未找到所需类型数据!");
            return (T)MemoryCache.Default.Remove(key);
        }

        /// <summary>
        /// 移出多条缓存数据,默认为所有缓存
        /// </summary>
        /// <typeparam name="T">待移出的缓存类型</typeparam>
        /// <param name="keyList"></param>
        /// <returns></returns>
        public static List<T> RemoveAll<T>(IEnumerable<string> keyList = null)
        {
            if (keyList != null)
                return (from key in keyList
                        where MemoryCache.Default.Contains(key)
                        where MemoryCache.Default.Get(key) is T
                        select (T)MemoryCache.Default.Remove(key)).ToList();
            while (MemoryCache.Default.GetCount() > 0)
                MemoryCache.Default.Remove(MemoryCache.Default.ElementAt(0).Key);
            return new List<T>();
        }

        /// <summary>
        /// 设置过期信息
        /// </summary>
        /// <param name="slidingExpiration"></param>
        /// <param name="absoluteExpiration"></param>
        /// <returns></returns>
        private static CacheItemPolicy CreatePolicy(TimeSpan? slidingExpiration, DateTime? absoluteExpiration)
        {
            var policy = new CacheItemPolicy();

            if (absoluteExpiration.HasValue)
            {
                policy.AbsoluteExpiration = absoluteExpiration.Value;
            }
            else if (slidingExpiration.HasValue)
            {
                policy.SlidingExpiration = slidingExpiration.Value;
            }

            policy.Priority = CacheItemPriority.Default;

            return policy;
        }
    }
}

在变成了DNS剖判模块然后,笔者发觉到了DNS缓存机制也很有不可或缺。在Redis,Memcache,和.Net自...

懂的行使办法后我们能够对它做进一步封装,获得DnsResolver类:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net;
using ARSoft.Tools.Net;
using ARSoft.Tools.Net.Dns;


namespace Crawler.Protocol { public class DnsResolver { public TimeSpan TimeSpan { get; set; } public string Url { get; set; } public List Record { get; set; } public string DnsServer { get; set; } public int TimeOut { get; set; } public ReturnCode ReturnCode { get; set; } public bool IsSuccess { get; private set; } public DnsResolver(string url, string dnsServer = "223.5.5.5", int timeOut = 200) { Url = url; DnsServer = dnsServer; TimeOut = timeOut; Record=new List(); Dig(); }
public void Dig() { //开头化DnsClient,第三个参数为DNS服务器的IP,第3个参数为超时时间 var dnsClient = new DnsClient(IPAddress.Parse(DnsServer), TimeOut); var s = new Stopwatch(); s.Start(); //深入分析域名。将域名诉求发送至DNS服务器深入分析,参数为急需解析的域名 var dnsMessage = dnsClient.Resolve(DomainName.Parse(Url)); s.Stop(); TimeSpan = s.Elapsed; //若再次来到结果为空,只怕存在错误,则该伏乞失败。 if (dnsMessage == null || (dnsMessage.ReturnCode != ReturnCode.NoError && dnsMessage.ReturnCode != ReturnCode.NxDomain)) IsSuccess = false; //循环遍历再次回到结果,将回到的IPV4记录增添到结果集List中。 if (dnsMessage != null) foreach (var dnsRecord in dnsMessage.AnswerRecords) { var aRecord = dnsRecord as ARecord; if (aRecord == null) continue; IsSuccess = true; Record.Add(aRecord); } if (dnsMessage != null) ReturnCode = dnsMessage.ReturnCode; } } }

调用方法:

DnsResolver dns = new DnsResolver("shaoweicloud.cn");
if (dns.IsSuccess)
    Console.WriteLine(dns.Record[0]);

 

         至此,DNS解析模块就大旨甘休了,至于为啥标题中标明了半成品,是因为自己想在基本的DNS剖析成效的底蕴上依据剖析到DNS音信中的TTL做一套音信缓存机制,收缩不须求的再一次查询,近年来还在虚构选择何种格局,后续完成会更新。

#  作者:九茶

#  开辟条件:Win64 Python 2.7

    socket.getaddrinfo=_getaddrinfo

说明:

本文由全球彩票平台发布于全球彩票注册平台编程,转载请注明出处:MemoryCache缓存的用法学习,python实例分析

TAG标签: 全球彩票平台
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。