使用Chrome快速實現數據的抓取(二)——協議


前面的文章簡單的介紹了一下Chrome調試模式的啟動方式,但前面的API只能做到簡單的打開,關閉標簽操作,當我們需要對某個標簽頁進行詳細的操作時,則需要用到頁面管理API。首先我們還是來回顧下獲取頁面信息:

訪問 http://127.0.0.1:9222/json,即可獲取如下所示的頁面信息

    {
        "description": "",
        "devtoolsFrontendUrl": "/devtools/inspector.html?ws=127.0.0.1:9222/devtools/page/6d4f925f-7220-47cd-a4f9-800686445ffb",
        "faviconUrl": "http://tianfang.cnblogs.com/favicon.ico",
        "id": "6d4f925f-7220-47cd-a4f9-800686445ffb",
        "title": "
天方
- 博客園",
        "type": "page",
        "url": "http://tianfang.cnblogs.com/",
        "webSocketDebuggerUrl": "ws://127.0.0.1:9222/devtools/page/6d4f925f-7220-47cd-a4f9-800686445ffb"
    },

其中webSocketDebuggerUrl字段就是頁面管理API的地址,從url格式就可以看出它是一個websocket形式的協議,首先我們看看鏈接地址:

    ws://127.0.0.1:9222/devtools/page/92615aad-5862-48d5-983d-248468e9741a

通過簡單的分析可以看出,它的變量只有兩個:訪問端口和頁面Id,我們甚至不需要訪問webSocketDebuggerUrl字段,直接根據Id也可以非常容易的構建這個地址的。大多數程序都有websocket的支持庫的,這里為了測試,我直接找的一個在線websocket工具:http://www.blue-zero.com/WebSocket/,連接上后,就可以進行命令的收發了。

 

交互協議

Chrome遠程調試模式是遵循Chrome DevTools Protocol的,這個協議在https://chromedevtools.github.io/devtools-protocol/中有詳細的描述,它一般分為三個版本:

其中穩定版的是stable protocol,不過它的功能相對最新版要少些,如果不擔心穩定性的問題的話,我們大多數的時候還是可以直接用(tot)版本的。

 

消息格式

Chrome DevTools Protocol的協議消息格式比較簡單,是文本形式的,用json表示對象,它主要分為如下三種:請求響應通知

請求:

請求是客戶端主動向chrome發送的請求,具體格式可參考前面的協議,這里我們以Network.enable為例,我們發送的請求如下:

    {"id":4,"method":"Network.enable","params":{"maxTotalBufferSize":10240}}

它內容主要包括id,method, params三個部分:id是自己建立的命令編號,method是發送的請求,params則是請求參數。

響應:

響應則是對請求的應答,並返回結果:

    {"id":4,"result":{}}

響應內容包括兩個部分:id和result,id為請求命令編號,result為請求結果。

通知:

通知為chrome主動通知給客戶端的消息。例如,啟用network.enable后,就會上報一些網絡通知:

    {"method":"Page.frameStoppedLoading","params":{"frameId":"7216.1"}}
    {"method":"Network.loadingFailed","params":{"requestId":"7216.88","timestamp":2832.149269,"type":"Document","errorText":"","canceled":true}}

  通知主要包括methodparams兩個部分。  

 

常用指令

Chrome DevTools Protocol的指令分為三十多個大類,每類又有若干個指令,這里不能一一介紹,只選擇幾個簡單而常用的指令介紹一下:

  1. 跳轉到指定頁面:Page.navigate
  2. 執行JS函數:Runtime.evaluate
  3. 獲取資源樹:Page.getResourceTree
  4. 獲取資源:Page.getResourceContent

其中Page.navigate是必備指令,用於跳轉頁面。而Runtime.evaluate的效果等同於在Develop Tools的Console控制台執行指令,基本可以執行任何js指令,模擬輸入,輸出渲染后的html用它都可以輕松搞定,可以說是大殺器了。

    

獲取資源樹和獲取資源指令則用於獲取瀏覽器當前原始請求的數據,可以用它來構建Develop Tools的Source樹。

    

可以說,利用Develop Tools實現的功能我們都可以通過Chrome DevTools Protocol實現,Chrome自己也內置了一個官方的實現,用Chrome直接訪問頁面信息的devtoolsFrontendUrl即可看到,和按F12調用出來的Develop Tools基本一模一樣。

關於協議內容本文就介紹到這里,后面文章中我將用示例介紹用實際用例用Chrome編寫爬蟲。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM