1. 程式人生 > >使用Chrome快速實現數據的抓取(二)

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

run 描述 管理 opp socket 請求 icon err protoc

在前面的文章簡單的介紹了一下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/中有詳細的描述,它一般分為三個版本:

  1. The latest (tip-of-tree) protocol (tot)
  2. v8-inspector protocol (v8)
  3. stable protocol (1-2)

其中穩定版的是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編寫爬蟲。

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