劉慶杰 孫旭光 王小英
防災科技學院信息工程系 河北 065201
隨著搜索引擎技術的流行,現在國內做搜索引擎的網絡公司超過50家,帶來的弊端就是,搜索引擎釋放出來的網絡爬蟲大量的占用互聯網的帶寬。由于這些搜索引擎廠商投入差別巨大、技術參差不齊,加上監管空白,一旦一個中型規模的網站被一個技術糟糕的搜索引擎爬蟲的抓取數據,很可能在短時間內導致網站訪問速度緩慢,甚至完全無法訪問。另外,還有相當多的網頁爬蟲目的是盜取內容,然后使用自己的發帖機器人將內容自動發表到自己的網站,制造自己網站的虛假PV。所以說,網絡爬蟲不僅影響網站的性能,而且很可能偷盜網站內容,侵犯知識產權,因此反網頁爬蟲是所有網站值得重視和長期探索的問題。
我們知道,對于網站來說,正常的用戶請求是通過瀏覽器發送到服務器的,用戶請求的Request中會攜帶大量用戶端系統信息,其中就包括用戶的瀏覽器廠商和版本字符串,存儲在Request請求的Header的User-agent字段。而網絡爬蟲一般都是搜索引擎廠商開發出來的專門的工具軟件,通過網絡爬蟲發送給服務器的請求中,User-agent字段是沒有瀏覽器信息的,因此我們就可以通過記錄和分析User-Agent信息來區分正常的用戶請求和網頁爬蟲請求。一旦區分出來正常的用戶請求和網頁爬蟲請求,我們就可以通過一個過濾器帶策略對待正常請求和網頁爬蟲請求,從而這樣就可以有效降網頁爬蟲對網站的負載。
既然我們可以通過分析Request請求中的User-agent字段區分用戶器請求和爬蟲請求,下面的問題就是如果在請求到達目標之前攔截這些請求,然后使用不同的策略對待。攔截所有的請求一般有兩種做法,一種是重寫網站服務器軟件的入口方法,在該方法中實現傳遞用戶請求、攔截網頁爬蟲的功能。此種做法要求開發人員必須深入了解網站服務器軟件的內部結構,能夠找到服務器處理請求的入口方法。既然如此,對于一些非開源的服務器軟件,同樣也是無能為力。第二種做法是,實現一個Filter,讓該Filter過濾所有的請求,放行正常用戶請求,攔截網頁爬蟲請求。

上面的三個方法,第一個方法用來在網站關閉的時候提前做一些保存性的工作;第二個方法就是我們的用戶請求的總過濾器;第三個方法是服務器啟動時候可以提前進行的一些初始化工作。
這個方法就是處理用戶請求的總過濾器,下面就可以提供一套自定義的處理策略。當有請求到達服務器以后,服務器把請求全部轉送到這里,分兩種情況處理:
(1)普通的用戶請求。調用請求傳遞器的doFilter(request,response)方法,將請求傳遞給被請求的資源處理。
(2)網頁爬蟲請求。根據實際應用的需要,如果網站只是針對特定用戶的應用,不需要被搜索引擎檢索,可以直接拒絕請求,避免網頁爬蟲對網站的騷擾;如果網站只是認為搜索引擎對網站的訪問過于頻繁,并不希望封鎖搜索引擎的檢索,可以通過延時加載請求的方式處理請求,減輕爬蟲對網站的負擔。
實現代碼如下:


部署一個Filter應用分兩個步驟:
(1)編譯該Filter,將得到的字節碼文件DFCrawlerFilter.class放到%Tomcat_home%commonclasses目錄下。
(2)在Web.xml文件中,添加該Filter的部署配置代碼

網站反爬蟲是一個長期和艱苦的過程,對于一些內容驅動型的網站或者依靠PV賺取廣告費的網站來說,反爬蟲是一個尷尬的話題,一方面希望通過搜索引擎的檢索提高自己網站的知名度,獲得更大的用戶訪問量;令一方面又不希望過多的搜索檢索影響自己網站的性能;這種“又想馬兒不吃草,又想馬兒跑的快”的訴求,決定了反爬蟲策略的復雜和多變。實際應用中,還有其它的通過IP過濾反爬蟲、防火墻反爬蟲、請求頻率閥值設置反爬蟲等其它的解決方案。如果我們的網站是針對特定用戶使用的,例如:各種企業應用系統,本文提供的就是一個比較好的反爬蟲策略。
[1] 馬樹奇.Servlet編程指南[M].北京:電子工業出版社.2007.
[2] 馬偉鋒.爬蟲算法分析[M].北京:清華大學出版社.2008.
[3] Filer常規應用 [M].北京:高等教育出版社.2009.