| 一、針對Http協(xié)議 在瀏覽器訪問網(wǎng)站的時候伴隨著相關(guān)的Http協(xié)議 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不能被發(fā)送顯示。 Cookie:用于辨別用戶身份,存儲在用戶的數(shù)據(jù) 在用戶瀏覽網(wǎng)站網(wǎng)頁時,首次訪問時,服務(wù)端可以給它添加默認值,通過這個值了解用戶登錄信息。 根據(jù)一般程序編寫的爬蟲器不會添加User-Agent,Referer,Cookie等方面制定規(guī)則,過濾一些簡單的程序爬蟲。 二、針對IP訪問 如果不考慮HTTP方面對爬蟲的過濾。 爬蟲 有可能頻繁訪問網(wǎng)站影響網(wǎng)站性能,我們可以制定規(guī)則應(yīng)對這部分的爬蟲。 獲得IP的地址有幾種可能性: 1、  IP地址為本機真實IP, 2、  IP地址為代理服務(wù)器提供的IP 3、  IP地址經(jīng)過多個代理服務(wù)器后的多個IP地址 在這次針對IP訪問的防爬制定的規(guī)則是: A、 判斷是否通過代理IP, B、 如果沒有通過代理IP 則記錄用戶IP C、 如果通過代理IP,繼續(xù)判斷是否有多個代理IP D、 我們這里只選擇記錄第一個代理IP 判斷是否有代理IP可以使用:HTTP_X_FORWARDED_FOR 進行判斷 用戶本地IP 可以通過REMOTE_ADDR 或者UserHostAddress屬性獲得 記錄了IP后,我們可以制定策略,防止在一段時間中IP的頻繁訪問。 這里基于IP 所占用的字節(jié)不多,選擇將IP 訪問次數(shù) 存儲在Cache里面,并讓Cache的失效基于相對時間。 Cache方面的選擇: Cache除了頁面的緩存不用考慮外 HttpContext.Current.Items   基于上下文的緩存,在頁面刷新后失效也不考慮 HttpContext.Current.Cache 為當前 HTTP 請求獲取Cache對象 只能在Web使用 HttpRuntime.Cache 獲取當前應(yīng)用程序的Cache  Web 與非Web都可以使用 企業(yè)庫緩存   這里我們選擇了程序里面已經(jīng)有了的企業(yè)庫緩存來做為存儲。 三、針對IP 并發(fā) 考慮到有可能出現(xiàn)多線程并發(fā)行為,我們需要針對并發(fā)問題制定相關(guān)策略 這里選擇當并發(fā)行為超過一定次數(shù)就觸動并發(fā),并將并發(fā)的次數(shù)寫入緩存中 緩存方面選擇使用HttpContext.Current.Cache,緩存的寫入與針對IP區(qū)別不大都是基于相對時間。 編寫方式如: HttpContext.Current.Cache.Add(IpNumberName,i,null,System.Web.Caching.Cache.NoAbsoluteExpiration,new TimeSpan(0,0,0),System.Web.Caching.CacheItemPriority.High,null) 程序里阻止同時寫入緩存的現(xiàn)象,通過lock將緩存寫入時其他線程阻塞在外面。 四、針對Cookie Cookie方面的策略與上面的二、三策略相似,在這里就不再重復(fù)了。 在判斷用戶本地是否有Cookie值,如果沒有Cookie就同賦予值。如果有記錄次數(shù),存儲在企業(yè)庫緩存中。 下面是添加Cookie的相關(guān)程序 HttpCookie cookie = new HttpCookie(CookieName, cookiesGuid);  cookie.Expires.AddMinutes(30);  Response.AppendCookie(cookie); 總結(jié) 以上是在這次的防爬編寫程序中所學(xué)到與有所應(yīng)用的相關(guān)策略。 所學(xué)收獲:在這次防爬里對企業(yè)庫緩存的編寫,HttpContext.Current.Cache ,HttpRuntime.Cache,HTTP的請求頭的方法有多了一丁點了解。 依然不解: 忘記了Serializable 是HttpContext.Current.Cache ,HttpRuntime.Cache 里面使用的話哪個會出現(xiàn)問題? | 
|  |