網站常見反爬解決方法

目前,許多網站採起了各類各樣的措施來反爬蟲,一般一個網站都會使用下面的多種反爬,越是數據價值高的網站反爬作的越複雜。常見的反爬措施及解決方案以下:python

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會快不少)。post

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

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

2)行爲驗證碼:

a.座標點選:

  • 座標點選也能夠直接對接打碼平臺,提交圖片數據到打碼平臺,打碼平臺返回座標值,經過Seleniun、PhantomJS模擬點擊對應座標,完成驗證。或者直接構造參數提交便可。
  • 深度學習訓練模型進行識別,本身訓練模型須要的樣本量比較大,訓練成本比較高。漢字點選驗證碼相對須要的訓練樣本比較少。針對漢字點選驗證碼提供一種識別思路:

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

b.滑動驗證:

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

4.JS混淆動態參數反爬

  • JS參數加密也是目前不少網站常會採用的一種反爬機制。最簡單的方式是經過Seleniun、PhantomJS直接抓取,優勢是不須要分析JS,缺點是採集效率較低。
  • 另外一種方案是直接逆向分析JS,改寫加密JS或者直接用JS執行引擎(PyV八、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…

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

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

請勿用於商業用途

感謝閱讀

相關文章
相關標籤/搜索