防爬总结

                     防爬总结

                                                      

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

原文地址:https://www.cnblogs.com/xoray007/p/2258366.html