2016-08-01 132 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()