首页 > 编程问答 >使用 Selenium 捕获 XHR 请求时遇到问题

使用 Selenium 捕获 XHR 请求时遇到问题

时间:2024-07-26 10:47:49浏览次数:18  
标签:python selenium-webdriver xmlhttprequest

首先,我不是开发人员,所以使用 ai 为我生成一个代码以从网页获取 xhr 请求,即: https://www.oddsportal.com/football/brazil/serie-a/bragantino -athletico-pr-xx0ujiJ5/ 这只是一个示例。我想从该页面上的 xhr 请求获取分数,而不是使用其他方法(例如使用类等定位它)。

对我来说最有趣的是,当您打开网页时,我想要获取的网络请求不会出现,直到你点击另一个选项卡或桌面并返回目标页面,就会出现我需要的请求。该请求的响应将为我提供比赛得分数据。

这是硒代码,它捕获一些请求,但不是我要查找的请求。代码会告诉你我这里的情况。由于我所在国家/地区的网页的可访问性,我必须仅使用带有 chrome 开发工具的 Opera 浏览器。提供此信息,但我不相信情况是这样,因为此代码正在获取一些请求,并将它们列在终端上。如果有人模拟这个,请帮助我。

下面是我的py文件的代码。我期望从代码中捕获请求名称:1-xx0ujiJ5-yj3ae.dat,其网址为: https://www.oddsportal.com/feed/postmatch-score/1-xx0ujiJ5-yj3ae.dat

import json
    import time
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.chrome.options import Options

    Paths
    driver_path = r'C:\Users\tugbe\Desktop\basit_oddsportal\drivers\chromedriver-win64\chromedriver.exe'
    binary_path = r'C:\Users\tugbe\AppData\Local\Programs\Opera\opera.exe'

    Set up Chrome options for Opera
    options = Options()
    options.binary_location = binary_path
    options.add_argument('--ignore-certificate-errors')
    options.add_argument('--ignore-ssl-errors')
    options.add_argument("--auto-open-devtools-for-tabs")  # Automatically open DevTools
    options.debugger_address = "127.0.0.1:9222"  # Connect to the existing Opera instance

    Enable Performance logging
    options.set_capability('goog:loggingPrefs', {'performance': 'ALL'})

    Initialize the WebDriver service
    service = Service(driver_path)

    Initialize the WebDriver with options and capabilities
    driver = webdriver.Chrome(service=service, options=options)

    Enable Network logging
    driver.execute_cdp_cmd('Network.enable', {})

    def capture_network_logs(duration=60):
    start_time = time.time()
    captured_urls = set()
    print(f"Capturing network logs for {duration} seconds...")
    while time.time() - start_time < duration:
    logs = driver.get_log('performance')
    for entry in logs:
    log = json.loads(entry['message'])['message']
    if log['method'] == 'Network.requestWillBeSent':
    request = log['params']['request']
    if 'url' in request and request['url'] not in captured_urls:
    print(f"Request URL: {request['url']}")
    print(f"Request Method: {request['method']}")
    print(f"Request Headers: {json.dumps(request['headers'], indent=2)}")
    print("=" * 80)
    captured_urls.add(request['url'])
    time.sleep(1)  # Sleep for a short while before capturing logs again

    try:
    Open a new tab in the existing Opera window
    driver.execute_script("window.open('about:blank', '_blank');")
    driver.switch_to.window(driver.window_handles[-1])

    Open the target URL in the new tab
    url = 'https://www.oddsportal.com/football/brazil/serie-a/bragantino-athletico-pr-xx0ujiJ5/'
    driver.get(url)

    Wait until the page is loaded
    time.sleep(10)  # Wait for 10 seconds to ensure the page is fully loaded

    Inspect an element to trigger the DevTools
    driver.execute_script("document.querySelector('body').click();")

    Wait a bit to ensure the element is inspected
    time.sleep(5)

    Refresh the page to ensure all requests are captured
    driver.refresh()

    Wait until the page is loaded again
    time.sleep(10)

    Click on the second opened tab
    driver.switch_to.window(driver.window_handles[1])

    Wait a bit in the second tab
    time.sleep(5)

    Switch back to the target tab
    driver.switch_to.window(driver.window_handles[-1])

    Wait a bit to ensure the switch is complete
    time.sleep(5)

    Capture and print network logs for 1 minute (60 seconds)
    capture_network_logs(duration=60)

    finally:
    Close the WebDriver
    driver.quit()


问题在于正在尝试在请求发生之前捕获请求。已经正确地识别出在单击远离页面然后返回之前不会加载包含分数数据的 XHR 请求。

当前的代码打开页面,等待,然后 开始 监听网络请求。需要更改代码的结构,以便在与页面交互以触发请求 之后 监听请求。

以下是如何修改代码以捕获所需 XHR 请求的方法:

import json
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

# ...(现有的路径、选项和服务设置)...

driver = webdriver.Chrome(service=service, options=options)
driver.execute_cdp_cmd('Network.enable', {})

def capture_network_logs(duration=60):
    start_time = time.time()
    captured_urls = set()
    print(f"捕获网络日志 {duration} 秒...")
    while time.time() - start_time < duration:
        logs = driver.get_log('performance')
        for entry in logs:
            log = json.loads(entry['message'])['message']
            if log['method'] == 'Network.requestWillBeSent':
                request = log['params']['request']
                if 'url' in request and request['url'] not in captured_urls:
                    print(f"请求 URL: {request['url']}")
                    print(f"请求方法: {request['method']}")
                    print(f"请求标头: {json.dumps(request['headers'], indent=2)}")
                    print("=" * 80)
                    captured_urls.add(request['url'])

                    # 检查是否是目标请求
                    if '1-xx0ujiJ5-yj3ae.dat' in request['url']:
                        # 在此处处理请求,例如,提取分数数据
                        print("找到目标请求!")

        time.sleep(1)

try:
    # ...(现有的打开选项卡和加载 URL 的代码)...

    # ***在切换选项卡之前***,开始捕获网络日志
    capture_network_logs()

    # ...(现有的切换选项卡和与页面交互的代码)...

finally:
    driver.quit()

此代码中的更改是:

  1. 在与页面交互以触发 XHR 请求 之前 启动 capture_network_logs() 函数。 这可确保在请求发生时监听它。
  2. capture_network_logs() 函数中,添加了一个条件来检查捕获的请求是否是正在寻找的请求。 如果是,则可以从请求中提取分数数据。

通过在与页面交互以触发请求 之前 开始监听网络请求,应该能够使用 Selenium 成功捕获所需的 XHR 请求。

标签:python,selenium-webdriver,xmlhttprequest
From: 78790854

相关文章

  • 如何将Python嵌入.Net?
    我尝试基于文档此处和此处使用pythonnet将Python嵌入到.Net中。这是我的代码Runtime.PythonDLL=@"D:\Dev\Console\.conda\python311.dll";PythonEngine.Initialize();dynamicsys=Py.Import("sys");Console.WriteLine("Pythonversion:&quo......
  • 使用pybind11封装c++的dll,供python调用
    用pip安装好pybind11 文件清单,都写在一个目录里//文件名:add.cppextern"C"doubleadd(doublein1,doublein2){returnin1+in2;}//文件名:sub.cppextern"C"doublesub(doublein1,doublein2){returnin1-in2;}//文件名:mul.cppextern"......
  • python-myStudyList
     1  下载软件1.1下载python最新版本并安装下载地址:百度搜索python官网。WelcometoPython.org。 1.2官网学习网页:PythonTutorials–RealPython   1.3也可以下载集成环境软件Anaconda。 Anaconda软件商城官方正版免费下载(msc23.cn) 2 ......
  • Python语法基础
    基本语句输入input() eg:输出print(内容)注释单行注释:#注释内容多行注释:"""注释内容"""数据类型: 字面量:整型、浮点数、字符串......intfloatstring查看数据类型:type(数据)查看数据类型 转换函数int(x):将x转换成整数类型float(x):将x转......
  • PyTesseract 不提取文本?我是所有这些Python的新手,请需要h3lp
    它不想从图像中提取文本,就像终端保持黑色并带有空格,就像它实际上试图提取文本一样,这是我的代码和图像从PIL导入图像导入pytesseract导入CV2“C:\用户\埃米利亚诺\下载\practic.png”pytesseract.pytesseract.tesseract_cmd="C:\ProgramFiles\Tesseract-OCR\tesseract.exe......
  • Python安装第三方库
    Python安装PILPIL(PythonImagingLibrary)是一个旧的Python库,用于处理图像。然而,PIL已经不再维护,并被一个名为Pillow的库所取代。Pillow是PIL的一个分支,并且完全兼容PIL。建议使用Pillow而不是PIL。pipinstallpillowPython安装moviepymoviepy是一个用于视频编辑的Python库,......
  • 优化Python中图像中的OCR文本检测
    我目前正在用python编写一个程序,该程序获取包含大量文本的图像,将其提取到.txt文件,然后将找到的单词与另一个文件中的单词列表进行比较,并创建一些坐标(根据像素)在图像中找到的单词中,如果找到图像,则会在图像中绘制红色方块。到目前为止,我已经正确处理了坐标部分,在单词周围绘制了......
  • Python保存字典类型数据到文件的三种方法
    1、在Python中使用pickle模块的dump函数将字典保存到文件中importpicklemy_dict={'Apple':4,'Banana':2,'Orange':6,'Grapes':11}#保存文件withopen("myDictionary.pkl","wb")astf:pickle.dump(my_dict,tf)......
  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-53- 处理面包屑(详细教程)
    1.简介面包屑(Breadcrumb),又称面包屑导航(BreadcrumbNavigation)这个概念来自童话故事“汉赛尔和格莱特”,当汉赛尔和格莱特穿过森林时,不小心迷路了,但是他们发现沿途走过的地方都撒下了面包屑,让这些面包屑来帮助他们找到回家的路。所以,面包屑导航的作用是告诉访问者他们在网站中......
  • 如何使用 Python 在 Telegram 中进行标签搜索
    Telegram最近添加了一项新功能,可以在所有公共频道中同时按主题标签进行搜索:https://telegram.org/blog/message-effects-and-more#hashtag-search如何进行此类搜索用蟒蛇?(Telethon,Python-Telegram-Bot,...)我在Telethon文档中找到了这个函数:https://tl.......