当前位置: 首页 > news >正文

Selenium 4 教程:自动化 WebDriver 管理与 Cookie 提取 || 用于解决chromedriver版本不匹配问题

Selenium 4 教程:自动化 WebDriver 管理与 Cookie 提取

本教程旨在讲解 Selenium 4 在自动化项目中的两个实用技术:

  1. 自动化 WebDriver 管理:通过 webdriver-manager 库,实现 chromedriver 的自动下载、配置和版本匹配,避免手动操作。
  2. Cookie 提取与复用:利用 Selenium 完成浏览器中的手动登录,然后提取会话 Cookie,并将其用于 requests 库,以执行后续的 API 请求。

以下内容将基于提供的代码范例,对这两个技术点的实现方式进行拆解和说明。

1. 环境准备

在开始之前,需要安装项目所需的 Python 库。可以通过以下命令进行安装:

pip install selenium webdriver-manager requests pandas openpyxl
  • selenium: 浏览器自动化框架。
  • webdriver-manager: 用于自动化管理 WebDriver。
  • requests: 用于发送 HTTP 请求。
  • pandas & openpyxl: 用于数据处理和写入 Excel 文件。

2. 自动化 WebDriver 管理

2.1 问题背景

在使用 Selenium 时,WebDriver(如 chromedriver)的版本必须与本地安装的浏览器版本严格对应。传统方法需要开发者手动下载并指定 WebDriver 的路径,当浏览器自动更新后,脚本便会因版本不匹配而失效,维护成本较高。

2.2 解决方案与原理

webdriver-manager 库解决了此问题。其工作原理如下:

  1. 在脚本运行时,自动检测本地 Chrome 浏览器的版本。
  2. 根据检测到的版本,从官方源下载对应的 chromedriver
  3. 将下载的驱动程序缓存至本地特定目录。后续运行时,若版本无变化,则直接使用缓存,提高了执行效率。
  4. 将驱动程序的路径提供给 Selenium 的 Service 对象,完成无缝集成。
2.3 代码实现

以下是从范例代码中提取的关键部分,用于初始化一个能自动管理驱动的 WebDriver 实例。

# 1. 导入相关模块
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options# 2. 在方法中实现初始化
def _get_cookies_with_selenium(self):# ... 其他配置,如 Optionschrome_options = Options()chrome_options.add_argument("--start-maximized")# 3. 核心实现:创建 Service 对象并初始化 WebDriver# ChromeDriverManager().install() 会自动处理驱动的下载和缓存service = Service(ChromeDriverManager().install())# 将创建的 service 实例传递给 webdriver.Chromedriver = webdriver.Chrome(service=service, options=chrome_options)# ... 后续浏览器操作

代码讲解:

  • 在 Selenium 4 中,推荐使用 Service 对象来管理 WebDriver 服务。
  • ChromeDriverManager().install()webdriver-manager 库的核心函数。它执行了上文提到的检测、下载、缓存等一系列自动化操作,并返回驱动程序的本地文件路径。
  • Service(path) 通过这个路径创建了一个驱动服务实例。
  • 最后,在 webdriver.Chrome() 的构造函数中,通过 service 参数传入该实例。这取代了旧版本中使用的 executable_path 参数。

通过这种方式,代码便具备了跨环境、自适应浏览器版本的能力。


3. 登录会话保持:提取并使用 Cookie

3.1 应用场景

对于包含复杂登录验证(如滑块验证码、扫码登录、短信验证)的网站,完全通过代码模拟登录流程非常困难。此时,可以采用人机结合的策略:由人工完成登录,程序接管后续的会话。

3.2 方法流程

该方法的执行流程清晰,分为以下几步:

  1. 启动浏览器:使用 Selenium 启动一个浏览器实例,并导航至目标网站的登录页面。
  2. 用户手动登录:脚本通过 input() 函数暂停执行,等待用户在浏览器窗口中完成登录操作。
  3. 提取 Cookie:用户登录成功后,在脚本控制台按下回车键,脚本继续执行。此时,通过 driver.get_cookies() 方法获取当前会话的所有 Cookie。
  4. 关闭浏览器:Cookie 获取成功后,Selenium 的任务完成,关闭浏览器以释放系统资源。
  5. 复用 Cookie:将获取的 Cookie 添加到 requests.Session 对象中。之后,所有通过此 Session 对象发起的请求都将携带登录凭证,从而可以访问需要登录才能查看的数据接口。
3.3 代码实现

步骤一:使用 Selenium 获取 Cookie

此部分代码负责引导用户登录并抓取 Cookie。

def _get_cookies_with_selenium(self):# ... (初始化 driver 的代码见上一节) ...# 导航到登录页driver.get("https://www.zhipin.com/web/user/?ka=header-login")# 打印提示信息,并使用 input() 阻塞程序,等待用户操作print("\n【请手动登录】浏览器已打开,请在浏览器中完成扫码登录。")print("【重要】登录成功后,请不要关闭浏览器,回到本控制台,按 Enter 键继续...\n")input()# 用户确认后,从浏览器获取 cookieslogging.info("正在获取登录后的Cookies...")cookies = driver.get_cookies()# 关闭浏览器driver.quit()return cookies

代码讲解:

  • input(): 该函数是实现人机交互的关键,它会暂停程序执行,直到用户在控制台按下回车键。
  • driver.get_cookies(): Selenium 的标准方法,返回一个列表,其中每个元素都是一个代表 Cookie 的字典。

步骤二:将 Cookie 应用于 requests

获取到 Cookie 后,需要将其加载到 requests 的会话中。

def run(self):# 1. 调用上述方法获取 cookiesselenium_cookies = self._get_cookies_with_selenium()if not selenium_cookies:logging.error("未能获取到Cookies,程序终止。")return# 2. 遍历 cookie 列表,并添加到 requests.Session 对象中# self.session 是一个提前初始化好的 requests.Session() 实例for cookie in selenium_cookies:self.session.cookies.set(cookie['name'], cookie['value'])logging.info("Cookies已成功加载到请求会话中。")# 3. 后续所有使用 self.session 的请求都将自动携带这些 cookie# 例如:response = self.session.get(api_url, params=params)

代码讲解:

  • requests.Session(): 创建一个会话对象,它可以在多次请求之间保持 Cookie。
  • self.session.cookies.set(name, value): requests 库设置 Cookie 的标准方法。由于 driver.get_cookies() 返回的每个 Cookie 是一个字典,我们从中提取 namevalue 两个关键字段进行设置。

4. 总结

本教程介绍了两种提升 Selenium 项目效率和稳定性的技术:

  1. 自动化 WebDriver 管理:通过 webdriver-manager 库,使脚本能够自动适应浏览器版本,降低了维护成本。
  2. Cookie 提取与复用:通过结合人工登录和程序提取,有效解决了复杂登录场景下的自动化难题,并将会话状态无缝迁移至更高效的 requests 库,适用于后续大规模的 API 数据请求。

掌握这两种方法,可以显著提高网络自动化和数据采集项目的开发效率与健壮性。

http://www.dtcms.com/a/272259.html

相关文章:

  • 《PyQt6-3D:开启Python 3D开发新世界》
  • Windows Edge 播放 H.265 视频指南
  • OpenAI正准备推出一款搭载人工智能功能的网络浏览器,试图直接挑战Alphabet旗下
  • 前端面试专栏-算法篇:21. 链表、栈、队列的实现与应用
  • NAT技术(网络地址转换)
  • 【实战】使用 ELK 搭建 Spring Boot Docker 容器日志监控系统
  • OSPF实验以及核心原理全解
  • 【SkyWalking】配置告警规则并通过 Webhook 推送钉钉通知
  • HP EVA SAN 数据恢复利器:Data recovery plugin for HP StorageWorks EVA
  • 前端项目集成husky + lint-staged + commitlint
  • Web-Bench:基于web标准和框架的benchmark
  • Fiddler中文版全面评测:功能亮点、使用场景与中文网资源整合指南
  • 什么是强化学习(RL)--2
  • 如何在VMware里的飞牛OS访问主机里面图片文件夹
  • 【运维实战】解决 K8s 节点无法拉取 pause:3.6 镜像导致 API Server 启动失败的问题
  • 【EGSR2025】材质+扩散模型+神经网络相关论文整理随笔(三)
  • 华为昇腾NPU与NVIDIA CUDA生态兼容层开发实录:手写算子自动转换工具链(AST级代码迁移方案)
  • 缓存穿透与击穿多方案对比与实践指南
  • 设计模式的六大设计原则
  • AI问答之手机相机专业拍照模式的主要几个参数解释
  • 【笔记】使用 html 创建网址快捷方式
  • 达梦数据库DMDRS搭建单向dm8-dm8数据同步
  • 【工具教程】批量提取OCR图片中固定文字保存WPS表格,批量OCR识别图像中的文字保存到Excel表格的操作步骤和注意事项
  • 虚拟环境已安装该包,且已激活,但报错
  • 智能体的记忆系统:短期记忆、长期记忆与知识图谱
  • Spring for Apache Pulsar->Reactive Support->Quick Tour
  • 【LeetCode100】--- 1.两数之和【复习回滚】
  • 氢能源杂谈
  • 深入拆解Spring核心思想之一:IoC
  • 天津医大用网络药理学+分子对接发表中科院二区IF5