• 防爬总结


                         防爬总结

                                                          

    一、针对Http协议

    在浏览器访问网站的时候伴随着相关的Http协议

    User-Agent:用户浏览器与版本信息

    如:Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729)

    Referer:请求URL的源地址

    如果用户直接请求URL时则Referer不能被发送显示。

    Cookie:用于辨别用户身份,存储在用户的数据

    在用户浏览网站网页时,首次访问时,服务端可以给它添加默认值,通过这个值了解用户登录信息。

    根据一般程序编写的爬虫器不会添加User-AgentRefererCookie等方面制定规则,过滤一些简单的程序爬虫。

    二、针对IP访问

    如果不考虑HTTP方面对爬虫的过滤。

    爬虫 有可能频繁访问网站影响网站性能,我们可以制定规则应对这部分的爬虫。

    获得IP的地址有几种可能性:

    1、  IP地址为本机真实IP

    2、  IP地址为代理服务器提供的IP

    3、  IP地址经过多个代理服务器后的多个IP地址

    在这次针对IP访问的防爬制定的规则是:

    A、 判断是否通过代理IP

    B、 如果没有通过代理IP 则记录用户IP

    C、 如果通过代理IP,继续判断是否有多个代理IP

    D、 我们这里只选择记录第一个代理IP

    判断是否有代理IP可以使用:HTTP_X_FORWARDED_FOR 进行判断

    用户本地IP 可以通过REMOTE_ADDR 或者UserHostAddress属性获得

    记录了IP后,我们可以制定策略,防止在一段时间中IP的频繁访问。

    这里基于IP 所占用的字节不多,选择将IP 访问次数 存储在Cache里面,并让Cache的失效基于相对时间。

    Cache方面的选择:

    Cache除了页面的缓存不用考虑外

    HttpContext.Current.Items   基于上下文的缓存,在页面刷新后失效也不考虑

    HttpContext.Current.Cache 为当前 HTTP 请求获取Cache对象 只能在Web使用

    HttpRuntime.Cache 获取当前应用程序的Cache  Web 与非Web都可以使用

    企业库缓存 

    这里我们选择了程序里面已经有了的企业库缓存来做为存储。

     

    三、针对IP 并发

    考虑到有可能出现多线程并发行为,我们需要针对并发问题制定相关策略

    这里选择当并发行为超过一定次数就触动并发,并将并发的次数写入缓存中

    缓存方面选择使用HttpContext.Current.Cache,缓存的写入与针对IP区别不大都是基于相对时间。

    编写方式如:

    HttpContext.Current.Cache.Add(IpNumberName,i,null,System.Web.Caching.Cache.NoAbsoluteExpiration,new TimeSpan(0,0,0),System.Web.Caching.CacheItemPriority.High,null)

    程序里阻止同时写入缓存的现象,通过lock将缓存写入时其他线程阻塞在外面。

    四、针对Cookie

    Cookie方面的策略与上面的二、三策略相似,在这里就不再重复了。

    在判断用户本地是否有Cookie值,如果没有Cookie就同赋予值。如果有记录次数,存储在企业库缓存中。

    下面是添加Cookie的相关程序

    HttpCookie cookie = new HttpCookie(CookieName, cookiesGuid);

     cookie.Expires.AddMinutes(30);

     Response.AppendCookie(cookie);

     

    总结

    以上是在这次的防爬编写程序中所学到与有所应用的相关策略。

    所学收获:在这次防爬里对企业库缓存的编写,HttpContext.Current.Cache HttpRuntime.CacheHTTP的请求头的方法有多了一丁点了解。

    依然不解: 忘记了Serializable HttpContext.Current.Cache HttpRuntime.Cache 里面使用的话哪个会出现问题?

  • 相关阅读:
    csuoj 1391: Boiling Vegetables
    csuoj 1392: Number Trick
    nyist 78 圈水池
    1393: Robert Hood 旋转卡壳 凸包
    模板 旋转卡壳 凸包
    模板 凸包 旋转卡壳
    ASP.NET Web API2返回值处理流程
    DependencyInjection源码解读之ServiceProvider
    深入研究EF Core AddDbContext 引起的内存泄露的原因
    私有云方案——利用阿里云云解析实现DDNS
  • 原文地址:https://www.cnblogs.com/xoray007/p/2258366.html
Copyright © 2020-2023  润新知