目录
[一、Selenium 是什么?](#一、Selenium 是什么?)
[1. 安装 Selenium 库](#1. 安装 Selenium 库)
[2. 下载浏览器驱动](#2. 下载浏览器驱动)
[3. 测试环境是否可用](#3. 测试环境是否可用)
[三、Selenium 核心用法](#三、Selenium 核心用法)
[1. 基本操作:访问页面与获取信息](#1. 基本操作:访问页面与获取信息)
[2. 元素定位:找到页面中的节点](#2. 元素定位:找到页面中的节点)
[3. 交互操作:模拟用户行为](#3. 交互操作:模拟用户行为)
[4. 处理 iframe:切换嵌套页面](#4. 处理 iframe:切换嵌套页面)
[5. 动作链:处理复杂交互](#5. 动作链:处理复杂交互)
[6. 执行 JavaScript:扩展操作能力](#6. 执行 JavaScript:扩展操作能力)
[1. 处理点选验证码](#1. 处理点选验证码)
[2. 处理图片懒加载](#2. 处理图片懒加载)
[五、Selenium 爬虫注意事项](#五、Selenium 爬虫注意事项)
Selenium 是一款强大的 Web 自动化工具,最初用于网站测试,如今也成为爬虫领域处理动态网页的利器。无论是模拟用户操作、处理 JavaScript 渲染内容,还是应对验证码,Selenium 都能胜任。本文将从环境搭建开始,逐步讲解 Selenium 的核心用法与实战技巧。
一、Selenium 是什么?
Selenium 本质是一个 "浏览器自动化控制器",它可以模拟人类在浏览器中的操作(如点击、输入、滚动等),并能获取浏览器渲染后的动态内容。与传统爬虫工具(如 Requests+BeautifulSoup)相比,Selenium 的优势在于:
- 能处理 JavaScript 动态生成的内容(如 Ajax 加载、懒加载数据)。
- 支持模拟登录、点击按钮、下拉菜单等交互操作。
- 可直接运行在主流浏览器(Chrome、Firefox 等),贴近真实用户行为。
二、环境搭建:从安装到测试
Selenium 的使用需要 "工具包 + 浏览器驱动" 的配合,以下是详细步骤:
1. 安装 Selenium 库
推荐使用 Python 环境,通过 pip 安装指定版本(3.x 版本稳定性较好):
pip install selenium==3.0.0
2. 下载浏览器驱动
Selenium 需要浏览器驱动(Driver)来控制浏览器,不同浏览器对应不同驱动:
- Chrome:ChromeDriver(需与浏览器版本匹配)。
- Firefox:GeckoDriver。
操作步骤:
- 查看浏览器版本(如 Chrome:设置→关于 Chrome)。
- 下载对应版本的驱动,解压后得到可执行文件(如
chromedriver.exe
)。 - 将驱动文件放在项目目录下,或添加到系统环境变量(避免每次指定路径)。
3. 测试环境是否可用
编写简单代码,验证是否能启动浏览器并访问网页:
from selenium import webdriver
# 初始化Chrome浏览器(指定驱动路径)
driver = webdriver.Chrome(executable_path="./chromedriver.exe")
# 访问百度
driver.get("https://www.baidu.com")
# 停留3秒后关闭浏览器
import time
time.sleep(3)
driver.quit()
若成功弹出 Chrome 浏览器并打开百度页面,则环境搭建完成。
三、Selenium 核心用法
1. 基本操作:访问页面与获取信息
from selenium import webdriver
driver = webdriver.Chrome(executable_path="./chromedriver.exe")
driver.get("https://www.baidu.com") # 打开网页
# 获取页面信息
print("当前URL:", driver.current_url) # 输出:https://www.baidu.com
print("页面源码:", driver.page_source) # 获取渲染后的HTML
driver.save_screenshot("baidu.png") # 页面截图
driver.close() # 关闭当前标签页(driver.quit()关闭整个浏览器)
2. 元素定位:找到页面中的节点
Selenium 提供多种元素定位方法,常用的有以下几种(以百度搜索框为例):
定位方式 | 代码示例 | 说明 |
---|---|---|
ID 定位 | driver.find_element_by_id("kw") |
通过id="kw" 定位 |
CSS 选择器 | driver.find_element_by_css_selector("#kw") |
支持复杂选择器 |
XPath 路径 | driver.find_element_by_xpath("//input[@id='kw']") |
灵活定位任意节点 |
标签名 | driver.find_element_by_tag_name("input") |
适合唯一标签,慎用 |
链接文本 | driver.find_element_by_link_text("新闻") |
定位<a> 标签的文本内容 |
注意:
find_element_xxx
返回第一个匹配元素,find_elements_xxx
返回所有匹配元素(列表)。- Selenium 4.x 中,
find_element_by_xxx
方法已废弃,推荐使用find_element(By.ID, "kw")
(需导入from selenium.webdriver.common.by import By
)。
3. 交互操作:模拟用户行为
以 "百度搜索" 为例,模拟输入关键词并点击搜索按钮:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome(executable_path="./chromedriver.exe")
driver.get("https://www.baidu.com")
# 定位搜索框并输入文字
search_input = driver.find_element(By.ID, "kw")
search_input.send_keys("Selenium教程") # 输入文本
time.sleep(1)
# 定位搜索按钮并点击
search_button = driver.find_element(By.ID, "su")
search_button.click() # 点击按钮
time.sleep(3)
driver.quit()
其他常用交互方法:
clear()
:清空输入框内容。submit()
:提交表单(如按回车)。get_attribute("href")
:获取元素属性(如链接地址)。
4. 处理 iframe:切换嵌套页面
网页中常通过<iframe>
标签嵌套子页面(如登录框、视频播放器),Selenium 默认在父页面查找元素,需先切换到 iframe 才能操作内部元素:
# 以QQ空间登录为例
driver.get("https://qzone.qq.com/")
# 切换到iframe(通过id或name定位)
driver.switch_to.frame("login_frame")
# 操作iframe内的元素(如点击"账号密码登录")
driver.find_element(By.ID, "switcher_plogin").click()
# 切回父页面(如需操作外部元素)
driver.switch_to.default_content()
5. 动作链:处理复杂交互
对于鼠标拖曳、右键点击、悬停等无特定对象的操作,需使用ActionChains
(动作链):
from selenium.webdriver import ActionChains
# 示例:鼠标悬停在某个元素上
menu = driver.find_element(By.CSS_SELECTOR(".nav-menu"))
ActionChains(driver).move_to_element(menu).perform() # 悬停
# 示例:拖曳元素(从A到B)
source = driver.find_element(By.ID, "source")
target = driver.find_element(By.ID, "target")
ActionChains(driver).drag_and_drop(source, target).perform() # 拖曳
6. 执行 JavaScript:扩展操作能力
Selenium 支持直接运行 JavaScript 代码,用于处理 API 未覆盖的场景(如滚动页面、修改元素属性):
# 向下滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
# 修改元素属性(如移除禁用状态)
driver.execute_script("document.getElementById('submit').removeAttribute('disabled')")
四、高级实战:处理验证码与动态加载
1. 处理点选验证码
很多网站登录时会出现点选验证码(如 "点击图片中的文字"),需结合图片处理和动作链实现自动点击:
from selenium import webdriver
from selenium.webdriver import ActionChains
from PIL import Image
import time
driver = webdriver.Chrome(executable_path="./chromedriver.exe")
driver.get("https://example.com/login")
# 1. 截取验证码图片
driver.save_screenshot("full_page.png") # 截取全屏
code_img = driver.find_element(By.CSS_SELECTOR(".verify-code")) # 定位验证码元素
# 获取验证码在屏幕中的位置
location = code_img.location # 左上角坐标
size = code_img.size # 宽高
left, top = location["x"], location["y"]
right, bottom = left + size["width"], top + size["height"]
# 裁剪验证码图片
full_img = Image.open("full_page.png")
code_img_crop = full_img.crop((left, top, right, bottom))
code_img_crop.save("code.png")
# 2. 调用验证码识别接口(如打码平台),获取点击坐标(示例返回"x1,y1|x2,y2")
# result = verify_code_api("code.png")
result = "100,50|200,80" # 假设识别结果
# 3. 动作链点击验证码
for pos in result.split("|"):
x, y = map(int, pos.split(","))
# 相对于验证码元素的偏移量点击
ActionChains(driver).move_to_element_with_offset(code_img, x, y).click().perform()
time.sleep(1)
2. 处理图片懒加载
对于采用懒加载的图片(如前文提到的data-src
属性),Selenium 可通过滚动触发加载,再提取真实地址:
# 滚动页面,触发懒加载
def scroll_to_load(driver):
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# 滚动到底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
time.sleep(2) # 等待加载
# 检查是否已滚动到页面底部
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
# 加载完成后提取图片真实地址
scroll_to_load(driver)
images = driver.find_elements(By.CSS_SELECTOR("img.lazy"))
for img in images:
real_src = img.get_attribute("data-src") # 提取真实地址
print(real_src)
五、Selenium 爬虫注意事项
-
反爬规避:
-
避免频繁请求,添加随机
time.sleep()
。 -
模拟真实浏览器参数(如设置
user-agent
)。 -
使用无头浏览器(如 Chrome 无头模式)减少被检测概率:
options = webdriver.ChromeOptions() options.add_argument("--headless") # 无头模式 driver = webdriver.Chrome(options=options)
-
-
性能优化:
- 避免不必要的页面加载(如禁用图片、CSS 加载)。
- 及时关闭不再使用的标签页(
driver.close()
)。
-
版本兼容:
- Selenium 3.x 与 4.x 语法有差异(如 4.x 移除
executable_path
,需用Service
类),需注意版本匹配。
- Selenium 3.x 与 4.x 语法有差异(如 4.x 移除
六、总结
Selenium 凭借对浏览器的完全控制能力,成为处理动态网页和复杂交互的首选工具。从环境搭建到元素定位、交互操作,再到验证码处理和懒加载应对,掌握这些技巧能让你在自动化测试和爬虫开发中更加得心应手。实际使用中,需结合场景灵活运用,并注意规避反爬机制,平衡效率与稳定性。