解决selenium模块利用performance获取network日志请求报错的问题(亲测有效)

下面为大家讲解“解决selenium模块利用performance获取network日志请求报错的问题”的完整攻略。

背景说明

在使用Python的selenium模块时,我们可以通过performance方法来获取网页的性能数据,其中也包括了网络请求的日志。但是有些情况下会出现获取网络请求日志报错的情况。

常见问题

在使用driver.get_log('performance')获取网页性能数据时可能会遇到以下报错:

selenium.common.exceptions.WebDriverException: Message: unknown error: performance
log type 'performance' not found

这是因为Chrome浏览器版本更新后,从Chrome65版本开始,chrome的DevTools协议接口中调试协议 Protocol.Cmd 明确禁止向浏览器获取日志。因此在 Chrome65 版本及以上的浏览器中无法通过 selenum 的 get_log() 函数便捷地获取到 console, network, performance 等日志。

解决方法

我们可以通过设置ChromeOptions启用performance日志,并使用Chrome DevTools协议获取日志,以下是具体步骤:

  1. 安装Chrome浏览器驱动,并将其添加到系统环境变量。

  2. 安装selenium模块,以便在Python代码中调用。

  3. 下载最新版的Chrome浏览器并安装。

  4. 通过Chrome DevTools协议获取网络请求日志。

from selenium import webdriver
import json
from urllib import request
from urllib.error import HTTPError


url = 'http://www.baidu.com'

# 新建一个chrome浏览器实例
options = webdriver.ChromeOptions()
options.add_argument('--disable-infobars')
options.add_argument('--headless')
options.add_argument("--start-maximized")
options.add_argument("--disable-extensions")
options.add_argument("--disable-gpu")
prefs = {"download.default_directory": "d:\\temp", "profile.default_content_settings.popups": 0,
         "download.prompt_for_download": False, "download.directory_upgrade": True}
options.add_experimental_option("prefs", prefs)
options.add_experimental_option('w3c', False)  # 开启兼容模式
options.add_argument("--disable-web-security")
options.add_argument("--allow-running-insecure-content")
options.add_argument("window-size=1920x1080")
options.add_argument('--log-level=3')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
browser = webdriver.Chrome(options=options, executable_path='/usr/local/bin/chromedriver')
try:
    browser.get(url)

    # 获取Performance信息,即性能信息
    netlog = browser.execute_cdp_cmd('Performance.getManifestly', {})
    print(netlog)
finally:
    browser.quit()

该代码中,我们设置了Chrome浏览器的一些options,包括禁止显示浏览器的infobars、启用无头模式等。同时,我们也设置了Chrome浏览器的prefs属性,指定了下载文件的默认目录。在获取网络请求日志前,我们需要使用seleniumexecute_cdp_cmd方法执行Performance.getManifestly命令,最终得到的日志信息netlog是一个dict类型的变量。

示例说明

以下两个示例分别说明如何获取网络请求日志以及如何使用requests发送POST请求。

获取并保存请求日志

import json
import requests
from selenium import webdriver


# 新建一个chrome浏览器实例
options = webdriver.ChromeOptions()
options.add_argument('--disable-infobars')
options.add_argument('--headless')
prefs = {"download.default_directory": "d:\\temp", "profile.default_content_settings.popups": 0,
         "download.prompt_for_download": False, "download.directory_upgrade": True}
options.add_experimental_option("prefs", prefs)
options.add_experimental_option('w3c', False)  # 开启兼容模式
options.add_argument("--disable-web-security")
options.add_argument("--allow-running-insecure-content")
options.add_argument("window-size=1920x1080")
options.add_argument('--log-level=3')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
browser = webdriver.Chrome(options=options)

try:
    # 访问指定url,获取网络请求日志
    url = 'https://www.baidu.com'
    browser.get(url)
    netlog = browser.execute_cdp_cmd('Performance.getManifestly', {})

    # 保存网络请求日志
    with open('network_log.json', 'w', encoding='utf-8') as f:
        f.write(json.dumps(netlog))

finally:
    browser.quit()

该示例中,我们访问了百度网站,并通过selenium模块控制Chrome浏览器获取网页的网络请求日志,最终将其保存在了network_log.json文件中。

使用requests模块发送POST请求

import json
import requests
from selenium import webdriver


# 新建一个chrome浏览器实例
options = webdriver.ChromeOptions()
options.add_argument('--disable-infobars')
options.add_argument('--headless')
prefs = {"download.default_directory": "d:\\temp", "profile.default_content_settings.popups": 0,
         "download.prompt_for_download": False, "download.directory_upgrade": True}
options.add_experimental_option("prefs", prefs)
options.add_experimental_option('w3c', False)  # 开启兼容模式
options.add_argument("--disable-web-security")
options.add_argument("--allow-running-insecure-content")
options.add_argument("window-size=1920x1080")
options.add_argument('--log-level=3')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
browser = webdriver.Chrome(options=options)

try:
    # 访问指定url,获取网络请求日志
    url = 'https://www.baidu.com'
    browser.get(url)
    netlog = browser.execute_cdp_cmd('Performance.getManifestly', {})

    # 获取POST请求返回结果
    headers = {'Content-Type': 'application/json'}
    data = {"param1": "value1", "param2": "value2"}
    post_url = 'https://www.example.com/'
    r = requests.post(post_url, headers=headers, data=json.dumps(data))

finally:
    browser.quit()

该示例中,我们通过selenium模块控制Chrome浏览器获取网页的网络请求日志,并使用requests模块发送了一个POST请求,其中请求的数据以JSON格式编码,在请求头中指定Content-Type为application/json。程序最终将POST请求返回结果存储在变量r中,我们可以在后续对返回结果做进一步处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决selenium模块利用performance获取network日志请求报错的问题(亲测有效) - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • 如何使用Python在MySQL中修改表名?

    要使用Python在MySQL中修改表名,可以使用Python的内置模块sqlite3或第三方库mysql-connector-python。以下是使用mysql-connector-python在MySQL中修改表名的完整攻略: 连接 要连接到MySQL,需要提供MySQL的主机、用户名、和密码。可以使用以下代码连接: mysql.connector my…

    python 2023年5月12日
    00
  • python模块的安装以及安装失败的解决方法

    当我们在Python编程过程中需要使用各种模块来扩展Python的功能。然而,在安装Python模块时,我们可能会遇到各种错误。以下是Python模块安装以及安装失败的解决方法的完整攻略: 1. 使用pip安装模块 在Python中,我们可以使用pip命令来安装模块。例如,我们可以使用以下命令来安装numpy模块: pip install numpy 如果我…

    python 2023年5月13日
    00
  • 编写python代码实现简单抽奖器

    可以按照以下步骤编写Python代码实现简单抽奖器: 1. 安装必要的软件包 需要安装Python编程语言以及随附的pip软件包管理器。可以在Python的官方网站(https://www.python.org/)下载安装Python并启动安装过程。安装完成后,在终端中输入以下命令来检查Python和pip的版本: python –version pip …

    python 2023年6月3日
    00
  • python高效的素数判断算法

    Python高效的素数判断算法 素数判断是一个常见的算法问题,它在密码学、计算机科学等领域中有着广泛的应用。在Python中,可以使用多种算法实现素数判断,包括试除法、埃氏筛法、米勒-拉宾素性检验等。本文将详细讲解Python高效的素数判断算法,包括算法原理、Python实现过程和示例。 算法原理 试除是一种常用的素数判断算法,它的基本思想是:对于一个数$n…

    python 2023年5月13日
    00
  • python实现双色球随机选号

    Python实现双色球随机选号 简介 双色球是一种非常受欢迎的彩票游戏,我们可以使用Python来实现随机选号功能。本文将分别介绍如何使用Python实现双色球随机选号的代码和实现方法。 实现方法 双色球号码由6个红球号码和1个蓝球号码组成,范围分别是1~33和1~16。我们可以使用Python的random模块来生成随机数,从而得到随机选号。 生成红球号码…

    python 2023年6月3日
    00
  • Python-re中search()函数的用法详解(查找ip)

    下面是详细的攻略: Python-re中search()函数的用法详解(查找ip) Python的re模块提供了一系列正则表达式操作函数,其中search()函数用于在字符串中查找匹配正则表达式的第一个位置。本文将详细介绍search()函数的用法,并提供两个示例说明。 search()函数的基本用法 search()函数的基本用法如下: import re…

    python 2023年5月14日
    00
  • Selenium, Python (引发 TimeoutException(message, screen, stacktrace) TimeoutException)

    【问题标题】:Selenium, Python (raise TimeoutException(message, screen, stacktrace) TimeoutException)Selenium, Python (引发 TimeoutException(message, screen, stacktrace) TimeoutException) 【…

    Python开发 2023年4月8日
    00
  • Python中按键来获取指定的值

    当我们使用Python编写程序获取键盘输入时,可以使用Python内置的input()函数获取用户输入的字符串。但是当我们希望获取按键对应的值时,就需要使用第三方库来实现。 常见的获取按键对应值的第三方库有两种: keyboard pynput 这两种库都提供了相应的API以供我们使用,下面分别介绍它们的用法。 使用keyboard库 安装keyboard库…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部