網站常見反爬解決方法

簡單而真實發表於2019-10-18

目前,許多網站採取了各種各樣的措施來反爬蟲,通常一個網站都會使用下面的多種反爬,越是資料價值高的網站反爬做的越複雜。常見的反爬措施及解決方案如下:

1.通過網頁請求頭反爬

這是網站最基本的反爬措施,也是最容易實現的反爬,但是破解起來也容易,只需要合理新增請求頭即可正常訪問目標網站獲取資料。

2.IP反爬

  • 伺服器會檢測某個IP在單位時間內的請求次數,如果超過了這個閾值,就會直接拒絕服務,返回一些錯誤資訊,這種情況可以稱為封IP。封IP也分為永久被封和短時被封。

  • 永久被封:進入黑名單中的IP永久不能訪問

  • 固定時段被封:IP一段時間失效

解決方案:

採用代理突破IP訪問限制,常規方法就是購買代理服務或者購買VPS伺服器自己構建代理IP池

代理的原理:

網站常見反爬解決方法

IP代理池架構:

網站常見反爬解決方法

  • 儲存模組一般使用Redis的有序集合,用來做代理去重和狀態標識,儲存模組為中心模組,連線其他模組
  • 獲取模組定時從代理網站獲取代理,將獲取的代理傳遞給儲存模組,並儲存資料到Redis
  • 檢測模組定時獲取儲存模組中的所有代理,並對代理進行檢測,根據不同的檢測結果對代理設定不同的標識
  • 介面模組通過WebAPI提供服務介面,介面通過連線Redis獲取資料並返回可用代理

ADSL撥號代理:

網站常見反爬解決方法

  • 撥號模組:定時撥號,生成的IP傳送給介面模組,介面模組呼叫儲存模組儲存IP資料
  • 介面模組:接收撥號模組的IP,給爬蟲提供介面返回IP資料
  • TingProxy:代理服務,就是一個軟體,安裝到VPS啟動即可
  • 儲存模組:負責存取IP
  • 爬蟲:通過呼叫介面獲取IP,新增代理訪問目標網站獲取資料

3.驗證碼反爬

  • 驗證碼反爬也是目前很多網站常用的一種反爬機制,隨著技術的發展,驗證碼的花樣也越來越多。驗證碼最初是幾個數字組合的圖形驗證碼,後來加入英文字母和混淆曲線。有的網站還可能加入中文字元驗證碼.

  • 遇到有驗證碼的網頁,目前就兩種解決方案,一種是購買驗證碼識別服務,這些識別服務本身也是他們後臺人工去識別之後通過介面返回識別結果;另一種是自己訓練識別模型進行識別。此處主要介紹自己處理驗證碼的方案,對接服務的方式可以找對應識別平臺依據API文件完成識別對接。

1)字元驗證碼:

網站常見反爬解決方法

  • 普通字元識別,目前深度學習可以做到比人眼識別更高的準確率。可以通過深度學習來自己開發識別服務介面,流程如下:

網站常見反爬解決方法

  • 一般訓練樣本都是通過爬蟲對接實際的打碼平臺,進行資料的採集,儲存正確的樣本作為模型訓練樣本。目前訓練樣本所需量和樣本類別大概關係為:樣本類別數X 500,比如數字加字母36個類別訓練所需要的樣本量為36*500=18000。訓練樣本越多,得到的模型識別率越高,但是相對來說成本越高。實際訓練中發現,針對字母+數字形式驗證碼10000以上樣本就可以得到一個可用的識別模型。如何訓練一個可用模型,可以閱讀我寫的另一篇文章《基於python+深度學習構建驗證碼識別服務系列文章》juejin.im/post/5da81e…

  • 漢字識別和普通字元識別一樣,僅僅需要的樣本量比較大,模型結構和訓練過程一樣。上圖中有一種驗證碼是需要輸入指定顏色的字元,這種驗證碼和字元驗證碼識別類似,但是需要兩個模型進行配合處理,及顏色識別模型和字元識別模型。顏色識別模型負責輸出圖片字元對應顏色序列,字元輸出模型負責輸出對應圖片字元。實際訓練中發現顏色識別模型很少樣本就可以得到99.99%的識別率,模型收斂很快;但是字元驗證碼由於加入了3500種漢字,實際訓練時訓練樣本100萬(由程式碼模擬生成),識別率95%以上,訓練時間相對很長(GPU會快很多)。

網站常見反爬解決方法

深度學習訓練驗證碼識別模型一些心得:

  • 模型設計可以設計成通用結構,每次只需要修改輸出類別個數,模型可以複用。對於圖片大小不一致問題可以採取縮放到統一尺寸來解決。
  • 字元驗證碼目前都是不需要區分大小寫的,同時每個平臺的字元驗證碼可能把容易混淆的字元剔除了,所以字元驗證碼實際的類別輸出並沒有36種。通過對訓練樣本進行統計就可以找到缺失字元,這樣可以減少輸出類別數。另外一個注意點就是,有些網站的字元驗證碼可能不是定常的,每次返回的驗證碼是可變長度的,對於這種驗證碼可以按照最大長度設計模型,長度不夠的用下劃線補齊,但是一定要合理選擇補齊位置,才能得到較好的識別準確率。

2)行為驗證碼:

a.座標點選:

網站常見反爬解決方法

  • 座標點選也可以直接對接打碼平臺,提交圖片資料到打碼平臺,打碼平臺返回座標值,通過Seleniun、PhantomJS模擬點選對應座標,完成驗證。或者直接構造引數提交即可。
  • 深度學習訓練模型進行識別,自己訓練模型需要的樣本量比較大,訓練成本比較高。漢字點選驗證碼相對需要的訓練樣本比較少。針對漢字點選驗證碼提供一種識別思路:

網站常見反爬解決方法

  • 這種驗證碼在獲取到圖片中的字元之後,最關鍵的一步是需要按照正確的語序去點選圖片中的字元,所以需要有一個語序模組依據輸入的字元給出正確的語序順序,最簡單的方式就是對字元所有的排序通過Jieba庫進行分詞,得到最長分詞序列即為正確結果。或者基於自然語言處理訓練語序模型進行排序。
  • 最後一步也就是模擬點選過程,簡單的方式是採用瀏覽器模擬點選,這種通過率相對較高,實現容易。另一種方式為分析引數加密過程,直接構造引數提交,JS逆向有一定難度,技術要求較高,優點是程式執行效率較高。

b.滑動驗證:

網站常見反爬解決方法

  • 滑動驗證碼識別的關鍵是確定缺口需要滑動的距離、構造滑動軌跡。軌跡計算最通用的方式就是通過OpenCV庫使用影像處理演算法來計算滑塊滑動距離,目前網上主流的幾家滑動驗證碼都可以採用這種演算法來計算得到滑動距離。軌跡構造,軌跡構造的原則就是儘量模擬人滑動的過程,比如網上常見的先加速後減速或者利用正態分佈曲線構造軌跡(實際實現效果較好,引數方便修改)。得到距離和軌跡之後,採用Seleniun、PhantomJS模擬滑動,但是這種方式存在的問題就是效率比較低。
  • 更好的辦法是在得到滑動距離和滑動軌跡之後直接分析JS引數構造過程,逆向JS,得到提交引數,直接向後臺提交資料通過驗證。技術要求比較高,需要一定的JS逆向能力,但是爬取效率較高。

4.JS混淆動態引數反爬

  • JS引數加密也是目前很多網站常會採用的一種反爬機制。最簡單的方式是通過Seleniun、PhantomJS直接抓取,優點是不需要分析JS,缺點是採集效率較低。
  • 另一種方案是直接逆向分析JS,改寫加密JS或者直接用JS執行引擎(PyV8、pyexecjs、PhantomJs)執行JS得到加密引數後直接提交引數。

5.賬號反爬

  • 常見的就是每次訪問都需要先登入才可以正常瀏覽資料,這種網站資料採集就需要準備大量賬號,同時需要注意每個賬號最大請求次數,有的網站也會在同一個賬號短時間內發起大量請求時採取封號策略,解決方式就是大量賬號切換採集;每個賬號傳送一定量請求之後及時切換另一個賬號採集。
  • 解決賬號反爬的第一步就是模擬登陸,模擬登陸常見方式有兩種:一種是用Seleniun、PhantomJS模擬登陸,這種方式實現較簡單,不需要分析JS,由於很多需要登陸的網站都有對應JS引數混淆機制。另一種比較直接的方式就是逆向JS,模擬提交資料完成模擬登陸,儲存Cookie資料供爬蟲爬取資料用。

Cookie代理池模組一般架構:

網站常見反爬解決方法

  • 獲取模組:負責生成每個賬號對應的Cookie
  • 儲存模組:儲存賬號及賬號對應的Cookie資訊,同時還需要實現一些方便存取的操作
  • 檢測模組:定時檢查Cookie,不同站點檢測連結不同,檢測模組拿對應Cookie去請求連結,返回狀態有效則Cookie有效,否則Cookie失效並移除。
  • 介面模組:對外提供API呼叫,隨機返回Cookie保證每個Cookie都能被取到,Cookie越多被取到的概率越小,從而減少被封號的風險。

6.自定義字型庫反爬

目前有些網站通過自定義字型庫的方式實現反爬,主要表現在頁面資料顯示正常,但是頁面獲取到的實際資料是別的字元或者是一個編碼。這種反爬需要解析網站自己的字型庫,對加密字元使用字型庫對應字元替換。需要製作字型和基本字型間對映關係。

7.總結

  • 目前很多網站都有基本的反爬策略,常見就是驗證碼、JS引數加密這兩種。爬取量不大優先推薦Seleniun、PhantomJS、Splash這樣的工具,可以很快實現資料抓取。對資料量較大的爬取任務還是建議構造引數方式抓取,程式穩定性較高,同時效率高,尤其對目前很多前後端分離網站資料抓取更適合。
  • 爬蟲本身會對網站增加一定的壓力,所以也應該合理設定爬取速率,儘量避免對目標網站造成麻煩,影響網站正常使用,一定注意自己爬蟲的姿勢。

推薦大家一篇關於爬蟲合法還是違法的文章:mp.weixin.qq.com/s/rO24Mi5G5…

網站常見反爬解決方法

敬畏法律,遵紀守法,從我做起

上述文章不針對任何實際網站,部分驗證碼圖片來源網路,如有雷同,純屬巧合

請勿用於商業用途

感謝閱讀

相關文章