我想通过Chrome调试协议获得网页资源内容使用python,从这个页面方法-getResourceContent,我注意到了这个方法:getResourceContent,需要params frameId和url.i认为这种方法是我所需要的。所以我做了这件事:
1.启动chrome服务器:.\chrome.exe --远程调试-端口=9222
2.编写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时,出现了以下错误:{“错误”:{“代码”:-32000,“消息”:“代理未启用。”},"id":1}
我试着添加用户代理,但仍然不起作用。
谢谢。
发布于 2017-08-05 15:47:01
错误消息“代理未启用”与header无关,而是指铬中的代理,需要启用该代理才能检索页面内容。
“代理”一词有点误导,因为协议文档谈到了需要启用才能调试它们的域(我认为,“代理”一词指的是在Chrome内部实现代理的方式)。
因此,问题是需要启用哪个域才能访问页面内容?事后看来,这是相当明显的:在我们调用该域中的方法时,需要启用Page域。不过,我是在被这个例子绊倒后才发现这一点的。
一旦我将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()https://stackoverflow.com/questions/38693379
复制相似问题