Selenium 自动化测试与爬虫实战:从环境搭建到高级应用
目录
一、Selenium 是什么?
二、环境搭建:从安装到测试
1. 安装 Selenium 库
2. 下载浏览器驱动
3. 测试环境是否可用
三、Selenium 核心用法
1. 基本操作:访问页面与获取信息
2. 元素定位:找到页面中的节点
3. 交互操作:模拟用户行为
4. 处理 iframe:切换嵌套页面
5. 动作链:处理复杂交互
6. 执行 JavaScript:扩展操作能力
四、高级实战:处理验证码与动态加载
1. 处理点选验证码
2. 处理图片懒加载
五、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 timetime.sleep(3)driver.quit()
若成功弹出 Chrome 浏览器并打开百度页面,则环境搭建完成。
三、Selenium 核心用法
1. 基本操作:访问页面与获取信息
from selenium import webdriverdriver = webdriver.Chrome(executable_path=\"./chromedriver.exe\")driver.get(\"https://www.baidu.com\") # 打开网页# 获取页面信息print(\"当前URL:\", driver.current_url) # 输出:https://www.baidu.comprint(\"页面源码:\", driver.page_source) # 获取渲染后的HTMLdriver.save_screenshot(\"baidu.png\") # 页面截图driver.close() # 关闭当前标签页(driver.quit()关闭整个浏览器)
2. 元素定位:找到页面中的节点
Selenium 提供多种元素定位方法,常用的有以下几种(以百度搜索框为例):
driver.find_element_by_id(\"kw\")
id=\"kw\"
定位driver.find_element_by_css_selector(\"#kw\")
driver.find_element_by_xpath(\"//input[@id=\'kw\']\")
driver.find_element_by_tag_name(\"input\")
driver.find_element_by_link_text(\"新闻\")
标签的文本内容注意:
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 webdriverfrom selenium.webdriver.common.by import Byimport timedriver = 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:切换嵌套页面
网页中常通过标签嵌套子页面(如登录框、视频播放器),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 webdriverfrom selenium.webdriver import ActionChainsfrom PIL import Imageimport timedriver = 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 凭借对浏览器的完全控制能力,成为处理动态网页和复杂交互的首选工具。从环境搭建到元素定位、交互操作,再到验证码处理和懒加载应对,掌握这些技巧能让你在自动化测试和爬虫开发中更加得心应手。实际使用中,需结合场景灵活运用,并注意规避反爬机制,平衡效率与稳定性。