置顶

Python Selenium 漫步指南:从入门到精通(一)

作者:admin | 分类:顶峰机器人 | 浏览:5 | 日期:2025年12月16日



引言:为何选择 Selenium?


在当今高度动态的Web应用环境中,传统静态网页抓取工具已难以应对JavaScript渲染、AJAX加载等现代Web技术。Selenium作为一款强大的浏览器自动化工具,能够模拟真实用户操作,解决动态内容加载难题,成为测试工程师和爬虫开发者的首选。 本文将带您从零开始,逐步掌握Selenium的核心原理与实践技巧。


第一章:环境搭建与基础配置


1.1 安装 Selenium


Python环境中可通过pip轻松安装:


pip install selenium



推荐使用虚拟环境隔离依赖:


python -m venv selenium_env

source selenium_env/bin/activate  # Linux/Mac

selenium_env\Scripts\activate.bat # Windows



安装完成后,可通过pip show selenium验证版本。


1.2 浏览器驱动配置


Selenium需要与浏览器驱动配合工作,主流浏览器驱动获取方式:






Chrome:访问ChromeDriver官网下载与浏览器版本匹配的驱动,解压后添加至系统PATH或在代码中指定路径。




Firefox:从GeckoDriver获取对应版本。




Edge:通过Microsoft Edge Driver下载。


版本匹配技巧:在浏览器地址栏输入chrome://settings/help可查看版本号,确保驱动版本与浏览器一致。


1.3 Selenium 4.x 新特性


Selenium 4.x引入多项改进:






相对定位器:基于其他元素位置定位目标元素,如driver.find_element(By.XPATH, "following-sibling::input")。




Service对象:统一管理驱动生命周期,替代旧版executable_path参数。




WebDriver Manager:自动下载并管理驱动,简化配置:


from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())





CDP协议支持:通过Chrome DevTools Protocol实现浏览器高级控制。


第二章:基础操作与元素定位


2.1 初始化浏览器


标准初始化


from selenium import webdriver

from selenium.webdriver.common.by import By


# 自动管理驱动(推荐)

driver = webdriver.Chrome()

# 或指定驱动路径

from selenium.webdriver.chrome.service import Service

service = Service('/path/to/chromedriver')

driver = webdriver.Chrome(service=service)



无头模式(Headless)


from selenium.webdriver.chrome.options import Options


options = Options()

options.add_argument("--headless")

options.add_argument("--window-size=1920,1080")

driver = webdriver.Chrome(options=options)



2.2 浏览器控制


导航操作


driver.get("https://www.example.com")  # 打开URL

driver.back()                          # 后退

driver.forward()                       # 前进

driver.refresh()                       # 刷新



窗口管理


driver.maximize_window()               # 最大化窗口

driver.set_window_size(800, 600)       # 设置窗口大小

driver.set_window_position(0, 0)       # 设置窗口位置



页面信息获取


title = driver.title                   # 获取页面标题

url = driver.current_url               # 获取当前URL

source = driver.page_source            # 获取页面源代码



2.3 元素定位与交互


定位方式对比








定位方式




语法示例




适用场景






ID




By.ID, "username"




唯一标识元素(优先使用)






NAME




By.NAME, "email"




表单字段






XPATH




By.XPATH, "//input[@type='text']"




复杂结构或无ID的元素






CSS Selector




By.CSS_SELECTOR, ".btn-primary"




样式类名明确时






CLASS_NAME




By.CLASS_NAME, "btn"




多个元素共享类名


元素操作


element = driver.find_element(By.ID, "username")

element.send_keys("testuser")       # 输入文本

element.click()                     # 点击

element.submit()                    # 提交表单

element.clear()                     # 清空内容



高级定位技巧






相对定位:基于父元素定位子元素


parent = driver.find_element(By.TAG_NAME, "div")

child = parent.find_element(By.CLASS_NAME, "child")





多重定位:使用find_elements获取元素列表


links = driver.find_elements(By.TAG_NAME, "a")

for link in links:

    print(link.text)



第三章:等待机制与异常处理


3.1 等待策略


强制等待(不推荐)


import time

time.sleep(5)  # 硬性等待5秒



隐式等待


driver.implicitly_wait(10)  # 全局等待10秒

element = driver.find_element(By.ID, "dynamic-element")



显式等待(推荐)


from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC


element = WebDriverWait(driver, 10).until(

    EC.presence_of_element_located((By.ID, "dynamic-element"))

)



3.2 异常处理


常见异常类型






NoSuchElementException:元素未找到




TimeoutException:等待超时




StaleElementReferenceException:元素已失效




ElementNotInteractableException:元素不可交互


异常处理示例


from selenium.common.exceptions import NoSuchElementException


try:

    element = driver.find_element(By.ID, "nonexistent")

except NoSuchElementException:

    print("元素未找到,执行备用方案")

    driver.find_element(By.CLASS_NAME, "backup").click()



第四章:实战案例:电商网站数据抓取


4.1 需求分析


目标:抓取某电商网站商品列表的标题、价格和评分,存储至CSV文件。


4.2 代码实现


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 csv

import time


# 初始化浏览器

options = webdriver.ChromeOptions()

options.add_argument("--headless")

options.add_argument("--disable-gpu")

driver = webdriver.Chrome(options=options)


def scrape_product_data(url):

    driver.get(url)

    

    # 等待商品列表加载

    WebDriverWait(driver, 10).until(

        EC.presence_of_all_elements_located((By.CLASS_NAME, "product-item"))

    )

    

    products = driver.find_elements(By.CLASS_NAME, "product-item")

    data = []

    

    for product in products:

        title = product.find_element(By.CLASS_NAME, "product-title").text

        price = product.find_element(By.CLASS_NAME, "product-price").text

        rating = product.find_element(By.CLASS_NAME, "product-rating").text

        data.append([title, price, rating])

    

    return data


def save_to_csv(data, filename):

    with open(filename, 'w', newline='', encoding='utf-8') as f:

        writer = csv.writer(f)

        writer.writerow(["标题", "价格", "评分"])

        writer.writerows(data)


if __name__ == "__main__":

    data = scrape_product_data("https://example.com/products")

    save_to_csv(data, "products.csv")

    driver.quit()

    print("数据抓取完成,已保存至products.csv")



4.3 反爬虫应对策略






User-Agent伪装:


options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")





请求间隔控制:


import random

time.sleep(random.uniform(1, 3))





IP代理池:


options.add_argument("--proxy-server=http://proxy_ip:port")



第五章:最佳实践与性能优化


5.1 代码规范






模块化设计:


# 元素定位器

class Locators:

    SEARCH_BOX = (By.NAME, "q")

    SUBMIT_BUTTON = (By.XPATH, "//button[@type='submit']")


# 使用示例

search_box = driver.find_element(*Locators.SEARCH_BOX)





日志记录:


import logging

logging.basicConfig(filename='selenium.log', level=logging.INFO)



5.2 性能优化技巧






并行执行:


from selenium.webdriver.chrome.service import Service

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities


capabilities = DesiredCapabilities.CHROME

capabilities['loggingPrefs'] = {'browser': 'ALL'}

service = Service('/path/to/chromedriver')

driver = webdriver.Remote(service.service_url, capabilities)





资源清理:


try:

    # 业务代码

finally:

    driver.quit()



结语:持续学习路径


本文覆盖了Selenium的核心技术栈,但Web自动化领域仍在快速发展。建议后续学习:






Page Object Model(POM):提高代码可维护性




Selenium Grid:分布式测试执行




Appium:移动端自动化扩展




AI集成:结合机器学习优化测试用例


通过持续实践和社区交流,您将逐步从Selenium新手成长为专家,构建高效可靠的自动化解决方案。