【问题标题】:Selenium Python - Get Network response bodySelenium Python - 获取网络响应正文
【发布时间】: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"}

你知道我错过了什么吗?

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

感谢您的帮助!

【问题讨论】:

    标签: python selenium http selenium-webdriver xmlhttprequest


    【解决方案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 上我仍然得到你原来的错误
    • 你是我的救星!!!!!!
    猜你喜欢
    • 2021-12-26
    • 2020-05-17
    • 2021-10-10
    • 2018-02-03
    • 2023-03-17
    • 1970-01-01
    • 2021-08-11
    • 2020-09-04
    • 2022-01-24
    相关资源
    最近更新 更多