1. 明確反反爬的主要思路
反反爬的主要思路就是:盡可能的去模擬瀏覽器,瀏覽器在如何操作,代碼中就如何去實現。瀏覽器先請求了地址url1,保留了cookie在本地,之后請求地址url2,帶上了之前的cookie,代碼中也可以這樣去實現。
很多時候,爬蟲中攜帶的headers字段,cookie字段,url參數,post的參數很多,不清楚哪些有用,哪些沒用的情況下,只能夠去嘗試,因為每個網站都是不相同的。當然在盲目嘗試之前,可以參考別人的思路,我們自己也應該有一套嘗試的流程。
2.通過headers字段來反爬
2.1 通過headers中的User-Agent字段來反爬
通過User-Agent字段反爬的話,只需要給他在請求之前添加User-Agent即可,更好的方式是使用User-Agent池來解決,我們可以考慮收集一堆User-Agent的方式,或者是隨機生成User-Agent
2.2 通過referer字段或者是其他字段來反爬
該字段的值都是上一級網站的url,檢測來源的合法性,可以知道通過某某url路徑過來的,那么就可以判斷來源是否合法,如果異常的話就可以做攔截請求等等,例如豆瓣電視劇中,通過referer字段來反爬,我們只需要添加上即可
2.3 通過cookie來反爬
如果目標網站不需要登錄 每次請求帶上前一次返回的cookie,比如requests模塊的session
如果目標網站需要登錄 准備多個賬號,通過一個程序獲取賬號對應的cookie,組成cookie池,其他程序使用這些cookie
3.通過js來反爬
3.1 通過js實現跳轉來反爬
在請求目標網站的時候,我們看到的似乎就請求了一個網站,然而實際上在成功請求目標網站之前,中間可能有通過js實現的跳轉,我們肉眼不可見,這個時候可以通過點擊perserve log按鈕實現觀察頁面跳轉情況
在這些請求中,如果請求數量很多,一般來講,只有那些response中帶cookie字段的請求是有用的,意味着通過這個請求,對方服務器有設置cookie到本地
3.2 通過js生成了請求參數
對應的需要分析js,可采用selenium去實現,會變得比較容易。
3.3 通過js實現了數據的加密
對應的需要分析js,可采用selenium去實現,會變得比較容易。
4. 通過驗證碼來反爬
通過打碼平台或者是機器學習的方法識別驗證碼,其中打碼平台廉價易用,更值得推薦。列舉常見的驗證碼的種類:
4.1 url地址不變,驗證碼不變
這是驗證碼里面非常簡單的一種類型,對應的只需要獲取驗證碼的地址,然后請求,通過打碼平台識別即可
4.2 url地址不變,驗證碼變化
這種驗證碼的類型是更加常見的一種類型,對於這種驗證碼,大家需要思考:
在登錄的過程中,假設我輸入的驗證碼是對的,對方服務器是如何判斷當前我輸入的驗證碼是顯示在我屏幕上的驗證碼,而不是其他的驗證碼呢?
在獲取網頁的時候,請求驗證碼,以及提交驗證碼的時候,對方服務器肯定通過了某種手段驗證我之前獲取的驗證碼和最后提交的驗證碼是同一個驗證碼,那這個手段是什么手段呢?
很明顯,就是通過cookie來實現的,所以對應的,在請求頁面,請求驗證碼,提交驗證碼的到時候需要保證cookie的一致性,對此可以使用requests.session來解決
5. 通過ip地址來反爬
同一個ip大量請求了對方服務器,有更大的可能性會被識別為爬蟲,對應的通過購買高質量的ip的方式,去維護一個ip池可以高效的解決。
6. 其他的反爬方式
6.1 通過自定義字體來反爬
利用自定義的字符編碼與字體文件的映射呈現文字的一種反爬措施,前端加載時,再利用自定義字體去進行解析。
下圖來自貓眼電影電腦版
解決思路:切換到手機版或者獲取到編碼方式
6.2 通過css來反爬
1、網站中,頁面正常顯示,但是源代碼中卻找不到的正確展示信息,對應的標簽中的信息是錯誤的,仔細可以看出開發者們在CSS樣式動了手腳。
2、css偏移反爬蟲,在反爬技術中也用得比較多的,都是為阻止爬蟲工程師采集頁面的數據,它的特點在於計算。源代碼中,它們的數據錯亂不堪,但是前端工程師則通過css排版,將源代碼中的數據顯示在頁面中,如果爬蟲程序想正確的得到頁面數據,則要計算出css數據排版規律。
下圖來自貓眼去哪兒電腦版
解決思路:計算css的偏移