Python 反爬蟲——文本混淆反爬蟲

文中案例參考 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加入黑名單,實現了反爬
  • 隱藏式連接,利用的是爬蟲工程師的粗細大意,仔細檢查就可以避免訪問隱藏式連接
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章