我想通过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}
我尝试添加用户代理,但仍无法正常工作。
感谢。
答案 0 :(得分:2)
错误消息"代理未启用"与HTTP User-Agent
标头无关,但是指的是chrome中需要启用的代理,以便检索页面内容。
术语"代理"有点误导,因为protocol documentation谈论需要启用的域以便调试它们(术语"代理"指的是内部实现Chrome的方式,我想) / p>
那么,问题是为了访问页面内容需要启用哪个域?事后看来很明显:我们在这个域中调用一个方法时需要启用Page
域。不过,我只是在遇到this example之后才发现这一点。
我将Page.enable
请求添加到脚本以激活Page
域后,错误消息消失了。但是,我遇到了另外两个问题:
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()