1. 程式人生 > >對於反爬蟲的一些思考

對於反爬蟲的一些思考

1.反爬蟲宗旨
爬蟲與反爬蟲是一個迴圈往復、互相博弈的過程,並沒有一種一勞永逸的辦法杜絕所有爬蟲的爬取(更何況搜尋引擎也算是爬蟲的一種)。在應用反爬蟲的過程中,只能做到儘可能的識別爬蟲,儘可能的提高爬蟲爬取的成本。
對於某些個人的爬蟲來說,如果爬取網站的成本太大(如需多臺“肉雞”、需過長的時間識別反爬蟲策略或破解驗證碼等),個人爬蟲可能大部分都會考慮放棄,畢竟個人資源時間有限。而對於一些商業組織來說,可能就有充足的資源來針對我們應用破解反爬蟲策略,從而來爬取我們的網站。這類有能量的爬蟲我們可能很難防禦下來,但我們可以通過提高他的爬取成本(增加他的破解難度,增加開發時間,也算是增加了人力成本等)。當爬取成本過高時,那相對收益就會減小,當爬蟲的相對收益較小時,他也就不會浪費精力來爬取我們的網站。



2.反爬蟲措施
因爬蟲是具有可進行性的(進行的方式可能取決於反爬蟲策略或爬蟲工作者的績效)。故制定一個一勞永逸的完美的反爬蟲方案是不可行的。但我們可以一步步的增加反爬蟲措施,從最低階的爬蟲開始防禦,慢慢增加應對措施以應對更高階的爬蟲。
下面,從反爬蟲的級別及難易程度逐步提出一些反爬蟲措施:


2.1.Headers校驗
User-Agent、Referer或自定義頭部校驗等
雖然Headers非常好偽裝,校驗後的防範效果可能收效不大。但仍可能有一部分初學者或學校的學生,來爬取網站時並不知道要偽裝Headers,加上此校驗,好歹還是能防掉一些低階的爬蟲。
服務端可維護一個正常的User-Agent列表,對請求校驗其User-Agent是否在列表中,對非正常的請求拒絕服務或彈出驗證碼等措施。
要注意的是User-Agent校驗要注意將搜尋引擎加入白名單,例如GoogleBot等。如將搜尋引擎的抓取遮蔽可以影響公司官網在搜尋引擎中的顯示。搜尋引擎的名單可參考其他網站的robots.txt.
如淘寶網:

 
圖2-1 淘寶網robots.txt檔案
實現難度:簡單,但需要持續的維護User-Agent列表
負面影響:對於一些未收集到的搜尋引擎爬蟲,可能會導致B2C在其搜尋引擎中的顯示排名。



2.2.提供robots.txt
由搜尋引擎發起的“君子約定”,一般提供在網站根目錄下,由一行User-Agent開始,後面跟多行Disallow標明不希望爬蟲爬取的路徑。搜尋引擎發起這項約定就是為了保證我們的網頁能展現在搜尋引擎結果的同時,又避免爬取我們應用不希望開放的地址。
robots.txt檔案格式參考 “圖2-1”,User-Agent標明針對的客戶端型別,Allow標明允許爬取的地址,Disallow標明不希望爬取的地址。
也可參考同行官網的robots.txt:
東方航空:http://www.ceair.com/robots.txt
南方航空:http://www.csair.com/robots.txt
中國航空:http://www.airchina.com.cn/robots.txt
同時,可以在robots中提供sitemap,來指導搜尋引擎去爬取頁面,給搜尋引擎指明瞭爬取路徑,也可以避免它自己去識別網站可爬取頁面時,誤爬我們不希望開放的地址。
如國航robots.txt中: sitemap: http://www.airchina.com.cn/sitemap.xml

 
圖2-2 國航官網sitemap檔案
sitemap格式可參考:http://lzj0470.iteye.com/blog/905962
爬蟲開發思考的第一個問題就是是否要遵守“robots協議”,雖然可能一些個人爬蟲不瞭解或者不會遵守該約定。但是既然存在這個協議,那應該大部分還是會遵守的。加上的話,最少能避免搜尋引擎來爬取資訊時,對我們的航班動態進行太多查詢,導致查定比升高。
實現難度:簡單
負面影響:無


2.3.釣魚連結
爬蟲爬取頁面時,會篩選出頁面中所有的URL地址去訪問,特別是一些沒有明確目的的爬蟲,更是收集到的URL都會陸續的去請求以獲取更多的資料。 
這樣,我們就可以通過在頁面上賣店,放置一些釣魚連結,正常使用者不會去訪問,只有爬蟲爬取才會訪問,一訪問就記錄下這個客戶端(IP或使用者或session),該客戶端的每次訪問都採取限制措施(如驗證碼,或者單位時間內拒絕請求)。 
如在頁面設定a標籤,<a href=”xxx.com/spider”> ,通過CSS樣式將該元素在頁面上隱藏。正常使用者就看不到了,而伺服器端只要檢測到這個地址的請求,就可以將該客戶端記錄為爬蟲。
實現難度:簡單
負面影響:存在誤傷搜素引擎的可能


2.4.前端JS校驗
在提交請求前,通過前端JS生成一段校驗碼(hash或任何方式都行,主要目的是逼迫爬蟲去執行JS),在後端可校驗校驗碼是否正確,來判斷是否爬蟲。此舉不在於完全過濾爬蟲,非必須考慮JS生成校驗碼的邏輯被破解,爬蟲可通過模擬瀏覽器或引入JS引擎執行JS,但這樣已經提高了爬蟲的成本。直接的URL訪問,一次爬取時間可能也就幾十到幾百毫秒,但改成模擬瀏覽器渲染,時間就會增加到好幾秒。且模擬瀏覽器更耗資源,也不足以支援單純URL訪問的併發數。

2.5.敏感資料處理
對於航班價格、座位數等敏感資料,可進行資料處理,讓爬蟲無法直接獲取真正的數值。
如將價格加工成圖片返回前端,前端直接顯示圖片,爬蟲想要爬取,就需要進行影象識別,會大幅增加爬蟲成本,降低其爬取效率。
或者自定義字型,調整字型中數字的順序,介面返回的數字並不是最終顯示的數字。如下圖所示,為參考去哪兒網反爬時發現的其字型反爬技巧:
 
同時,為了防止爬蟲識別出此策略,可在後端維護一個字型池,通過定時任務定時生成字型變化其順序,然後服務端的數字做一下轉換,那爬蟲在網頁原始碼爬取到的值就是虛假的值。
實現難度:較難
負面影響:字型實現方式需要考慮相容性問題,如果在某些不相容的環境下顯示的錯誤的數值,會給正常使用者以誤導。