公欲善其事,必先利其器。
前幾天同學問我,獲取一個網站的資料是通過api調用好還是通過網絡爬蟲好,我說如果api可以滿足需求那可以直接調api因爲api是網站給你暴露的接口,客服端開發起來方便,並且返回的數據好解析,只要按他的規則來就應該沒什麼大的問題,不要考慮策略去獲取最新的資料,可有個很大的問題就是通過api的調用完全受api服務器端限制,就和在中國上網一樣,說哪個網站不上你上,那你通過合法的流程肯定是上不了的。
網絡爬蟲有個很大的好處,不太受服務器端的限制,你可以通過許多策略去繞過它,他們一般有以下可以做限制的:
1.通過ip限制。
2.通過cookie限制
3.通過加密算法加密請求的url
4.通過你請求的header限制
5.通過回答問題或驗證碼限制
6.歡迎補充
其中除了出現驗證碼,其他都可以破解,那我就簡單介紹下我的策略吧!
對於單位時間訪問過多,服務器端可能會給你的ip直接封死,有兩個方法可以繞過這個規則,第一,給你請求的http設置代理,現在的代理ip比較多,不過要慢慢找,很多都不能使用。第二個方法:大部分人用的是adsl上網,那adsl有一個很好的優點就是ip不是固定的,所以重啓下路由就可以換個新的ip了,不過要注意不要出現重啓後還出現之前用的ip了!所以我們要給ip簡單過濾下。
出現通過cookie限制的話,那你程序就一步一步的請求,最好不要跳步,如果用httpclient寫的爬蟲,那設置當請求時自動在請求體中加上cookie。
通過加密算法加密請求的url,那必須知道它的加密算法寫在哪,比如說sina之前的郵箱加密算法寫在js裏面,並且比較複雜,那可以用java執行加密js生成結果,所以也不一定要搞懂它是怎麼加密的,除非真正沒其他辦法,那隻能看懂它的加密算法,再自己實現。
通過你請求的header限制是比較簡單的限制,就是判斷你請求的header是否符合要求,UA是否有,是否符合要求,host是否有......所以只要你請求時加上必要的header就行。
通過回答問題限制那就先好好分析它的問題,因爲題庫總是有限的,有點的題目本來就很簡單,比如兩數相加相減什麼的,那可以用程序自動分析,自動執行。
最後有個最難的就是出現圖片的一切驗證,反正我是破解不了,那怎麼辦?一般出現驗證碼肯定影響用戶體驗,所以被抓去的網站肯定也不是很喜歡,但爲了防止一些非法請求還必須加上,所以出現驗證碼的大部分都是有原因的,哈哈...有點誇張,所以我們按正規的流程走是不會出現驗證碼的,所以要把爬蟲寫得像人請求一樣,那你就算成功了一大半了。
往往寫網絡爬蟲要把幾個策略一起使用,一點一點試服務器端的規則,繞過規則就是天堂。