這些反爬技術,你能搞定多少?(對應看看你的爬蟲技術修煉到哪個階段了!)

2021-09-26 14:00:02
👉在爬蟲技術氾濫的今天,有不少小夥伴或是因為興趣,或是因為工作所需,決定去學習爬蟲,一入爬蟲坑~👈

《一篇萬字博文帶你入坑爬蟲這條不歸路 【萬字圖文】》

💩<-🐷但是,從最近我的技術交流群內粉絲們交流的一些問題中,我發現了一個很嚴重很嚴重的大問題——他們 只是單純想爬,卻連一些最基礎的反爬技術都不知曉。🐷->💩

《兩萬字博文教你python爬蟲requests庫【詳解篇】》
《萬字博文教你python爬蟲Beautiful Soup庫【詳解篇】》
《萬字博文教你python爬蟲XPath庫【詳解篇】》

🎈俗話說的好——知己知彼方能百戰百勝。搞爬蟲也一樣, 我們不僅要知道怎麼爬!還要知道別人怎麼防止我們爬!這樣我們才能做到——當爬不到想要的資料的時候,從容面對,知道為什麼會爬不到,然後去解決它!🎈

《萬字博文教你爬蟲必備->Selenium【詳解篇】(初篇)》

       👇
👉🚔直接跳到末尾🚔👈 ——>領取專屬粉絲福利💖
       ☝️


下面,就帶領同學們走入反爬蟲的世界,深入理解其概念以及 常見的反爬蟲措施&對應的解決方法! 💨💨💨

在這裡插入圖片描述

⭐️0.前言

💥(1)反爬蟲的原因有三:

  1. 爬蟲佔總PV較高(PV指頁面存取的次數,每開啟或重新整理一次頁面,算一個PV);
  2. 資料被批次抓走,會使資料擁有者喪失市場競爭力;
  3. 法律的灰色地帶。
    在這裡插入圖片描述

💦(2)關於反爬蟲必須瞭解的一些重要概念:

  1. 爬蟲:網路爬蟲也叫網路蜘蛛,它特指一類自動批次下載網路資源的程式,這是一個比較口語化的定義。更加專業和全面對的定義是:網路爬蟲是偽裝成使用者端與伺服器端進行資料互動的程式。關鍵在於批次!
  2. 反爬蟲:使用任何技術手段,阻止別人批次獲取自己網站資訊的一種方式,關鍵也在於批次。
  3. 誤傷:在反爬蟲過程中,錯誤的將普通使用者識別為爬蟲,誤傷率高的反爬蟲策略,效果再好也不能用。(傷敵一千,自損八百的招式可不能用!)
  4. 攔截:成功阻止爬蟲存取,這裡會有攔截率的概念,通常來說,攔截率高的反爬蟲策略,誤傷的可能性就越高,因此需要權衡利與弊。
  5. 資源:機器成本與人力成本的總和。(做啥事都要考慮成本,畢竟——成年人的世界不容易!)

成年人的世界不容易啊!

💢(3)重點——反爬蟲三大方向:

本文的重點——反爬蟲,反爬蟲,它究竟有哪些方向呢?

  1. 基於身份識別進行反爬;
  2. 基於爬蟲行為進行反爬;
  3. 基於資料加密進行反爬。

萌萌噠的狗子!

突然蹦出來發爬蟲的三大方向,同學們是不是感覺腦瓜子嗡嗡的,不要急不要急哈!老師下面就帶大家深入瞭解一下它們!(PS:拿出你們的小本本好好聽課哦!)

在這裡插入圖片描述

💀第一個方向:基於身份識別進行反爬

關於反爬蟲三大方向放在第一位的是——基於身份識別進行反爬。這是我們在進行爬蟲的時候所遇到的第一層障礙,
同時也是最容易解決的一個哦!如果你能熟練攻破此類問題,那麼你就是個合格的入門級爬蟲工程師啦!!!

☀️(1)通過headers欄位設定反爬:

  1. 通過headers中的user-agent欄位來反爬
    🔒反爬原理:爬蟲預設情況下沒有user-agent欄位,而是使用模組預設設定。我們在爬取某網站時就會被直接識破是爬蟲而不是使用者操作!
    🔑解決方法:請求之前新增user-agent即可,更好的方式是使用user-agent池來解決(收集一堆的user-agent的方式,或者是隨機生成user-agent)!

  2. 通過referer欄位或者是其他欄位來反爬
    🔒反爬原理:爬蟲預設情況下不會帶上referer欄位,伺服器通過判斷請求發起的源頭,以此判斷請求是否合法。
    🔑 解決方法:新增referer欄位!

  3. 通過cookie來反爬
    🔒反爬原理:通過檢查cookies來檢視發起請求使用者是否具備相應許可權,以此來進行反爬。
    🔑解決方案:進行模擬登入,成功獲取cookies之後在進行資料爬取!

🌀(2)通過請求引數設定反爬:

  1. 通過從html靜態檔案中獲取請求資料
    🔒反爬原理:通過增加獲取請求引數的難度進行反爬。
    🔑解決方法:仔細分析抓包得到的每一個包,搞清楚之間的聯絡!

  2. 通過傳送請求獲取請求資料
    🔒反爬原理:通過增加獲取請求引數的難度進行反爬。
    🔑解決方法:仔細分析抓包得到的每一個包,搞清楚之間的聯絡,搞清楚請求引數的來源!

  3. 通過js生成請求引數(JS滲透實戰:百度翻譯實戰;咪咕登入實戰;獲取網易雲評論實戰
    🔒反爬原理:js生成了請求引數。
    🔑解決方法:分析js,觀察加密實現的過程,通過js2py獲取js的執行結果,或者使用selenium來實現!

  4. 通過驗證碼來反爬(三大常用驗證碼:解決圖形驗證碼;解決點觸驗證碼;解決滾軸驗證碼
    🔒反爬原理:對方伺服器通過彈出驗證碼強制檢驗使用者瀏覽行為。
    🔑解決方法:打碼平臺或者是機器學習的方法識別驗證碼,其中打碼平臺(比如:超級鷹…)廉價易用,更值得推薦!

🎃第二個方向:基於爬蟲行為的反爬

關於反爬蟲三大方向放在第二位的是——基於爬蟲行為的反爬。這是我們在進行爬蟲的時候所遇到的第二層障礙,
需要使用到爬蟲進階的操作進行解決!如果你能熟練攻破此類問題,那麼你就是個合格的中級級爬蟲工程師啦!!!

🎅(1)根據爬取行為進行反爬,會在爬取源頭——請求上做分析:

  1. 基於請求頻率或總請求數量
    🔒反爬原理:正常瀏覽器請求網站,速度不會太快,同一個IP/賬號大量請求了對方伺服器,有更大可能性會被識別為爬蟲。
    🔑解決方法:對應的通過購買高品質的IP的方式能夠解決問題/IP代理池!

  2. 通過同一IP/賬號請求之間的間隔進行反爬
    🔒反爬原理:正常人操作瀏覽器瀏覽網站,請求之間的時間間隔是隨機的,而爬蟲前後兩個請求之間時間間隔通常比較固定同時時間間隔比較短,因此可以用來做反爬。
    🔑解決方法:請求之間進行隨機等待,模擬真實使用者操作,在新增時間間隔之後,為了能夠高速獲取資料,儘量使用IP代理池,如果是賬號,則將賬號請求之間設定隨機休眠!

  3. 通過對請求IP/賬號每天請求次數設定值進行反爬
    🔒反爬原理:正常的瀏覽器行為,其一天的請求次數是有限的,通常超過夠一個值,伺服器就會拒絕響應。
    🔑解決方法:對應的通過購買高品質的IP的方法/多賬號,同時設定請求間隨機休眠!

🎉(2)根據爬取行為進行反爬,會在爬取過程——步驟上做分析:

  1. 通過js實現跳轉來反爬
    🔒反爬原理:js實現頁面跳轉,無法在原始碼中獲取下一頁url。
    🔑解決方法:多次抓包獲取多條url,分析規律!

  2. 通過蜜罐(陷阱)獲取爬蟲IP(或者代理IP),進行反爬
    🔒 反爬原理:在爬蟲獲取連結請求的過程中,爬蟲會根據正則,xpath,css等方式進行後續連結的提取,此時伺服器端可以設定一個陷阱url,會被提取規則獲取,但是正常使用者無法獲取,這樣就能有效的區分爬蟲和正常使用者。
    🔑解決方法:完成爬蟲的編寫之後,使用代理批次爬取測試/仔細分析響應內容結構,找出頁面中存在的陷阱!

  3. 通過假資料反爬
    🔒反爬原理:向返回的響應中新增假資料汙染資料庫,通常假資料不會被正常使用者看見。
    🔑解決方法:長期執行,核對資料庫中資料同實際頁面中資料對應情況,如果存在問題,分析響應內容!

  4. 阻塞任務佇列
    🔒反爬原理:通過生成大量垃圾url,從而阻塞任務佇列,降低爬蟲的實際工作效率。
    🔑解決方法:觀察執行過程中請求響應狀態,仔細分析原始碼獲取的垃圾url生成規則,對url進行過濾!

  5. 阻塞網路IO
    🔒反爬原理:傳送請求獲取響應的過程實際上就是下載的過程,在任務佇列中混入一個大檔案的url,當爬蟲在進行該請求時將會佔用網路io,如果是有多執行緒,則會佔用執行緒。
    🔑解決方法:觀察爬蟲執行狀態/多執行緒請求執行緒計時!

  6. 運維平臺綜合審計
    🔒反爬原理:通過運維平臺綜合管理,通常採用複合型反爬蟲策略,多種手段同時使用。
    🔑解決方法:仔細觀察分析,長期執行測試目標網站,檢查資料採集速度,多方面綜合處理!

🔓第三個方向:基於資料加密進行反爬

(手段:對響應中含有的資料進行特殊化處理!)

關於反爬蟲三大方向放在第三位的是——基於資料加密進行反爬。這是我們在進行爬蟲的時候所遇到的第三層障礙,
需要使用到爬蟲高階的操作進行解決!如果你能熟練攻破此類問題,那麼你就是個合格的高階爬蟲工程師啦!!!

  1. 通過自定義字型來反爬(處理字型反爬(以解決58同城官網字型反爬為例)
    🔒反爬思路:使用自定義字型檔案。
    🔑解決思路:切換到手機版,解析字型檔案進行翻譯/仔細分析所抓取的所有包,找到對應的字型檔案,解析這個字型檔案進行翻譯!
    (下圖是爬取58同城官網的資料)
    在這裡插入圖片描述

  2. 通過css來反爬
    🔒反爬原理:原始碼資料不為真實資料,需要通過css位移才能產生真實資料。
    🔑解決方法:計算css的偏移!

  3. 通過js動態生成資料進行反爬:
    🔒反爬原理:網頁部分資料通過js動態生成。
    🔑解決思路:解析關鍵js,獲得資料生成流程,模擬生成資料!

  4. 通過資料圖片化反爬
    🔒反爬原理:將資料圖片化。
    🔑解決思路:通過使用圖片解析引擎從圖片中獲取資料!

  5. 通過編碼格式進行反爬
    🔒反爬原理:不使用預設編碼格式,在獲取響應之後,通常爬蟲使用utf-8格式進行解碼,此時解碼結果將會是亂碼或者報錯。
    🔑解決思路:根據原始碼進行多格式解碼,獲取真正的解碼格式!

🍖拓展一:驗證碼的處理!

我們在登入註冊時頻繁傳送請求,伺服器彈出圖片驗證碼進行驗證!不過現在大多網站哪怕你第一次傳送請求,它也蹦出圖片驗證碼要求你驗證!

🍮(1)處理方案:

  1. 手動輸入,但僅限於登入一次,無法持續;
  2. 圖片識別引擎,使用光學識別引擎處理圖片中的資料,目前常用於圖片資料提取,較少用於驗證碼處理;
  3. 打碼平臺,爬蟲常用解決驗證碼的方案。

🍚(2)關於圖片識別引擎(tesseract)這一處理方案的具體操作:

🍏第一步:下載安裝

    專案地址:https://github.com/tesseract-ocr/tesseract
    引擎安裝:
        (1)mac環境下直接執行命令:
        brew install --with-training-tools tesseract
        
        (2)windows環境下的安裝,可以通過exe安裝包安裝,下載地址:GitHub專案中的wiki找到,安裝完成後將tesseract執行檔案的目錄加入到path環境變數中,方便呼叫!
        
        (3)linux環境下安裝
        sudo apt-get install tesseract-ocr

🍒第二步:使用

圖片識別引擎tesseract通過python使用。(以下程式碼沒有對圖片進行任何處理,效果不佳!)

戰前準備:
	(1)PIL用於開啟圖片檔案
	    pip install pillow
	(2)pytesseract模組用於從圖片中解析資料
	    pip install pytesseract

字元驗證碼圖片


from PIL import Image
import pytesseract

im = Image.open('download.png')

result = pytesseract.image_to_string(im)
print(result)

🍑拓展:大廠的圖片識別引擎(拿來直接調介面,何樂而不為~)

其他OCR平臺
	    (1)微軟Azure影象識別:
	        https://azure.microsoft.com/zh-cn/services/cognitive-services/computer-vi
	    (2)有道智雲文字識別:
	        http://aidemo.youdao.com/ocrdemo
	    (3)阿里雲圖文識別:
	        https://www.aliyun.com/product/cdi/
	    (4)騰訊OCR文字識別:
	        https://cloud.tencent.com/product/ocr

🍉(3)常見驗證碼的種類:

第一種:url地址不變,驗證碼不變;
第二種:url地址不變,驗證碼變化。

🐮關於驗證碼這一部分,同學們是不是一直有個疑問:對方伺服器是如何判斷當前我輸入的驗證碼是顯示在我螢幕上的驗證碼?🐮

💘其實這就是通過cookie來實現的,對應的,在請求頁面,請求驗證碼,需要保證cookie的一致性,使用requests.session來解決。💘

🔞拓展二:關於爬蟲過程中chrome瀏覽器騷操作

(使用隱身視窗,首次開啟網站,不會帶上cookie,能夠觀察頁面的獲取情況,包括對方伺服器如何設定cookie在本地!)

  1. js的解析:

     1.確定js的位置
             ①觀察按鈕的繫結js事件(此法不保證一定能找到)
             ②通過initiator定位到js檔案
             ③通過serach 搜尋鍵碼定位到js檔案
             ④通過元素繫結的事件監聽函數找到js檔案
         
     2.在chrome瀏覽器,檢查,通過consle執行部分js程式碼,解析部分js程式碼代表的含義
     
     3.模擬重現
     ①使用 js2py 翻譯工具,python程式重現;
     ②還有 pyv8,executejs,splash 原理與 js2py 相似;
     ③純python的實現 ;
    
  2. 思路:

     在瞭解js內容和執行順序之後,通過python來完成js執行過程,得到結果;
     在瞭解js內容和執行順序之後,使用類似 js2py 的模組來執行js程式碼,得到結果。
    

💣In The End!

在這裡插入圖片描述

從現在做起,堅持下去,一天進步一小點,不久的將來,你會感謝曾經努力的你!

本博主會持續更新爬蟲基礎分欄及爬蟲實戰分欄,認真仔細看完本文的小夥伴們,可以點贊收藏並評論出你們的讀後感。並可關注本博主,在今後的日子裡閱讀更多爬蟲文!

	如有錯誤或者言語不恰當的地方可在評論區指出,謝謝!
	如轉載此文請聯絡我說明用以意並標註出處及本博主名,謝謝!

  可通過點選下面——>新增私人VX號—>請標明來自CSDN,會拉你進入技術交流群(群內涉及各個領域大佬級人物,任何問題都可討論~)—>互相學習&&共同進步(非誠勿擾):