Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
使用 Python 和 Selenium 自动化捕获新浏览器标签页的网页响应_创想鸟

使用 Python 和 Selenium 自动化捕获新浏览器标签页的网页响应

使用 Python 和 Selenium 自动化捕获新浏览器标签页的网页响应

本文将详细介绍如何利用 python 的 selenium 库自动化捕获从现有浏览器会话中打开的新标签页内容,特别针对目标网站自动生成 json 响应的场景。通过模拟用户行为,selenium 能够有效管理多窗口、切换焦点并提取所需数据,从而实现复杂的网页自动化和数据抓取任务。

引言:自动化网页响应捕获的挑战

在进行网页自动化和数据抓取时,我们经常会遇到一些挑战,例如目标网站需要用户登录状态、执行复杂的 JavaScript 交互,或者在特定操作后自动打开一个新标签页来显示响应数据(如 JSON 格式)。传统的 HTTP 请求库(如 requests)难以处理这类场景,因为它无法模拟完整的浏览器环境和会话状态。

针对这种需要模拟真实浏览器行为的场景,Selenium 提供了一个强大的解决方案。它允许开发者通过编程方式控制浏览器,执行点击、输入、等待等操作,并能够管理多个窗口或标签页,从而捕获那些在浏览器新标签页中呈现的动态内容。

Selenium 简介与环境配置

Selenium 是一个用于自动化浏览器操作的工具集。它支持多种浏览器(如 Chrome, Firefox, Edge 等),并提供了多种编程语言的 API。

1. 安装 Selenium 库

首先,需要通过 pip 安装 Selenium Python 库:

立即学习“Python免费学习笔记(深入)”;

pip install selenium

2. 下载并配置 WebDriver

Selenium 需要一个 WebDriver 来与具体的浏览器进行通信。你需要根据你使用的浏览器下载相应的 WebDriver。

Chrome 浏览器: 下载 ChromeDriver,确保其版本与你的 Chrome 浏览器版本兼容。Firefox 浏览器: 下载 GeckoDriver。Edge 浏览器: 下载 Edge WebDriver。

下载后,将 WebDriver 可执行文件放置在系统 PATH 环境变量中包含的目录里,或者在初始化 WebDriver 时指定其路径。

3. 初始化 WebDriver

以下代码展示了如何初始化 Chrome WebDriver:

from selenium import webdriverfrom selenium.webdriver.chrome.service import Service# 如果 WebDriver 不在 PATH 中,需要指定其路径# service = Service('/path/to/chromedriver')# driver = webdriver.Chrome(service=service)# 如果 WebDriver 在 PATH 中,可以直接初始化driver = webdriver.Chrome()

核心实现:捕获新标签页内容

捕获在新标签页中打开的响应数据,主要涉及以下几个关键步骤:

1. 启动浏览器并导航至初始页面

首先,使用 WebDriver 打开会触发新标签页的初始 URL。

driver.get("https://your-initial-website.com")

2. 识别并等待新标签页打开

当网站执行某个操作(例如,点击一个按钮或提交一个表单)后,可能会在新标签页中显示结果。我们需要等待这个新标签页完全打开。Selenium 通过管理 window_handles 来识别不同的窗口或标签页。

from selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECimport time# 存储原始窗口句柄original_window = driver.current_window_handleprint(f"原始窗口句柄: {original_window}")# 假设某个操作会触发新标签页,这里模拟点击一个元素# 例如: driver.find_element(By.ID, "triggerButton").click()# 使用显式等待,等待窗口句柄数量发生变化(即新标签页打开)# 如果预期只有一个新标签页,则等待窗口总数变为2WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))# 获取所有窗口句柄all_windows = driver.window_handlesprint(f"所有窗口句柄: {all_windows}")# 找到新打开的窗口句柄(与原始句柄不同的那个)new_window = [window for window in all_windows if window != original_window][0]print(f"新窗口句柄: {new_window}")

3. 切换到新标签页

找到新标签页的句柄后,需要使用 switch_to.window() 方法将 WebDriver 的焦点切换到该标签页,以便对其进行操作。

driver.switch_to.window(new_window)print(f"已切换到新标签页,标题: {driver.title}")

4. 提取新标签页的数据

在新标签页中,通常会显示纯文本的 JSON 数据。我们可以通过获取页面的 page_source 或直接提取

标签的文本内容来获取这些数据。

from selenium.webdriver.common.by import Byimport json# 等待页面加载完成,或者等待特定的元素出现WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "body")))try:    # 获取整个页面 body 的文本内容,这通常是纯 JSON    json_text = driver.find_element(By.TAG_NAME, "body").text    data = json.loads(json_text) # 尝试解析 JSON    print("成功解析 JSON 数据:")    print(json.dumps(data, indent=2)[:500] + "...") # 打印前500字符except json.JSONDecodeError:    print("无法解析为 JSON,可能是页面内容不是纯 JSON 或格式错误。")    print("页面内容示例 (前500字符):")    print(driver.page_source[:500] + "...")except Exception as e:    print(f"提取或解析数据时发生错误: {e}")

5. 关闭新标签页并返回原始标签页

完成数据提取后,为了保持浏览器状态的整洁,可以关闭新标签页,并根据需要切换回原始标签页。

# 关闭当前(新)标签页driver.close()# 切换回原始标签页(如果需要继续操作)driver.switch_to.window(original_window)print(f"已切换回原始标签页,标题: {driver.title}")

示例代码:捕获动态 JSON 响应

以下是一个综合示例,演示如何使用 Selenium 自动化捕获在新标签页中打开的 JSON 响应。请注意,https://your-initial-website.com 和其触发新标签页的机制需要根据实际情况进行调整。

from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.common.exceptions import TimeoutExceptionimport jsonimport timedef capture_new_tab_json_response(initial_url, driver_path=None):    """    使用 Selenium 捕获在新标签页中打开的 JSON 响应。    Args:        initial_url (str): 触发新标签页的初始 URL。        driver_path (str, optional): WebDriver 的路径。如果已在 PATH 中,则无需提供。    Returns:        dict or None: 如果成功解析到 JSON 数据则返回字典,否则返回 None。    """    driver = None    try:        if driver_path:            from selenium.webdriver.chrome.service import Service            service = Service(driver_path)            driver = webdriver.Chrome(service=service)        else:            driver = webdriver.Chrome()        print(f"导航到初始页面: {initial_url}")        driver.get(initial_url)        # 存储原始窗口句柄        original_window = driver.current_window_handle        print(f"原始窗口句柄: {original_window}")        # 模拟触发新标签页的操作(例如点击一个链接或按钮)        # 在实际应用中,这里需要根据目标网站的实际情况编写代码        # 假设在 initial_url 页面加载后,会有一个脚本自动打开新标签页        # 或者需要点击某个元素来触发        # 例如:        # try:        #     # 查找一个可能触发新标签页的元素并点击        #     trigger_element = WebDriverWait(driver, 10).until(        #         EC.element_to_be_clickable((By.ID, "some-trigger-id"))        #     )        #     trigger_element.click()        #     print("已点击触发新标签页的元素。")        # except TimeoutException:        #     print("未找到触发新标签页的元素或页面加载超时。")        #     # 如果没有显式触发动作,则假设页面加载后会自动打开新标签页        # 等待新标签页打开        print("等待新标签页打开...")        WebDriverWait(driver, 15).until(EC.number_of_windows_to_be(2))        all_windows = driver.window_handles        new_window = [window for window in all_windows if window != original_window][0]        # 切换到新标签页        driver.switch_to.window(new_window)        print(f"已切换到新标签页,标题: {driver.title}")        # 等待新标签页内容加载完成        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "body")))        json_data = None        try:            # 获取新标签页的 body 文本,通常纯 JSON 会直接显示在这里            json_text = driver.find_element(By.TAG_NAME, "body").text            json_data = json.loads(json_text)            print("成功捕获并解析 JSON 数据。")            # print(json.dumps(json_data, indent=2)[:500] + "...") # 打印部分数据        except json.JSONDecodeError:            print("新标签页内容不是有效的 JSON 格式。")            print("新标签页内容示例 (前500字符):")            print(driver.page_source[:500] + "...")        except Exception as e:            print(f"提取或解析数据时发生错误: {e}")        return json_data    except TimeoutException:        print("等待新标签页或元素超时。")        return None    except Exception as e:        print(f"发生未知错误: {e}")        return None    finally:        if driver:            # 关闭新标签页            if driver.current_window_handle != original_window:                driver.close()            # 切换回原始标签页并关闭整个浏览器会话            driver.switch_to.window(original_window)            driver.quit()            print("浏览器已关闭。")# 示例调用if __name__ == "__main__":    # 替换为你的 WebDriver 路径,如果已在 PATH 中则设为 None    # CHROME_DRIVER_PATH = '/usr/local/bin/chromedriver'     CHROME_DRIVER_PATH = None     # 替换为实际会触发新标签页的 URL    # 为了演示,这里使用一个假设的 URL,实际应用中请替换为 instafinsta.com 等    # 请注意:直接访问 instafinsta.com 可能需要用户手动操作,    # 这里的 initial_url 应该指向完成操作后会打开 JSON 新标签页的那个 URL    # 或者,如果 initial_url 是一个能通过 JS 模拟点击打开新标签页的测试页面,会更好    # 假设一个测试页面,点击后会打开一个包含 JSON 的新标签页    # 实际场景中,这可能是你完成某个操作后,网站自动跳转或打开的 JSON 页面    test_initial_url = "https://www.example.com" # 这是一个占位符,请替换为实际触发页面    # 一个包含 JSON 的 URL,用于模拟新标签页内容    # 实际应用中,新标签页的 URL 通常是动态生成的,但内容是纯 JSON    # 例如:https://api.github.com/users/octocat    print("--- 开始捕获 JSON 响应 ---")    captured_data = capture_new_tab_json_response(test_initial_url, CHROME_DRIVER_PATH)    if captured_data:        print("n--- 捕获到的 JSON 数据摘要 ---")        print(json.dumps(captured_data, indent=2)[:500] + "...")    else:        print("n未能成功捕获或解析 JSON 数据。")    print("--- 捕获结束 ---")

重要提示:在上述示例中,test_initial_url 是一个占位符。在实际应用中,你需要将它替换为你的目标网站(例如 instafinsta.com)中,在用户完成某些操作后会打开新标签页并显示 JSON 响应的那个 URL。如果该网站需要登录或复杂的交互才能触发新标签页,你还需要在 driver.get(initial_url) 之后,添加相应的 Selenium 代码来模拟这些用户行为(如输入用户名密码、点击登录按钮、输入故事链接等)。

注意事项与最佳实践

显式等待(Explicit Waits): 始终使用 WebDriverWait 和 expected_conditions 来等待页面元素加载或特定条件满足。这

以上就是使用 Python 和 Selenium 自动化捕获新浏览器标签页的网页响应的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1586276.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Python中利用正则表达式精确匹配URL中的关键词
上一篇 2025年12月23日 02:24:21
CSS背景图层叠顺序控制:深入理解与实践
下一篇 2025年12月23日 02:24:31

相关推荐

  • 解决TCPDF保存文件权限问题的完整指南

    本文旨在解决使用tcpdf在%ignore_a_1%中生成pdf并保存到服务器(’f’模式)时遇到的“permission denied”错误,尤其是在macos环境下。核心问题通常源于不正确的服务器文件路径或目标文件夹缺乏写入权限。教程将详细阐述如何构建正确的绝对文件路径,…

    2026年9月22日
    100
  • Java集合框架在实际项目中的最佳实践

    合理选择集合类型并预设容量,使用不可变集合保护数据,避免遍历中修改结构,可提升Java程序性能与安全性。 Java集合框架是开发中使用最频繁的工具之一,合理使用能显著提升代码的可读性、性能和稳定性。在实际项目中,遵循一些最佳实践可以避免常见陷阱,提高程序健壮性。 选择合适的集合类型 不同场景应选用最…

    2026年9月22日
    000
  • qq浏览器如何清理dns缓存_QQ浏览器强制刷新与清除DNS缓存指南

    首先清除QQ浏览器DNS缓存:打开应用→点击「我的」→进入「设置」→选择「清理浏览数据」→勾选「DNS缓存」→点击「立即清理」;随后可通过在地址栏添加「#refresh」实现强制刷新;也可使用无痕模式验证问题是否由缓存引起。 如果您尝试访问某个网站,但页面加载缓慢或显示错误,可能是由于本地DNS缓存…

    2026年9月22日
    100
  • mysql如何输入批量插入 mysql写多条insert代码教程

    mysql如何输入批量插入 mysql写多条insert代码教程mysql如何输入批量插入 mysql写多条insert代码教程mysql如何输入批量插入 mysql写多条insert代码教程mysql如何输入批量插入 mysql写多条insert代码教程

    mysql批量插入数据有四种主要方式。1.单条insert多值插入,语法简单但可能超包限制且全失败风险高;2.多条insert加事务,减少交互次数但占用资源多;3.load data infile性能最好,需处理文件权限及转义;4.编程语言批量功能灵活处理数据但需额外编码。选择依据为:小数据用多值i…

    2026年9月22日 • 用户投稿
    000
  • PHPRestfulAPI怎么开发_PHP构建高效安全的RestfulAPI教程

    答案:本文介绍如何用PHP构建高效安全的Restful API,涵盖设计规范、项目结构、数据库操作、安全机制、统一响应格式及性能优化。遵循Restful风格使用标准HTTP方法与状态码,通过index.php统一入口路由请求至控制器;采用PDO预处理防止SQL注入,结合JWT实现认证授权,确保输入验…

    2026年9月22日
    100
  • win10系统图标(如此电脑)太大怎么办_win10系统图标大小调整方法

    首先通过快捷键Ctrl加鼠标滚轮可快速调整桌面图标大小,其次在显示设置中修改缩放比例能全局调整界面元素,最后若因间距异常导致图标过大,可通过注册表将IconSpacing和IconVerticalSpacing值改为-1125后重启生效。 如果您发现Windows 10系统中的图标(如“此电脑”)显…

    2026年9月22日
    100
  • CentOS7搭建个人站点

    CentOS7搭建个人站点CentOS7搭建个人站点CentOS7搭建个人站点CentOS7搭建个人站点

    在本文中,我们将指导您在centos7系统上使用httpd搭建个人网站。httpd是apache http服务器的主程序,设计为一个独立运行的后台进程,负责建立处理请求的子进程或线程池。 首先,我们需要通过rpm命令检查系统中是否已安装httpd: rpm -qa | grep httpd 如果执行…

    2026年9月22日 • 用户投稿
    200
  • VSCode 怎样配置项目的依赖包自动安装 VSCode 项目依赖包自动安装的配置指南​

    VSCode 怎样配置项目的依赖包自动安装 VSCode 项目依赖包自动安装的配置指南​VSCode 怎样配置项目的依赖包自动安装 VSCode 项目依赖包自动安装的配置指南​VSCode 怎样配置项目的依赖包自动安装 VSCode 项目依赖包自动安装的配置指南​VSCode 怎样配置项目的依赖包自动安装 VSCode 项目依赖包自动安装的配置指南​

    vscode没有内置“一键安装所有依赖”功能,因为它作为通用编辑器需保持轻量与灵活性,无法预设所有项目的依赖管理逻辑;要实现类似效果,最有效的方法是通过配置tasks.json和launch.json实现半自动安装:1. 在项目根目录的.vscode文件夹中创建tasks.json文件,定义“che…

    2026年9月22日 • 用户投稿
    100
  • MySQL服务无法启动怎么办?常见解决方法

    MySQL服务无法启动怎么办?常见解决方法MySQL服务无法启动怎么办?常见解决方法MySQL服务无法启动怎么办?常见解决方法MySQL服务无法启动怎么办?常见解决方法

    mysql服务无法启动常见原因包括配置错误、端口占用、数据文件损坏或权限问题。解决方法如下:1. 查看错误日志,定位问题根源;2. 检查配置文件是否存在语法错误或路径问题;3. 确认端口(如3306)未被占用;4. 核查数据目录的权限与完整性;5. 必要时修复或重置数据目录,甚至重新安装mysql。…

    2026年9月22日 • 用户投稿
    000
  • Java TreeMap如何自定义排序规则

    TreeMap默认按键的自然顺序排序,可通过构造函数传入Comparator自定义排序规则。例如字符串可按长度排序:TreeMap map = new TreeMap((s1, s2) -> s1.length() – s2.length()); 对自定义对象如Person可按年龄…

    2026年9月22日
    000
  • qq浏览器怎么设置信任此站点_QQ浏览器添加信任站点设置方法

    可通过设置中心或地址栏将网站添加为可信站点以解除QQ浏览器限制。首先打开QQ浏览器,点击菜单进入设置,选择“隐私与安全”中的“可信站点管理”,添加并保存目标网址;也可在访问页面时点击地址栏锁形图标,通过站点设置直接设为可信;若需临时访问,可在安全警告页点击“继续访问”或“仍然前往”实现临时放行,但不…

    2026年9月22日
    300
  • windows怎么开启或关闭休眠模式_休眠模式启用与禁用设置

    首先通过控制面板或命令提示符启用或禁用休眠功能,其次可设置自动休眠时间以节能;操作路径包括图形界面调整与管理员命令执行,适用于Windows 11系统环境。 如果您发现Windows系统的休眠功能未启用或希望禁用该功能以释放磁盘空间,可以通过系统电源设置或命令行工具进行配置。休眠模式会将当前系统状态…

    2026年9月22日
    100
  • Java Collections.synchronizedList方法如何保证线程安全

    synchronizedList通过同步方法保证线程安全,使用synchronized关键字对每个操作加锁,确保单个操作的原子性;但迭代或复合操作需手动同步,否则可能引发并发异常;其性能较低,适用于读多写少、并发不高的场景,高并发下推荐使用CopyOnWriteArrayList。 Java 中 C…

    2026年9月22日
    100
  • VSCode如何调试JavaScript代码 VSCode调试功能的实战技巧

    要在vscode中调试javascript,首先需设置断点、配置launch.json文件、选择合适的调试环境并启动调试会话;2. launch.json至关重要,常见陷阱包括program路径错误、type类型不匹配、cwd设置不当、混淆launch与attach模式以及source map配置缺…

    2026年9月22日
    000
  • Linux内核13-进程切换

    进程切换,也称为任务切换、上下文切换或任务调度,本文将探讨linux内核中进程切换的实现。我们首先理解几个关键概念。 1.1 硬件上下文 每个进程都有自己的地址空间,但所有进程共享CPU寄存器。因此,在恢复进程执行前,内核必须确保挂起时的寄存器值被重新加载到CPU寄存器中。 这些需要加载到CPU寄存…

    2026年9月22日
    200
  • 如何修改MySQL的默认端口号?

    如何修改MySQL的默认端口号?如何修改MySQL的默认端口号?如何修改MySQL的默认端口号?如何修改MySQL的默认端口号?

    修改mysql默认端口号需编辑配置文件,核心步骤为:1.定位my.cnf或my.ini文件;2.在[mysqld]段落中修改或添加port参数;3.保存后重启mysql服务。更改端口主要出于避免冲突、提升安全性和适应网络策略考虑。连接时需在客户端工具或代码中指定新端口,如命令行加-p参数、编程语言连…

    2026年9月22日 • 用户投稿
    1200
  • safari浏览器如何阻止网站访问我的运动和方向数据_safari浏览器阻止网站访问运动方向数据

    首先关闭Safari对网站的运动与方向传感器权限,进入设置- Safari -网站-运动与方向,将默认行为设为拒绝;其次可针对特定网站单独管理权限,阻止可疑站点访问传感器;最后启用无痕浏览模式以增强隐私保护,限制网页对硬件的持续访问。 如果您在使用 Safari 浏览器时发现某些网站试图获取您的设备…

    2026年9月22日
    100
  • windows怎么查看系统稳定性历史记录_windows可靠性监视器使用方法

    可通过控制面板、运行命令、搜索功能或事件查看器打开可靠性监视器,查看系统稳定性评分及崩溃记录。 如果您想了解Windows系统的运行状况和历史稳定性,可以通过内置的可靠性监视器来查看详细的系统事件和稳定性评分。该工具会记录应用程序崩溃、Windows故障、硬件驱动问题等信息,并以图表形式展示。 本文…

    2026年9月22日
    000
  • 京东外卖店铺能变更营业执照吗?京东外卖店铺能变更营业执照吗怎么办

    京东外卖店铺变更经营主体需先确认资格并准备材料,如营业执照、法人身份证、品牌授权书等,确保店铺运营满一年且无重大违规;随后登录商家后台提交申请,填写新主体信息并上传文件;等待平台1-3个工作日审核,通过后进入7天公示期;公示无异议后,完成线下工商变更并更新银行账户信息,最后在后台上传新证照,待平台确…

    2026年9月22日
    400
  • 喵趣漫画官网登录页面 喵趣漫画免费阅读全本漫画

    喵趣漫画官网登录页面位于其官方网站https://www.miaoqumanhua.com/,用户可直接通过浏览器访问并登录账号。 喵趣漫画官网登录页面在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来喵趣漫画免费阅读全本漫画的相关信息,感兴趣的网友一起随小编来瞧瞧吧! https://ww…

    2026年9月22日
    100

发表回复

登录后才能评论
关注微信