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)