最近有很多朋友和我討論python爬蟲遇到的反爬措施及解決辦法,今天我就給大家分享一下自己在爬蟲過程中遇到的坑及解決思路,希望對大家有所幫助。
看不見的反爬措施
一是加header頭部信息:
什么是header頭?
以火狐瀏覽器為例,右鍵—查看元素—進(jìn)入網(wǎng)絡(luò)界面,然后輸入https://www.baidu.com進(jìn)入百度主頁:
紅框內(nèi)的部分就是該次請求的header頭,服務(wù)器可以根據(jù)header頭判斷該次請求是由哪種瀏覽器(User-Agent)發(fā)起、訪問的目標(biāo)鏈接是從哪個網(wǎng)頁跳轉(zhuǎn)過來的(Referer)以及服務(wù)器地址(Host)。
1.加User-Agent值:
如果不加header頭,部分網(wǎng)站服務(wù)器判斷不到用戶的訪問來源,所以會返回一個404錯誤來告知你是一個爬蟲,拒絕訪問,解決辦法如下:
這樣服務(wù)器就會把用戶當(dāng)做瀏覽器了。建議每次爬蟲都把User-Agnet頭加上,起碼是對人家網(wǎng)站的尊重
2.加Referer值
這類反爬網(wǎng)站也很常見,例如美團(tuán),僅僅加User-Agnet還是返回錯誤信息,這時就要把Referer值也加到頭部信息中:
這樣就會返回正常網(wǎng)頁了。
3.加Host值
根據(jù)同源地址判斷用戶是否為爬蟲,解決辦法為:
4.加Accept值
之前遇到過這種網(wǎng)站,我加了一圈header頭部信息才成功,最后發(fā)現(xiàn)是需要加Accept值,這類反爬措施的解決辦法為:
關(guān)于header頭的反爬,建議在加上User-Agent失敗之后,就把所有頭部信息加上,最后用排除法選出到底是哪個值。
二是限制IP的請求數(shù)量:
這種就更常見了,大部分網(wǎng)站都有此類反爬措施,也就是說網(wǎng)站服務(wù)器會根據(jù)某個ip在特定時間內(nèi)的訪問頻率來判斷是否為爬蟲,然后把你把你拉進(jìn)“黑名單”,素質(zhì)好的給你返回403或者出來個驗證碼,素質(zhì)不好的會給你返回兩句臟話。此種情況有兩種解決辦法:
①降低爬蟲請求速率,但是會降低效率;
②添加代理ip,代理ip又分為付費的和不要錢的,前者比較穩(wěn)定,后者經(jīng)常斷線。
添加格式為:
三是Ajax動態(tài)請求加載:
這類一般是動態(tài)網(wǎng)頁,無法直接找到數(shù)據(jù)接口,以某易新聞網(wǎng)站為例:
我想爬取該網(wǎng)頁內(nèi)的新聞圖片,發(fā)現(xiàn)它的網(wǎng)頁url一直不變,但是下拉網(wǎng)頁的時候會一直加載圖片,那么我們該怎么辦呢?
首先按照開頭方式打開流量分析工具
點擊左上角“垃圾桶”圖標(biāo)清空緩存,然后下拉新聞網(wǎng)頁:
會出現(xiàn)一大堆東西,但是不用慌,我們可以根據(jù)類型去尋找,一般圖片信息肯定實在html、js或json格式的文件中,一個一個點進(jìn)去看看,很快就找到了結(jié)果:
結(jié)果中把callback去掉之后就是個json文件,它的url為:
紅線處為變量,02代表第2頁,這樣就找到圖片接口啦。
看的見的反扒措施
一是登錄才有數(shù)據(jù),比如某查查:
這種一般有三種解決辦法,一是requests模擬登錄,但是會有參數(shù)加密的問題和驗證碼的問題,有點難;二是selenium模擬登錄,要解決驗證碼的問題;三是手動登錄后獲取cookie,在requests中加入cookie,這種方法比較簡單,但是受cookie有效期的限制,要經(jīng)常更換cookie。
關(guān)于驗證碼的問題,我很頭大,因為驗證碼實在是種類太多了,而且還很變態(tài),例如下圖:
我用眼都很難瞅出來,程序就更難說了,索性直接用打碼網(wǎng)站,價格不貴,準(zhǔn)確率又低。
二是限制網(wǎng)頁返回數(shù)據(jù)條數(shù):
例如微博評論,最多只能返回50頁的評論數(shù)據(jù),這種反扒措施暫時沒有好的解決辦法,除非能找到特殊接口。
三是多次驗證:
例如12306網(wǎng)站,用requests實現(xiàn)自動搶票時,瀏覽器會和服務(wù)器進(jìn)行多次交互驗證,有的驗證雖然不返回任何數(shù)據(jù),但是還必須要有,否則下一個url的請求就會出錯。
四是網(wǎng)站數(shù)據(jù)加密:
也就是說網(wǎng)站服務(wù)器返回的數(shù)據(jù)經(jīng)過某種加密算法進(jìn)行加密,這個時候你就要學(xué)習(xí)前端知識了,因為加密方式一般都隱藏在JavaScript代碼中,如果你學(xué)會這一技能,基本可以應(yīng)聘爬蟲工程師的崗位了。
五是APP數(shù)據(jù):
沒有網(wǎng)頁數(shù)據(jù),例如二手交易平臺某魚
爬這類數(shù)據(jù)一般有兩種方法:一是邊爬邊處理,即用appium模擬點擊滑動手機界面,然后用mitmdump在后端監(jiān)測并保存數(shù)據(jù),這種方法比較簡單;二是做逆向分析,這個過程是很難的,目前這部分知識小編也正在學(xué)習(xí)中,希望有機會能和大家一起交流。
以上都是我在爬蟲實踐中遇到的一些反爬措施,希望能對大家的爬蟲學(xué)習(xí)之路起到拋磚引玉的作用。
精彩回顧: