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

yizhihongxing

下面为大家讲解“解决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 tkinter制作用户登录界面的简单实现

    下面就来详细讲解“python tkinter制作用户登录界面的简单实现”的完整攻略。该攻略分为以下几个步骤: 步骤一:导入Tkinter模块并创建窗口 首先,需要导入Tkinter模块并创建一个窗口,代码如下: # 导入Tkinter模块 import tkinter as tk # 创建窗口 window = tk.Tk() window.title(&…

    python 2023年6月2日
    00
  • 一篇文章告诉你如何用Python控制Excel实现自动化办公

    下面是详细讲解如何用Python控制Excel实现自动化办公的完整实例教程。 一、准备工作 在执行示例代码之前,需要安装一些必要的第三方库,包括: pandas openpyxl 在安装完这两个库之后,就可以开始编写代码了。 二、读取Excel文件 通过Python库 openpyxl,我们可以轻松地读取Excel文件。下面是示例代码: import ope…

    python 2023年5月13日
    00
  • Python学习之os包使用教程详解

    Python学习之os包使用教程详解 1. os包简介 Python的os包是用来进行与操作系统交互的接口,包括文件、目录、内存等操作。通过使用os包,我们可以在Python环境下实现与操作系统交互,比如创建删除目录,修改文件属性等。 2. os包的使用 2.1 常用方法介绍 os包中常用的方法有以下几个: os.getcwd() 获取当前目录的绝对路径 o…

    python 2023年5月14日
    00
  • Python利用Django如何写restful api接口详解

    下面是Python利用Django写restful API接口的攻略: 1. 简介 restful API(Representational State Transfer API)是一种风格规范,在web开发中被广泛应用。它建立在HTTP协议之上,可以使用多种编程语言实现,比如Python。 Django是Python中最流行的web框架之一,也提供了很好的…

    python 2023年5月13日
    00
  • 详解Python Matplotlib解决绘图X轴值不按数组排序问题

    下面是详解Python Matplotlib解决绘图X轴值不按数组排序问题的完整攻略。 问题描述 在使用Python库Matplotlib进行绘图时,有时候在X轴上显示的数据值不会按照原始数组中的顺序排列,从而导致绘图结果不符合预期。 解决方案 获取原始数组中的索引 解决此问题的一种方案是,先获取原始数组中每个值的索引,然后按照索引的大小顺序重新排列数组。这…

    python 2023年5月18日
    00
  • Python+Pytest实现压力测试详解

    在Python中,我们可以使用Pytest库实现压力测试。Pytest是一个功能强大的Python测试框架,可以用于编写各种类型的测试,包括单元测试、集成测试和压力测试。本文将介绍如何使用Python和Pytest实现压力测试,并提供两个示例代码。 方法1:使用Pytest实现压力测试 使用Pytest实现压力测试是Python中最常用的方法之一。以下是示例…

    python 2023年5月15日
    00
  • Python实现暴力破解有密码的zip文件的方法

    实现暴力破解有密码的zip文件,其主要思路是通过循环遍历所有可能的密码进行尝试。具体步骤如下: 导入必要的库 需要导入zipfile、tqdm、string、itertools等库。 import zipfile from tqdm import tqdm import string import itertools 设置密码组成方式 通过string.pr…

    python 2023年6月3日
    00
  • Python解析json代码实例解析

    下面我将详细讲解“Python解析json代码实例解析”的完整攻略。 前言 在Web开发中,JSON作为一种轻量级的数据交换格式,已经被广泛应用。Python作为一门优秀的编程语言,提供了许多强大的库来解析JSON,如:json、jsonpickle、simplejson等。本文将以json库为例,介绍如何在Python中解析JSON数据。 安装json库 …

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