Selenium Python - 获取网络响应正文

Posted

技术标签:

【中文标题】Selenium Python - 获取网络响应正文【英文标题】:Selenium Python - Get Network response body 【发布时间】:2021-03-28 16:39:41 【问题描述】:

我使用 Selenium 对来自网站的 GET 请求后的数据接收做出反应。 网站调用的API是不公开的,所以如果我使用请求的URL来检索数据,我会得到"message":"Unauthenticated."

到目前为止,我所做的只是检索响应的标头。

我发现here 使用driver.execute_cdp_cmd('Network.getResponseBody', ...) 可能是我的问题的解决方案。

这是我的代码示例:

import json
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

capabilities = DesiredCapabilities.CHROME
capabilities["goog:loggingPrefs"] = "performance": "ALL"
driver = webdriver.Chrome(
    r"./chromedriver",
    desired_capabilities=capabilities,
)

def processLog(log):
    log = json.loads(log["message"])["message"]
    if ("Network.response" in log["method"] and "params" in log.keys()):
        headers = log["params"]["response"]
        body = driver.execute_cdp_cmd('Network.getResponseBody', 'requestId': log["params"]["requestId"])
        print(json.dumps(body, indent=4, sort_keys=True))
        return log["params"]
        

logs = driver.get_log('performance')
responses = [processLog(log) for log in logs]

不幸的是,driver.execute_cdp_cmd('Network.getResponseBody', ...) 返回:

unknown error: unhandled inspector error: "code":-32000,"message":"No resource with given identifier found"

你知道我错过了什么吗?

您对如何检索响应正文有任何想法吗?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

为了检索响应正文,您必须专门收听Network.responseReceived

def processLog(log):
    log = json.loads(log["message"])["message"]
    if ("Network.responseReceived" in log["method"] and "params" in log.keys()):
        body = driver.execute_cdp_cmd('Network.getResponseBody', 'requestId': log["params"]["requestId"])

但是,我最终使用了依赖requests 的不同方法。我刚刚从浏览器控制台(网络 > 标头 > 请求标头 > 授权)中检索了授权令牌,并使用它来获取我想要的数据:

import requests

def get_data():
    url = "<your_url>"
    headers = 
        "Authorization": "Bearer <your_access_token>",
        "Content-type": "application/json"
    
    params = 
        key: value,
        ...
    

    r = requests.get(url, headers = headers, params = params)

    if r.status_code == 200:
        return r.json()

【讨论】:

嗯,我已经验证了方法是 responseReceived 但是在getResponseBody 上我仍然得到你原来的错误 你是我的救星!!!!!!

以上是关于Selenium Python - 获取网络响应正文的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Selenium 4 (devTools) 从网络选项卡获取响应正文

selenium获取网络响应的正文

selenium获取网络响应的正文

selenium获取网络响应的正文

如何识别 ReCaptcha V2 的 32 位数据站点密钥以使用 Selenium 和 Python 请求以编程方式获取有效响应?

使用 Selenium 捕获网络 XHR 日志(带有参数的请求/响应)