如何通过chrome远程调试获取网页资源内容

时间:2016-08-01 07:41:30

标签: python google-chrome websocket

我想通过Chrome调试协议获取网页资源内容使用python,从这个页面method-getResourceContent,我注意到这个方法:getResourceContent,需要params frameId和url.i认为这个方法是我需要的。 所以我做了这件事:

1.get start chrome as a server:。\ chrome.exe --remote-debugging-port = 9222

2.write python测试代码:

Z3_ast

3.Page.navigate工作正常,我有这样的事情: { “ID”:1, “结果”:{ “frameId”: “8504.2”}}

4.当我尝试方法:getResourceContent时,出现错误: {“error”:{“code”: - 32000,“message”:“代理未启用。”},“id”:1}

我尝试添加用户代理,但仍无法正常工作。

感谢。

1 个答案:

答案 0 :(得分:2)

错误消息"代理未启用"与HTTP User-Agent标头无关,但是指的是chrome中需要启用的代理,以便检索页面内容。

术语"代理"有点误导,因为protocol documentation谈论需要启用的域以便调试它们(术语"代理"指的是内部实现Chrome的方式,我想) / p>

那么,问题是为了访问页面内容需要启用哪个域?事后看来很明显:我们在这个域中调用一个方法时需要启用Page域。不过,我只是在遇到this example之后才发现这一点。

我将Page.enable请求添加到脚本以激活Page域后,错误消息消失了。但是,我遇到了另外两个问题:

  1. 需要在请求之间保持websockets连接,因为Chrome会在调用之间保持某种状态(例如代理是否已启用)
  2. 导航到 http://global.bing.com/ 时,浏览器会重定向到 http://www.bing.com/ (至少它是在我的电脑上)。这会导致Page.getResourceContent无法检索资源,因为请求的资源 http://global.bing.com/ 不可用。
  3. 解决这些问题后,我能够检索页面内容。这是我的代码:

    # 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()