劉慶杰 孫旭光 王小英
防災(zāi)科技學(xué)院信息工程系 河北 065201
隨著搜索引擎技術(shù)的流行,現(xiàn)在國(guó)內(nèi)做搜索引擎的網(wǎng)絡(luò)公司超過(guò)50家,帶來(lái)的弊端就是,搜索引擎釋放出來(lái)的網(wǎng)絡(luò)爬蟲(chóng)大量的占用互聯(lián)網(wǎng)的帶寬。由于這些搜索引擎廠商投入差別巨大、技術(shù)參差不齊,加上監(jiān)管空白,一旦一個(gè)中型規(guī)模的網(wǎng)站被一個(gè)技術(shù)糟糕的搜索引擎爬蟲(chóng)的抓取數(shù)據(jù),很可能在短時(shí)間內(nèi)導(dǎo)致網(wǎng)站訪問(wèn)速度緩慢,甚至完全無(wú)法訪問(wèn)。另外,還有相當(dāng)多的網(wǎng)頁(yè)爬蟲(chóng)目的是盜取內(nèi)容,然后使用自己的發(fā)帖機(jī)器人將內(nèi)容自動(dòng)發(fā)表到自己的網(wǎng)站,制造自己網(wǎng)站的虛假PV。所以說(shuō),網(wǎng)絡(luò)爬蟲(chóng)不僅影響網(wǎng)站的性能,而且很可能偷盜網(wǎng)站內(nèi)容,侵犯知識(shí)產(chǎn)權(quán),因此反網(wǎng)頁(yè)爬蟲(chóng)是所有網(wǎng)站值得重視和長(zhǎng)期探索的問(wèn)題。
我們知道,對(duì)于網(wǎng)站來(lái)說(shuō),正常的用戶請(qǐng)求是通過(guò)瀏覽器發(fā)送到服務(wù)器的,用戶請(qǐng)求的Request中會(huì)攜帶大量用戶端系統(tǒng)信息,其中就包括用戶的瀏覽器廠商和版本字符串,存儲(chǔ)在Request請(qǐng)求的Header的User-agent字段。而網(wǎng)絡(luò)爬蟲(chóng)一般都是搜索引擎廠商開(kāi)發(fā)出來(lái)的專門(mén)的工具軟件,通過(guò)網(wǎng)絡(luò)爬蟲(chóng)發(fā)送給服務(wù)器的請(qǐng)求中,User-agent字段是沒(méi)有瀏覽器信息的,因此我們就可以通過(guò)記錄和分析User-Agent信息來(lái)區(qū)分正常的用戶請(qǐng)求和網(wǎng)頁(yè)爬蟲(chóng)請(qǐng)求。一旦區(qū)分出來(lái)正常的用戶請(qǐng)求和網(wǎng)頁(yè)爬蟲(chóng)請(qǐng)求,我們就可以通過(guò)一個(gè)過(guò)濾器帶策略對(duì)待正常請(qǐng)求和網(wǎng)頁(yè)爬蟲(chóng)請(qǐng)求,從而這樣就可以有效降網(wǎng)頁(yè)爬蟲(chóng)對(duì)網(wǎng)站的負(fù)載。
既然我們可以通過(guò)分析Request請(qǐng)求中的User-agent字段區(qū)分用戶器請(qǐng)求和爬蟲(chóng)請(qǐng)求,下面的問(wèn)題就是如果在請(qǐng)求到達(dá)目標(biāo)之前攔截這些請(qǐng)求,然后使用不同的策略對(duì)待。攔截所有的請(qǐng)求一般有兩種做法,一種是重寫(xiě)網(wǎng)站服務(wù)器軟件的入口方法,在該方法中實(shí)現(xiàn)傳遞用戶請(qǐng)求、攔截網(wǎng)頁(yè)爬蟲(chóng)的功能。此種做法要求開(kāi)發(fā)人員必須深入了解網(wǎng)站服務(wù)器軟件的內(nèi)部結(jié)構(gòu),能夠找到服務(wù)器處理請(qǐng)求的入口方法。既然如此,對(duì)于一些非開(kāi)源的服務(wù)器軟件,同樣也是無(wú)能為力。第二種做法是,實(shí)現(xiàn)一個(gè)Filter,讓該Filter過(guò)濾所有的請(qǐng)求,放行正常用戶請(qǐng)求,攔截網(wǎng)頁(yè)爬蟲(chóng)請(qǐng)求。
上面的三個(gè)方法,第一個(gè)方法用來(lái)在網(wǎng)站關(guān)閉的時(shí)候提前做一些保存性的工作;第二個(gè)方法就是我們的用戶請(qǐng)求的總過(guò)濾器;第三個(gè)方法是服務(wù)器啟動(dòng)時(shí)候可以提前進(jìn)行的一些初始化工作。
這個(gè)方法就是處理用戶請(qǐng)求的總過(guò)濾器,下面就可以提供一套自定義的處理策略。當(dāng)有請(qǐng)求到達(dá)服務(wù)器以后,服務(wù)器把請(qǐng)求全部轉(zhuǎn)送到這里,分兩種情況處理:
(1)普通的用戶請(qǐng)求。調(diào)用請(qǐng)求傳遞器的doFilter(request,response)方法,將請(qǐng)求傳遞給被請(qǐng)求的資源處理。
(2)網(wǎng)頁(yè)爬蟲(chóng)請(qǐng)求。根據(jù)實(shí)際應(yīng)用的需要,如果網(wǎng)站只是針對(duì)特定用戶的應(yīng)用,不需要被搜索引擎檢索,可以直接拒絕請(qǐng)求,避免網(wǎng)頁(yè)爬蟲(chóng)對(duì)網(wǎng)站的騷擾;如果網(wǎng)站只是認(rèn)為搜索引擎對(duì)網(wǎng)站的訪問(wèn)過(guò)于頻繁,并不希望封鎖搜索引擎的檢索,可以通過(guò)延時(shí)加載請(qǐng)求的方式處理請(qǐng)求,減輕爬蟲(chóng)對(duì)網(wǎng)站的負(fù)擔(dān)。
實(shí)現(xiàn)代碼如下:
部署一個(gè)Filter應(yīng)用分兩個(gè)步驟:
(1)編譯該Filter,將得到的字節(jié)碼文件DFCrawlerFilter.class放到%Tomcat_home%commonclasses目錄下。
(2)在Web.xml文件中,添加該Filter的部署配置代碼
網(wǎng)站反爬蟲(chóng)是一個(gè)長(zhǎng)期和艱苦的過(guò)程,對(duì)于一些內(nèi)容驅(qū)動(dòng)型的網(wǎng)站或者依靠PV賺取廣告費(fèi)的網(wǎng)站來(lái)說(shuō),反爬蟲(chóng)是一個(gè)尷尬的話題,一方面希望通過(guò)搜索引擎的檢索提高自己網(wǎng)站的知名度,獲得更大的用戶訪問(wèn)量;令一方面又不希望過(guò)多的搜索檢索影響自己網(wǎng)站的性能;這種“又想馬兒不吃草,又想馬兒跑的快”的訴求,決定了反爬蟲(chóng)策略的復(fù)雜和多變。實(shí)際應(yīng)用中,還有其它的通過(guò)IP過(guò)濾反爬蟲(chóng)、防火墻反爬蟲(chóng)、請(qǐng)求頻率閥值設(shè)置反爬蟲(chóng)等其它的解決方案。如果我們的網(wǎng)站是針對(duì)特定用戶使用的,例如:各種企業(yè)應(yīng)用系統(tǒng),本文提供的就是一個(gè)比較好的反爬蟲(chóng)策略。
[1] 馬樹(shù)奇.Servlet編程指南[M].北京:電子工業(yè)出版社.2007.
[2] 馬偉鋒.爬蟲(chóng)算法分析[M].北京:清華大學(xué)出版社.2008.
[3] Filer常規(guī)應(yīng)用 [M].北京:高等教育出版社.2009.