解决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实现多张图片合成一张马赛克图片

    下面是详细的“Python实现多张图片合成一张马赛克图片”的攻略。 1. 前置准备: 在实现该功能之前,你需要先安装Pillow和numpy两个Python库。其中,Pillow可以用于图片处理,numpy则可以用于矩阵计算。你可以通过以下命令安装: pip install Pillow pip install numpy 2. 基本思路: 构建一张目标大小…

    python 2023年5月19日
    00
  • Python遍历目录中的所有文件的方法

    这里为您提供 Python 遍历目录中的所有文件的方法的完整攻略: 1. os.walk() 方法 在 Python 中,我们可以使用 os.walk() 方法来遍历文件夹中的所有文件。该方法返回一个迭代器对象,该迭代器生成每个文件夹中所有文件的三元组 (dirpath, dirnames, filenames),其中 dirpath 是文件夹路径, dir…

    python 2023年6月2日
    00
  • python安装scipy的方法步骤

    以下是“Python安装Scipy的方法步骤”的攻略,包括以下几个步骤。 1. 准备环境 首先,安装Python和pip。如果您已经安装了Python和pip,请跳过此步骤,直接进入第二步。 下载Python:下载链接 安装pip:在命令行中输入以下命令即可安装pip。 python -m ensurepip –default-pip 2. 安装依赖 Sc…

    python 2023年5月18日
    00
  • pandas读取中文xlsx文件出现的问题

    下面是关于“pandas读取中文xlsx文件出现的问题”的完整实例教程: 问题描述 pandas是一个非常方便的数据处理库,在实际的数据处理过程中,我们常常使用pandas来读取和写入数据。但是,在读取中文文件时,可能会出现各种问题,一些奇怪的字符和编码问题经常会让我们头疼不已。本文将介绍pandas读取中文xlsx文件出现的问题,及其解决方法。 实例说明1…

    python 2023年5月13日
    00
  • Python操作csv文件之csv.writer()和csv.DictWriter()方法的基本使用

    Python语言提供了内置的CSV模块,可以非常方便地读写CSV格式的文件。其中,csv.writer()和csv.DictWriter()是两种常用的方法,下面我们来详细讲解它们的基本使用。 csv.writer()方法 csv.writer()方法可以将数据以CSV格式写入文件中。它的基本语法如下: import csv with open(‘file.…

    python 2023年6月3日
    00
  • Python实现曲线点抽稀算法的示例

    Python实现曲线点抽稀算法的示例攻略 曲线点抽稀算法是一种常用的数据处理算法,它可以将线上的点进行抽稀,从而减少数据量,提高数据处理效率。在本攻略中,我们将介绍如何使用Python实现曲线点抽稀算法提供两个示例来说明如何使用曲线点抽稀算法进行数据处理。 步骤1:了解曲线点抽稀算法 在曲线点抽稀算法中,我们需要考虑以下因素: 曲线:曲线是指需要进行抽的曲线…

    python 2023年5月14日
    00
  • 详解python调用cmd命令三种方法

    下面是关于“详解Python调用cmd命令三种方法”的完整攻略: 概述 在Python中,我们可以使用subprocess模块来调用命令行(cmd)命令。在这里,我们将介绍三种使用subprocess模块调用命令行命令的方法,以及如何在出现错误时处理它们。 三种方法 方法一:使用subprocess.call() subprocess.call()函数可以执…

    python 2023年6月2日
    00
  • python自动脚本的pyautogui入门学习

    Python自动脚本的PyAutoGUI入门学习 介绍 PyAutoGUI是一个Python模块,可以自动完成一些鼠标和键盘操作,甚至可以获取屏幕上的图像内容。它广泛应用于自动化测试、屏幕录制和一些重复性操作等场景。 本文将从安装PyAutoGUI讲起,一步一步介绍其基本使用方法,包括移动鼠标、点击、输入等操作,并给出两个具体的示例说明。 安装 在使用PyA…

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