zoukankan      html  css  js  c++  java
  • 防爬总结

                         防爬总结

                                                          

    一、针对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 里面使用的话哪个会出现问题?

  • 相关阅读:
    ZOJ Problem Set–2417 Lowest Bit
    ZOJ Problem Set–1402 Magnificent Meatballs
    ZOJ Problem Set–1292 Integer Inquiry
    ZOJ Problem Set–1109 Language of FatMouse
    ZOJ Problem Set–1295 Reverse Text
    ZOJ Problem Set–1712 Skew Binary
    ZOJ Problem Set–1151 Word Reversal
    ZOJ Problem Set–1494 Climbing Worm
    ZOJ Problem Set–1251 Box of Bricks
    ZOJ Problem Set–1205 Martian Addition
  • 原文地址:https://www.cnblogs.com/xoray007/p/2258366.html
Copyright © 2011-2022 走看看