Selenium 4 教程:自动化 WebDriver 管理与 Cookie 提取
本教程旨在讲解 Selenium 4 在自动化项目中的两个实用技术:
- 自动化 WebDriver 管理:通过
webdriver-manager
库,实现chromedriver
的自动下载、配置和版本匹配,避免手动操作。 - 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
库解决了此问题。其工作原理如下:
- 在脚本运行时,自动检测本地 Chrome 浏览器的版本。
- 根据检测到的版本,从官方源下载对应的
chromedriver
。 - 将下载的驱动程序缓存至本地特定目录。后续运行时,若版本无变化,则直接使用缓存,提高了执行效率。
- 将驱动程序的路径提供给 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 方法流程
该方法的执行流程清晰,分为以下几步:
- 启动浏览器:使用 Selenium 启动一个浏览器实例,并导航至目标网站的登录页面。
- 用户手动登录:脚本通过
input()
函数暂停执行,等待用户在浏览器窗口中完成登录操作。 - 提取 Cookie:用户登录成功后,在脚本控制台按下回车键,脚本继续执行。此时,通过
driver.get_cookies()
方法获取当前会话的所有 Cookie。 - 关闭浏览器:Cookie 获取成功后,Selenium 的任务完成,关闭浏览器以释放系统资源。
- 复用 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 是一个字典,我们从中提取name
和value
两个关键字段进行设置。
4. 总结
本教程介绍了两种提升 Selenium 项目效率和稳定性的技术:
- 自动化 WebDriver 管理:通过
webdriver-manager
库,使脚本能够自动适应浏览器版本,降低了维护成本。 - Cookie 提取与复用:通过结合人工登录和程序提取,有效解决了复杂登录场景下的自动化难题,并将会话状态无缝迁移至更高效的
requests
库,适用于后续大规模的 API 数据请求。
掌握这两种方法,可以显著提高网络自动化和数据采集项目的开发效率与健壮性。