Python 反爬蟲——信息驗證

文中案例參考 GitHub項目

2 信息驗證型反爬蟲

2.1 User-Agent反爬蟲

  • User-Agent是用戶身份識別的重要信息,User-Agent中包含用戶瀏覽器、瀏覽器引擎、操作系統等信息
  • python的requests庫請求時候,服務器讀取到的User-Agent信息就是 python-requests/2.21.0
  • User-Agent反爬蟲:
    • nginx中加入User-Agent檢測,將python,Java,PHP等一些關鍵詞都加入到黑名單中
    • 檢測時候,發現含有這些關鍵詞,就認定爲是爬蟲程序
  • 除了User-Agent頭部信息,常用的還有Host,Referer頭部信息
      1. Host 描述請求將被髮送的目的地,只含域名和端口號;
      1. Origin 請求是從哪裏發起的,包括域名和端口號,這個參數一般存在於CORS跨域請求中,
        可以看到response有對應的header: Access-Control-Allow-Origin
      1. Referer 告知服務器請求的原始資源的URI,其用於所有類型的請求,包括:協議+域名+查詢參數

2.2 Cookies反爬蟲

  • 服務器端,一般是Nginx中加入檢測請求頭信息中是否有http_cookie信息,然後返回不同的結果。
  • 瀏覽器正常請求網頁,服務器返回的cookie會自動保存在本地,下次訪問時候會自動攜帶
  • 沒有攜帶cookie訪問,返回結果都是重定向,一般都是重定向30x,一般都是定位到首頁或者登陸頁面

2.3 簽名驗證反爬蟲

  • JavaScript異步動態請求類型一般都是xhr(ajax封裝對象),可以在請求裏面查找類型爲xhr的請求,請求源一般都是js文件

  • 請求正文內容裏面有特徵值是32位(一般是MD5加密後字段),一般可以大膽猜測就是簽名驗證反爬蟲,

  • 加密內容都是使用JavaScript裏面的函數生成的,通過進js文件搜索關鍵字,就可以找到加密字段的生成方式

  • 案例1:

  • 訪問一下網址,然後點擊查看詳情

    • http://www.porters.vip/verify/sign/
    • 上述網址,點擊查看詳情,查看network
    • 下面網址就是動態加密生成的,直接複製去請求是無效的,網址有多個參數還有時間戳,直接瀏覽器再次去請求就是無效的
    • http://www.porters.vip/verify/sign/fet?actions=31288&tim=1583827827&randstr=JUBMB&sign=1f46e27e48caacc155fbf9afde6bbbc0
    • 動態加密請求,就是需要破解動態網址是如何生成的
    • 點擊查看詳情,network裏面有一個fet…開頭的網址請求,類型是xhr(ajax封裝的對象)
  • 查看網址,點擊查看詳情位置,參考圖片005,發現onclick綁定一個fetch()函數

    • 表明點擊後執行該函數,函數都是放在js代碼裏面,head裏面發現引入了兩個自定義的js文件
    • Chrome檢查,查看,右鍵在js文件上,open in new tab
    • 查看fetch()函數具體內容,函數訪問一個動態生成的網址,網頁內容插入替換原始網頁id="content"標籤的內容
    • 然後我們在python中實現該真實網址的生成方式
  • 案例2:

  • 有道翻譯加密分析:

    • 打開有道翻譯,輸入中國,network裏面出現一個xhr類型的post請求,請求源Initiator是一個js文件
    • post請求,Request URL: http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
    • 請求體的formdata裏面有很多參數,i就是要翻譯的字符串
    • 加密的參數進請求源js文件裏面搜索,可以找到參數的生成方式
    • 具體參考006圖片
    • 實際有道翻譯加密只需要保留formdata中的i和doctype就可以獲取翻譯後的json數據,直接忽略加密內容
    • 參考006案例

2.4 js動態請求補充:

  • 網頁源碼中(Name,Status,Type,Initiator,Size,Time,Waterfall)的含義

    • 第一列 Name :請求的名稱,一般會將URL 最後一部分內容當作名稱
    • 第二列 Status :響應的狀態碼,顯示爲 200 代表響應是正常的 通過狀態碼,我們可以判斷髮送了請求之後是否得到了正常的響應 。
    • 第三列 Type: 請求的文檔類型 。這裏爲 document ,代表我們這次請求的是 HTML 文檔, 內容就是一些 HTML 代碼。
    • 第四列 Initiator: 請求源。 用來標記請求是由哪個對象或進程發起的
    • 第五列 Size : 從服務器下載的文件和請求的資源大小。 如果是從緩存中取得的資源,則該列 會顯示from cache。
    • 第六列 Time : 發起請求到獲取響應所用的總時間
    • 第七列 Waterfall:網絡請求的可視化瀑布流
  • 動態ajax請求一般是xhr類型

    • xhr:XMLHttpRequest在後臺與服務器交換數據,這意味着可以在不加載整個網頁的情況下,對網頁某部分的內容進行更新。
      是Ajax的一種用法,而Ajax並不是一門語言,只是一種不需要加載整個網頁,只是更新局部內容的技術。

    • 案例:

    • 比較常見的就是網頁內容繁多,我們僅僅看評論時,無需整個頁面都加載,

    • 那麼就可以採用這種方式來實現,只需要在翻頁時,局部加載評論的內容即可。

  • js(ajax)動態請求

    • 1、在使用Chrome或者firebug抓取類似網頁的內容時,只需要找到xhr類型的url地址,Initiator請求源一般是一個js文件
    • 2、在瀏覽器地址欄中打開即可看到對應的內容。
    • 3、一般情況爲json格式,
    • 4、再利用python等語言抓取json中的需要的內容即可

3 動態渲染反爬蟲

3.1 Selenium工具

  • 工具1:Selenium + Chrome + 驅動器 三件套抓取動態渲染網頁
    • 缺點:執行效率低,佔用系統資源大,不能異步請求

3.2 Puppeteer工具

  • 工具2:Puppeteer(python中的庫叫pyppeteer)
  • 安裝:
    • 安裝命令:
      pip install pyppeteer
      python -m pip install pyppeteer

    • 從GIT安裝最新版本:python -m pip install -U git+https://github.com/miyakogi/pyppeteer.git@dev

    • 推薦安裝方式:

      • 第一步:需要先安裝支持庫 pip install tdqm
      • 第二步:pip install pyppeteer
      • 第三步:含有pyppeteer的代碼運行時候,會自動下載chromium解壓安裝(Chrome的實驗版)
  • 參考案例008

3.3 Splash異步渲染服務

  • Splash是一個異步的JavaScript的渲染服務,它帶有HTTP API的輕量級Web服務器。

  • 可視化界面地址:http://www.porters.vip:8050/

  • 上面地址輸入網址,然後render me就可以獲取網頁的截圖、資源加載數據、HTML原始文本

  • 腳本里面也可以自己編寫,但是使用的是Lua語言

  • 參考009圖片

  • Splash服務也可以和Python語言結合使用

  • 參考案例009

  • 上面三種渲染工具對比:

    • Selenium套件通過驅動瀏覽器執行操作,本質上是模擬瀏覽器操作
    • Puppeteer實際上通過API控制Chromium或者Chrome瀏覽器
    • Splash基於開源的瀏覽器引擎WebKit
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章