引言
網站服務器會消耗很多的資源用於給爬蟲提供服務,所以一些網站將反爬蟲作為網站優化的手段之一;
另外,一些以內容提供為主的網站,會利用反爬蟲技術防止網站內容被盜用。
反爬蟲技術
以下是總結的一些反爬蟲的手段:
通過爬蟲的特有行為模式來發現爬蟲:(鏈接並發度,訪問頻率,訪問數據的范圍)
- 用netstat檢查80端口的連接:
sh netstat -nt | grep youhostip:80 | awk '{print $5}' | awk -F":" '{print $1}'| sort | uniq -c | sort -r -n
這行shell可以按照80端口連接數量對來源IP進行排序,這樣可以直觀的判斷出來網頁爬蟲。一般來說爬蟲的並發連接非常高。 直接封鎖爬蟲所在的C網段地址。這是因為一般爬蟲都是運行在托管機房里面,可能在一個C段里面的多台服務器上面都有爬蟲,而這個C段不可能是用戶寬帶上網,封鎖C段可以很大程度上解決問題。 - 頻率限制,每分鍾超過N次訪問的IP封掉,如3小時訪問量超過50次時,彈出驗證框,驗證內容輸入錯誤,則計入黑名單
- 爬蟲爬取網頁的頻率都是比較固定的,不像人去訪問網頁,中間的間隔時間比較無規則,
所以我們可以給每個IP地址建立一個時間窗口,記錄IP地址最近12次訪問時間,每記錄一次就滑動一次窗口,比較最近訪問時間和當前時間,
如果間隔時間很長判斷不是爬蟲,清除時間窗口,如果間隔不長,就回溯計算指定時間段的訪問頻率,如果訪問頻率超過閥值,就轉向驗證碼頁面讓用戶填寫驗證碼 - 爬蟲一般不抓取css、js等資源文件
- 如果是垂直爬蟲,往往訪問數據具有明顯的目的性,如果返現某些IP訪問某些數據超過正常頻次,且這些這些IP並沒有訪問其他任何資源,則可以斷定是爬蟲
- 搞個計數器,把特定ip一天內的總次數和每秒內的頻率記錄下來,達到實時攔截的目的(這個類似淘寶的TMD,用分布式緩存計數,超出規則,要么直接拒絕,要么跳到輸入驗證碼的頁面)
- 把apache或nginx日志分析和js埋點對比來分析,爬蟲請求在無法模擬瀏覽器請求的時候,無法執行js代碼,頁面沒有埋點,但是這個請求,會在web日志中留下,js有小問題,就是用戶請求的時候,如果瀏覽器有緩存,實際上沒有請求服務器端,但是js確埋了一個點,對比分析,效果會好很多
誘捕
比如用一些人類看不到的鏈接,讓爬蟲進去,然后封禁對應ip。
使爬蟲無法識別內容
是把鏈接變成其他標簽,用js監聽點擊、鍵盤等事件,然后跳轉,爬蟲不具備這樣的交互能力,就找不到了。或者全站用ajax,反seo。或者把部分文字變成圖片,這是百度反360爬蟲的策略,把能破壞語義的高頻文字(比如的、是、不等)替換成圖片,不影響人類閱讀。
利用http請求頭部信息
- useragent=JavaClient1.6(HttpClient的爬蟲)
- 同一個IP有使用過多個useragent
- 請求是否含有refer:refer表示該請求從哪里跳轉而來,很多爬蟲沒有這個字段
- 利用cookie,每次請求重新種一個,下次請求驗證這個cookie;或者定時更改cookie
為了避免誤傷某些搜索引擎的爬蟲,例如將百度等爬蟲設置在白名單中,通過hostname檢測請求IP是否屬於百度
反反爬蟲
有矛就有盾:
- ip次數限制:每個請求都用代理,還用不同的代理。
- 復雜的js交互:用code開瀏覽器,模擬各種鼠標鍵盤事件。
- 驗證碼:OCR或者用在線人工打碼的服務。
- token: 買email地址/買token/使用用戶的toke
