1. 环境准备
安装Selenium库
bash
复制
pip install selenium
下载浏览器驱动(以Chrome为例)
下载对应浏览器版本的驱动:
ChromeDriver: https://chromedriver.chromium.org/downloads
将驱动文件(如
chromedriver.exe)添加到系统环境变量,或直接在代码中指定路径。
2. 基础用法
启动浏览器并访问页面
python
复制
from selenium import webdriver
# 指定驱动路径(若未添加到环境变量)
driver = webdriver.Chrome(executable_path='path/to/chromedriver')
# 打开网页
driver.get("https://example.com")
# 打印页面标题
print(driver.title)
# 关闭浏览器
driver.quit()
3. 定位元素
Selenium提供多种元素定位方式:
常用定位方法
python
复制
# 通过ID
element = driver.find_element_by_id("element_id")
# 通过类名
element = driver.find_element_by_class_name("class_name")
# 通过标签名
element = driver.find_element_by_tag_name("h1")
# 通过XPath
element = driver.find_element_by_xpath("//div[@class='content']")
# 通过CSS选择器
element = driver.find_element_by_css_selector("div.content > p")
查找多个元素
python
复制
elements = driver.find_elements_by_class_name("item")
for item in elements:
print(item.text)
4. 处理动态加载内容
显式等待(推荐)
python
复制
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "dynamic_element"))
print(element.text)
except:
print("元素未找到")
隐式等待
python
复制
driver.implicitly_wait(10) # 全局等待时间(单位:秒)
5. 页面交互
输入文本与点击按钮
python
复制
# 定位输入框并输入内容
search_box = driver.find_element_by_name("q")
search_box.send_keys("Python Selenium")
# 定位按钮并点击
search_button = driver.find_element_by_css_selector("button[type='submit']")
search_button.click()
执行JavaScript
python
复制
# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 点击隐藏元素
driver.execute_script("arguments[0].click();", element)
6. 处理复杂场景
切换iframe
python
复制
iframe = driver.find_element_by_tag_name("iframe")
driver.switch_to.frame(iframe)
# 操作iframe内元素
driver.switch_to.default_content() # 切换回主页面
处理弹窗
python
复制
alert = driver.switch_to.alert print(alert.text) alert.accept() # 确认弹窗 # alert.dismiss() # 取消弹窗
下拉菜单选择
python
复制
from selenium.webdriver.support.ui import Select
dropdown = Select(driver.find_element_by_id("dropdown"))
dropdown.select_by_value("option_value")
# 或通过索引:dropdown.select_by_index(0)
7. 数据提取
python
复制
# 获取文本
title = driver.find_element_by_tag_name("h1").text
# 获取属性
link = driver.find_element_by_link_text("More Info").get_attribute("href")
# 提取表格数据
rows = driver.find_elements_by_css_selector("table tr")
for row in rows:
cells = row.find_elements_by_tag_name("td")
data = [cell.text for cell in cells]
print(data)
8. 数据存储
保存到CSV
python
复制
import csv
with open('data.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(["Header1", "Header2"])
writer.writerow(["Data1", "Data2"])
9. 优化与注意事项
无头模式(不显示浏览器界面):
python
复制
from selenium.webdriver.chrome.options import Options options = Options() options.add_argument("--headless") driver = webdriver.Chrome(options=options)反爬虫策略:
设置随机User-Agent。
使用代理IP。
避免频繁请求(添加
time.sleep())。
资源释放:
python
复制
driver.quit() # 彻底关闭浏览器进程
10. 完整示例:抓取动态商品列表
python
复制
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
driver = webdriver.Chrome()
driver.get("https://example-ecommerce.com/products")
products = []
while True:
# 等待商品加载
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "product-item"))
)
# 提取当前页商品
items = driver.find_elements_by_class_name("product-item")
for item in items:
name = item.find_element_by_class_name("name").text
price = item.find_element_by_class_name("price").text
products.append({"name": name, "price": price})
# 翻页
try:
next_button = driver.find_element_by_css_selector("a.next-page")
next_button.click()
time.sleep(2) # 防止过快被拦截
except:
break # 无下一页时退出
driver.quit()
# 保存数据
print(products)