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

2024-05-23 15:52:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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。页面导航干得好,我得到了这样的结果: {“id”:1,“result”:{“frameId”:“8504.2”}}

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

我试着添加用户代理,但还是没用。在

谢谢。在


Tags: 方法importsendidjsonhttpwsrequest
1条回答
网友
1楼 · 发布于 2024-05-23 15:52:05

错误消息“Agent is not enabled”与HTTPUser-Agent报头无关,而是指chrome中需要启用的代理才能检索页面内容。在

术语“agent”有点误导性,因为protocol documentation表示需要启用才能调试它们的域(术语“agent”指的是Chrome内部实现的方式)

所以,问题是需要启用哪个域才能访问页面内容?事后看来,这是非常明显的:当我们在这个域中调用一个方法时,Page域需要被启用。不过,我是在绊倒了this example之后才发现的。在

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

  1. websockets连接需要在请求之间保持打开,因为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()

相关问题 更多 >