防爬总结
一、针对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-Agent,Referer,Cookie等方面制定规则,过滤一些简单的程序爬虫。
二、针对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.Cache,HTTP的请求头的方法有多了一丁点了解。
依然不解: 忘记了Serializable 是HttpContext.Current.Cache ,HttpRuntime.Cache 里面使用的话哪个会出现问题?