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

发布于:2025-07-11 ⋅ 阅读:(17) ⋅ 点赞:(0)

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):
    # ... 其他配置,如 Options
    chrome_options = Options()
    chrome_options.add_argument("--start-maximized")
    
    # 3. 核心实现:创建 Service 对象并初始化 WebDriver
    # ChromeDriverManager().install() 会自动处理驱动的下载和缓存
    service = Service(ChromeDriverManager().install())
    
    # 将创建的 service 实例传递给 webdriver.Chrome
    driver = 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()
    
    # 用户确认后,从浏览器获取 cookies
    logging.info("正在获取登录后的Cookies...")
    cookies = driver.get_cookies()
    
    # 关闭浏览器
    driver.quit()
    
    return cookies

代码讲解:

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

步骤二:将 Cookie 应用于 requests

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

def run(self):
    # 1. 调用上述方法获取 cookies
    selenium_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 数据请求。

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


网站公告

今日签到

点亮在社区的每一天
去签到