常見的反爬蟲的方式

1、JS寫的cookie

  當我們要寫爬蟲爬某個網頁裏面的數據的時候,無非就是發開網頁,然後查看源代碼,如果html裏面有我們要的數據的話,那樣也就簡單了,直接就可以用requests請求網址得到網頁源碼,然後解析提取一下我們要的內容就可以了

  requests得到的網頁是一對JS,跟瀏覽器打開看到的網頁源代碼是完全不一樣的,當遇到這種情況的時候,往往就是瀏覽器通過運行這段JS生成了一個或者多個cookie,之後再帶着這個cookie去做二次請求

  其實你在瀏覽器中可以看到這個過程,首先就是把瀏覽器中保存的cookie刪掉,然後刷新網頁,再次進行訪問,我們就可以看到在歷史的network請求記錄中看到第一次訪問返回的是521,內容是一段JS代碼;當再次進行訪問的時候就可以得到真實的頁面了。分析這兩次的請求,發現第二次請求中多帶了一個cookie,而這個cookie並不是第一次請求服務器發送過去的,而是利用JS進行生成的 

    解決方法:

      研究那一段JS,找到它生成cookie的算法,然後就可以利用python代碼進行解決了

 

2、JS加密ajax請求參數

  當要爬取某個網頁的數據的時候,發現網頁源代碼裏面並沒有我們要的真實的數據,那這時候數據往往是ajax請求得到的。這個時候就可以通過XHR裏面的response進行分析,一般那裏面的數據都是我們想要的

  當然這個URL裏面會包含很多參數,其中一個可能看上去不是很起眼,但是這個字符串就可能是JS通過一個加密算法得到的,服務器也會通過同樣的算法進行驗證,驗證通過了才認爲你這個是從瀏覽器發送來的請求。我們可以通過將那個URL拷貝到地址欄中,把那個參數隨便改動一下,訪問看一下,是不是我們想要的正確的結果,以此來檢驗它是否是加密參數

    解決方法

      對於這樣的加密參數,對策就是通過debug JS來找到對應的JS加密算法。其中最關鍵的就是在瀏覽器中設置XHR/fetch Breakpoints

 

3、JS反調試(反debug)

  前面我們都會用到chrome中的F12去查看網頁的加載過程,當這種方法用多了網站就加了反調試的策略,只要我們打開F12,就會暫停在一個‘debugger’的代碼行中,無論怎麼樣都跳不出去,不管我們點擊多少次繼續運行,他都一直在這裏面,每次都會多出一個VMxx的標籤,觀察‘Call Stack’發現好像陷入了一個函數的遞歸調用中。這個‘debugger’讓我們無法調試JS。但是隻要關閉了F12窗口,網頁就可以正常加載了

  解決這種JS反調試的方法我們稱之爲'反-反調試',其策略就是通過‘Call Stack’找到把我們帶入死循環的函數,並且重新定義它

  這樣的函數幾乎沒有任何其他的功能,只是給我們設置的一個陷阱罷了。我們可以把這個函數在console中重新定義一下,比如將其定義成空函數,這樣在運行的時候它就會什麼都不幹了,也就不會把我們帶到無限遞歸的場景中去了,在這個函數調用的地方打個Breakpoint。因爲我們已經在陷阱中了, 所以要刷新頁面,JS的運行應該停止在設置的斷點處,此時該函數還沒有運行,我們就已經在console中重新定義完了,所以繼續運行就會跳過該陷阱

 

4、JS發送鼠標點擊事件

  有些網站,你從瀏覽器可以打開正常的頁面,而在requests裏面卻被要求輸入驗證碼或者是重定向到其他的頁面。

  JS會響應鏈接被點擊的鏈接。服務器收到被點擊鏈接的請求,會看看之前是不是已經通過某個文件把信息發送過來了,如果發過了就認爲是合法的瀏覽器訪問,給出正常的網頁內容

  因爲requests沒有鼠標事件響應就沒有訪問文件的過程,就直接訪問鏈接了,服務器就拒絕服務

  當明白了這個過程以後,我們幾乎可以不研究JS中的內容(JS也有可能對被點擊鏈接進行修改)就可以繞過反爬策略了,無非就是在訪問鏈接以前先訪問一下那個文件就可以了。關鍵是要修改那個文件後面的參數,把這些參數都帶上就OK了

 

 

 

總結:

  爬蟲和網站是相生相剋的,當爬蟲知道了反爬策略就可以做成反-反爬策略;網站知道了爬蟲的反-反爬策略就可以做一個反-反-反爬策略,正可謂是道高一尺魔高一丈,兩者的鬥爭是永遠不會結束的

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章