2016-08-01 39 views
6

我想通過Chrome調試協議獲取網頁資源內容使用python method-getResourceContent,我注意到了這個方法:getResourceContent,需要params frameId和url.i認爲這個方法是什麼我需要。 ,所以我做了這件事:如何通過chrome遠程調試獲取網頁資源內容

1.get開始鉻作爲服務器:\的chrome.exe --remote調試端口= 9222

2.write的Python測試代碼:

# coding=utf-8 
""" 
chrome --remote-debugging api test 
""" 

import json 
import requests 
import websocket 

import pdb 

def send(): 
    geturl = requests.get('http://localhost:9222/json') 
    websocketURL = json.loads(geturl.content)[0]['webSocketDebuggerUrl'] 
    request = {} 
    request['id'] = 1 
    request['method'] = 'Page.navigate' 
    request['params'] = {"url": 'http://global.bing.com'} 
    ws = websocket.create_connection(websocketURL) 
    ws.send(json.dumps(request)) 
    res = ws.recv() 
    ws.close() 
    print res 

    frameId = json.loads(res)['result']['frameId'] 
    print frameId 
    geturl = requests.get('http://localhost:9222/json') 
    websocketURL = json.loads(geturl.content)[0]['webSocketDebuggerUrl'] 
    req = {} 
    req['id'] = 1 
    req['method'] = 'Page.getResourceContent' 
    req['params'] = {"frameId":frameId,"url": 'http://global.bing.com'} 
    header = ["User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"] 
    pdb.set_trace() 
    ws = websocket.create_connection(websocketURL,header=header) 
    ws.send(json.dumps(req)) 
    ress = ws.recv() 
    ws.close() 
    print ress 
if __name__ == '__main__': 
    send() 

3.Page.navigate做工精細,我有這樣的事情: { 「ID」:1, 「結果」:{ 「frameId」: 「8504.2」}}

4.當我嘗試的方法:getResourceContent ,錯誤出來了: {「error」:{「code」: - 32000,「message」:「代理未啓用。「},」id「:1}

我試着添加User-Agent,仍然無法工作。

謝謝。

回答

2

錯誤消息「代理程序未啓用」與HTTP User-Agent標題無關,而是指需要啓用chrome中的代理程序才能檢索頁面內容。

由於protocol documentation提到的域名需要啓用才能進行調試(術語「代理」指的是Chrome在內部實現的方式,我猜想)中的術語「代理」有點令人誤解,

因此,問題是需要啓用哪個域才能訪問頁面內容?事後看來很明顯:Page域需要啓用,因爲我們正在調用此域中的方法。不過,我只是在絆倒this example後才發現這一點。

一旦我將Page.enable請求添加到腳本以激活Page域,該錯誤消息就消失了。但是,我遇到了另外兩個問題:

  1. 的網頁套接字連接需要保持開放的請求爲Chrome瀏覽器之間保持調用(如代理是否已啓用)
  2. 當導航到HTTP之間的一些狀態:/ /global.bing.com/瀏覽器被重定向到http://www.bing.com/(至少它在我的電腦上)。這會導致Page.getResourceContent無法檢索資源,因爲請求的資源http://global.bing.com/不可用。

修復這些問題後,我能夠檢索頁面內容。這是我的代碼:

# coding=utf-8 
""" 
chrome --remote-debugging api test 
""" 

import json 
import requests 
import websocket 

def send(): 
    # Setup websocket connection: 
    geturl = requests.get('http://localhost:9222/json') 
    websocketURL = json.loads(geturl.content)[0]['webSocketDebuggerUrl'] 
    ws = websocket.create_connection(websocketURL) 

    # Navigate to global.bing.com: 
    request = {} 
    request['id'] = 1 
    request['method'] = 'Page.navigate' 
    request['params'] = {"url": 'http://global.bing.com'} 
    ws.send(json.dumps(request)) 
    result = ws.recv() 
    print "Page.navigate: ", result 
    frameId = json.loads(result)['result']['frameId'] 

    # Enable page agent: 
    request = {} 
    request['id'] = 1 
    request['method'] = 'Page.enable' 
    request['params'] = {} 
    ws.send(json.dumps(request)) 
    print 'Page.enable: ', ws.recv() 

    # Retrieve resource contents: 
    request = {} 
    request['id'] = 1 
    request['method'] = 'Page.getResourceContent' 
    request['params'] = {"frameId": frameId, "url": 'http://www.bing.com'} 
    ws.send(json.dumps(request)) 
    result = ws.recv() 
    print("Page.getResourceContent: ", result) 

    # Close websocket connection 
    ws.close() 

if __name__ == '__main__': 
    send()