天天看點

Python 反爬蟲——文本混淆反爬蟲4 文本混淆反爬蟲5 特征識别爬蟲

文中案例參考 GitHub項目

4 文本混淆反爬蟲

4.1 圖檔僞裝為文字反爬蟲

  • 有些文字内容實際是圖檔僞裝的
  • 提取圖檔的内容(圖檔請求響應結果res.content就是圖檔的位元組資料,可以直接write為圖檔對象,也可以打開為圖檔對象,看案例)
  • 圖檔對象使用光學字元識别技術(pytesseract庫)從圖檔中提取文字
  • PyTesseract缺點:隻能識别出一些清晰工整的圖像中的文字,扭曲的文字或者有其它顔色圖檔幹擾資訊時候識别不準确
  • 參考案例001(02檔案夾中)

4.2 CSS偏移反爬蟲

  • 一般用于數字顯示,源碼中有很多數字,用于混淆
  • 網頁中顯示的出來的内容的位置是固定的,源碼中的數字進行偏移覆寫才是最終顯示出來的數字
  • 去哪兒網的航班票價就是進行CSS偏移處理過的
  • 前面有數字120 下面有數字002
  • 002通過不同的左右偏移位置覆寫在120的數字上才是最終顯示結果
  • 參考圖檔002

4.3 SVG圖形映射反爬蟲

  • SVG是一種二維矢量圖形格式,放大縮小清晰度保持不變
  • SVG映射反爬蟲:前端或者後端裡面将文字或者數字映射為對應SVG圖形檔案

    網頁源碼中顯示的是SVG圖形檔案,并沒有實際的文字或者數字内容

  • 最常用于團購網站商家電話的替換
  • 映射替換有兩種方式:
    • 方式1:一個SVG圖檔代表一個數字或者文字。要顯示内容的地方使用SVG圖檔替代,一般是設定class樣式,然後設定背景圖檔,用SVG圖檔插到盒子中
    • 方式2:将所有的數字或者文字都放在一張SVG圖檔上,然後設定為背景圖檔,然後通過偏移圖檔的位置顯示内容
    • 方式3:将所有的數字或者文字都放在一張SVG圖檔上,然後設定為背景圖檔,圖檔位置不同,SVG圖檔裡面的的數字是可以通過改變xy軸坐标顯示的位置的
    • 具體參考圖書的P181頁,關鍵是找到映射的規律

4.4 自定義網頁字型(常用woff格式字型)反爬蟲

  • 自定義的字型格式:woff ttf eot otf
  • 文中的數字使用自定義字型樣式進行替代,檢視元素數字都是顯示的方框或者其它特殊符号
  • 檢視元素裡面可以數字都有一個class樣式,檢視該class樣式具體内容,隻用一個font-family,對應的值就是自定義的字型樣式
  • 檢視源碼,數字是一些特殊編碼,特殊編碼就是字型檔案裡面定義的數字對應的編碼
  • woff等字型檔案請求的網址,可以下載下傳字型檔案到本地,然後使用
  • 百度線上字型編輯打開檢視:http://fontstore.baidu.com/static/editor/index.html
  • 參考003圖檔
  • WOFF字型檔案研究
    • WOFF(Web Open Font Format, web開放字型樣式)是一種網頁采用的字型格式标準
    • 本質上WOFF是基于SFNT字型,具有TrueType字型的結構,TrueType字型由網格上一系列的點進行描述,點是字型的最小機關
    • WOFF檔案等字型檔案可以使用python中的第三方fonttools轉換為XML檔案,便于觀察裡面的具體資料
    • pip install fonttools
    • 參考案例004
    • 打開XML檔案,下面内容就是描述數字6的字形檔案
      • TTGlyph裡面有字形的名稱、x和y軸坐标資料(可了解為字形的寬和高)
      • contour裡面隻字形的輪廓資訊,即多個點的坐标位置,就是這些點連接配接在一起構成一個字形
    • 注意:相同的字形的寬高或者輪廓點可能會不一樣,但是它們描述的會是一個字形

      是以,隻有起止坐标和點坐标資料完全一樣的字形,我們才能肯定它們是相同的字元

<TTGlyph name="uniE339" xMin="0" yMin="-12" xMax="510" yMax="719">
      <contour>
        <pt x="410" y="534" on="1"/>
        <pt x="398" y="586" on="0"/>
        <pt x="377" y="609" on="1"/>
        <pt x="341" y="646" on="0"/>
        <pt x="289" y="646" on="1"/>
        <pt x="247" y="646" on="0"/>
        <pt x="215" y="623" on="1"/>
        <pt x="173" y="592" on="0"/>
        <pt x="150" y="535" on="1"/>
        <pt x="138" y="506" on="0"/>
        <pt x="125" y="423" on="0"/>
        <pt x="125" y="369" on="1"/>
        <pt x="157" y="418" on="0"/>
        <pt x="248" y="464" on="0"/>
        <pt x="299" y="464" on="1"/>
        <pt x="386" y="464" on="0"/>
        <pt x="510" y="334" on="0"/>
        <pt x="510" y="232" on="1"/>
        <pt x="510" y="165" on="0"/>
        <pt x="452" y="49" on="0"/>
        <pt x="352" y="-12" on="0"/>
        <pt x="286" y="-12" on="1"/>
        <pt x="176" y="-12" on="0"/>
        <pt x="38" y="147" on="0"/>
        <pt x="38" y="335" on="1"/>
        <pt x="38" y="543" on="0"/>
        <pt x="114" y="637" on="1"/>
        <pt x="181" y="719" on="0"/>
        <pt x="294" y="719" on="1"/>
        <pt x="379" y="719" on="0"/>
        <pt x="433" y="671" on="1"/>
        <pt x="486" y="625" on="0"/>
        <pt x="498" y="541" on="1"/>
      </contour>
      <contour>
        <pt x="139" y="232" on="1"/>
        <pt x="139" y="188" on="0"/>
        <pt x="178" y="103" on="0"/>
        <pt x="247" y="60" on="0"/>
        <pt x="285" y="60" on="1"/>
        <pt x="339" y="60" on="0"/>
        <pt x="420" y="150" on="0"/>
        <pt x="420" y="227" on="1"/>
        <pt x="420" y="300" on="0"/>
        <pt x="341" y="387" on="0"/>
        <pt x="223" y="387" on="0"/>
        <pt x="139" y="301" on="0"/>
      </contour>
      <instructions/>
    </TTGlyph>
           
  • 可以利用fonttools打開網頁的字型檔案進行分析
    • 找出每個字元映射到網頁源碼中的代碼,實作WOFF字形檔案的映射檔案
    • 但是如果開發者經常更換字型檔案或者使用多套woff字型檔案随機切換(隻需要引用路徑随機更換即可,網頁源碼使用了字型樣式,字元代碼就會自動更換)
    • 會使爬取難度越來越大

4.5 文本混淆爬蟲通用解決方法

  • 光學字元識别OCR可以是識别圖形中的文字,但是WOFF字型檔案和SVG圖形中文字太多或者幹擾因素多的時候就無法識别
  • 解決方法:
    • 使用Python連接配接Splash渲染工具,進行網頁所需部分的截圖
    • 拿到截圖後儲存到本地
    • 使用PyTesseract庫識别指定的圖檔
    • 該方法缺點:PyTesseract是一個開源庫,識别率較低
    • 解決方法: 使用第三方文字識别API
      • 騰訊雲OCR識别(識别率高,但是要收費)
      • https://cloud.tencent.com/act/event/ocrdemo
    • 參考案例005及書中P202

5 特征識别爬蟲

  • HTML文檔對象 DOM
    • HTML文檔對象DOM(Document Object Model)
    • HTML DOM對象是對HTML文檔所有元素進行通路的入口,這個入口就是文檔對象模型,簡稱DOM
    • DOM是W3C組織推薦的處理可擴充标志語言的标準程式設計接口
    • DOM以面向對象的方式描述文檔模型,定義了表示和修改文檔所需要的對象的名稱、對象的行為、對象的屬性以及和對象之間的關系
    • 在網頁中,組織頁面或者文檔對象被放在一個樹形的結構中,其中用來表示對象的标準模型就是DOM
    • HTML文檔樹形結構最頂層的對象就是document
    • DOM也可以了解為一個容器,EChats中繪圖前都需要在網頁中準備一個DOM容器對象
  • 浏覽器器對象 BOM
    • 浏覽器對象模型BOM(Browser Object Model)
    • BOM對象是用來擷取和操作浏覽器的屬性,主要對象有
      • window: 浏覽器視窗對象,所有的JavaScript全局對象、函數和變量均自動成為該對象的成員
      • window.navigator:通路者浏覽器的相關資訊
      • window.location: 視窗目前顯示的文檔的web位址
      • window.screen: 通路者浏覽器的螢幕資訊
      • window.onload:HTML文檔整體加載後,再執行window.onload裡面的代碼
  • 詳細DOM和BOM對象屬性和方法檢視圖書P66-P69

5.1 Webdriver識别反爬蟲

  • webdriver特征是可以修改的,不可靠
  • 參考案例006

5.2 浏覽器特征

  • navigator.userAgent 浏覽器器屬性
  • navigator.platform 使用者計算機資訊
  • 參考截圖007_浏覽器特征
  • 上面的浏覽器特征也是和navigator.webdriver一樣可以認為進行修改的,一樣不可靠

5.3 爬蟲特征

  • IP位址通路頻率限制:使用IP池,分布式爬蟲(多台機器輪流通路)
  • 使用者憑證(cookie或者token)和浏覽器指紋限制:
    • web架構自帶通路頻率限制:登陸使用者每天通路1000次,未登入每天100次
    • web架構自帶限速子產品Throttling
  • 使用者憑證反爬蟲:申請大量使用者,通路時候随機攜帶cookie或token值,類似IP代理池
  • 登入使用者可靠憑證:cookie或token
  • 未登入使用者可靠憑證:
    • Canvas生成的指紋、WebGL生成的指紋、Navigator對象的屬性值、用戶端其它屬性值,綜合生成的特征值
    • Fingerprint.js庫可以生成一個重複率極低的特征指紋

5.4 隐藏連接配接反爬蟲

  • 隐藏連接配接反爬蟲一般使用在大量清單中,将個别清單成員的css屬性添加一個隐藏屬性,display:none
  • 正常頁面該盒子已被隐藏,使用者浏覽器通路不到,但是爬蟲循環通路時候可以通路到
  • 後端設定通路該連結就被視為爬蟲,然後将IP加入黑名單,實作了反爬
  • 隐藏式連接配接,利用的是爬蟲工程師的粗細大意,仔細檢查就可以避免通路隐藏式連接配接

繼續閱讀