这篇是写给“点下一页点到吐”的自己。
在做自动化的时候,特别是爬数据或批量操作的后台页面,基本都会遇到分页这种结构,一页十条、五十条,每次还要点“下一页”才能看到更多。
之前我为了偷懒,可能只点了前几页就不管了,但后来业务要求拉全量数据,不得不写一个稳定的“分页遍历”逻辑,这里记录一下我的处理方式。
一、目标:点“下一页”直到没有下一页
核心逻辑其实很简单:
- 一开始处理第一页内容
- 如果有“下一页”按钮,就点击
- 然后继续处理
- 直到“下一页”按钮不可点击 or 消失
二、示例页面结构
假设分页按钮长这样:
<a class="next-page" href="javascript:void(0)">下一页</a>
而最后一页时,会变成:
<a class="next-page disabled" href="#">下一页</a>
或者干脆 <a>
就不渲染了。需要代码去“感知”这些状态变化。
三、代码实现(稳定通用的分页逻辑)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, ElementClickInterceptedException
import time
driver = webdriver.Chrome()
driver.get("https://example.com")
while True:
# 处理当前页内容
items = driver.find_elements(By.CSS_SELECTOR, ".data-row")
print(f"当前页抓取到 {len(items)} 条记录")
for item in items:
print(item.text)
# 尝试找“下一页”
try:
next_button = driver.find_element(By.CSS_SELECTOR, ".next-page")
# 如果按钮有 disabled 状态,就跳出
if "disabled" in next_button.get_attribute("class"):
print("到最后一页了,停止分页")
break
else:
print("点击下一页")
next_button.click()
time.sleep(1.5) # 简单粗暴的等待,可替换成 WebDriverWait
except NoSuchElementException:
print("找不到下一页按钮,直接退出")
break
except ElementClickInterceptedException:
print("下一页按钮被遮挡了,建议滚动或等待")
break
四、一些建议(踩坑总结)
- 判断方式要灵活:有些页面“下一页”会隐藏、有些会变灰、有些干脆移除。尽量写成“能跳就跳,不能就停”。
- 避免死循环:比如点击后页面没变,反复点击同一页 → 可以记录当前页码防止重复。
- 配合显式等待更稳:别像我上面偷懒用
time.sleep
,正式环境最好用WebDriverWait
检查分页完成再下一步。 - 如果是 JS 渲染分页:点完下一页要等内容加载完才能继续抓,不然你抓的是上一次的内容。
五、总结
处理分页的核心就是“知道什么时候该停”,不要盲目死循环。这个逻辑写好之后几乎能适配大多数普通分页场景。
当然还有更复杂的,比如滚动加载下一页(不是按钮)那种,那就又是另一种处理方式了,回头单独写一篇。