动态加载网页通常通过JavaScript异步渲染内容,页面初始HTML中不包含目标数据,需要等待资源加载完成后才能获取。Selenium可以模拟浏览器行为执行JS代码,配合显式等待精准等待目标元素出现,是抓取这类数据的常用方案。

环境准备
首先需要安装Selenium库和对应浏览器的驱动,以Chrome浏览器为例,步骤如下:
- 安装Selenium:执行
pip install selenium命令 - 下载ChromeDriver:需要和本地Chrome浏览器版本匹配,放置到系统环境变量可访问的路径中
显式等待核心概念
显式等待通过WebDriverWait结合expected_conditions实现,会在指定超时时间内,每隔一段时间检查条件是否满足,满足则继续执行,超时则抛出异常。相比time.sleep()固定等待,它不会浪费多余时间,也不会因为等待时间不足导致抓取失败。
常用等待条件
| 条件 | 说明 |
|---|---|
| presence_of_element_located | 等待元素出现在DOM中,不一定可见 |
| visibility_of_element_located | 等待元素出现在DOM中且可见 |
| element_to_be_clickable | 等待元素可点击 |
完整抓取示例
下面以抓取一个动态加载列表的页面为例,演示完整流程:
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
# 初始化Chrome浏览器驱动
driver = webdriver.Chrome()
# 设置隐式等待,作为全局兜底等待,这里设置5秒
driver.implicitly_wait(5)
# 打开目标动态页面,这里替换为实际要抓取的地址
driver.get("http://ipipp.com/dynamic-page")
try:
# 创建显式等待对象,最长等待10秒,每0.5秒检查一次条件
wait = WebDriverWait(driver, 10, poll_frequency=0.5)
# 等待目标列表元素可见,这里根据实际页面的元素定位方式调整
# 假设目标列表的class为dynamic-list
list_element = wait.until(
EC.visibility_of_element_located((By.CLASS_NAME, "dynamic-list"))
)
# 获取列表下的所有子项
items = list_element.find_elements(By.TAG_NAME, "li")
# 遍历提取每个子项的文本
for item in items:
print(item.text)
except Exception as e:
print(f"抓取过程出现异常:{e}")
finally:
# 关闭浏览器
driver.quit()注意事项
- 元素定位方式需要根据实际页面的HTML结构调整,可以通过浏览器开发者工具查看元素属性
- 超时时间设置要合理,过短可能等待不到元素,过长会浪费时间
- 如果页面有反爬机制,可以适当添加请求头、设置页面加载策略,或者模拟人类操作间隔
- 抓取完成后及时关闭浏览器,避免资源占用
Selenium显式等待动态网页抓取WebDriverWait修改时间:2026-06-05 17:22:41