如何使用Python Selenium实现网页分页跳转至下一页
Selenium 实现eBay分类列表自动分页爬取的实现方案
核心实现思路
分页爬取的循环逻辑非常明确,重复执行三个固定操作直到触发停止条件即可:
- 提取当前页面的所有目标商品链接,统一存储
- 定位页面底部的「下一页」交互按钮
- 点击下一页按钮,等待新页面的商品列表完全加载,进入下一轮循环
原有代码的可优化问题
- 代码中使用的
find_elements_by_xpath是Selenium 3.x版本的旧定位API,Selenium 4.x及以上版本已将该方法弃用,直接运行会报属性不存在的错误,需要替换为find_element(By.XPATH, "定位规则")的标准定位写法。 - 代码中用固定
time.sleep(0.5)等待页面加载的方式稳定性不足:遇到网络波动、页面渲染延迟的场景,会出现商品元素还没加载完成就被抓取的情况,要么抓不全数据,要么直接触发元素找不到的报错。
可直接运行的完整分页爬取代码
import time 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() # 配置最长10秒的显式等待,元素超过10秒未加载完成则触发异常 wait = WebDriverWait(driver, 10) # 初始化存储所有商品链接的列表 all_item_links = [] # 访问目标分类列表页 driver.get('https://www.ebay.co.uk/b/Cordless-Drills/184655/bn_9863722?rt=nc&_dmd=1') # 循环爬取直到无下一页 while True: # 等待当前页所有商品链接元素加载完成 item_link_elements = wait.until( EC.presence_of_all_elements_located((By.XPATH, '//div[@class="s-item__wrapper clearfix"]//a[@class="s-item__link"]')) ) # 提取当前页链接,去重后存入总列表 for elem in item_link_elements: target_link = elem.get_attribute('href') if target_link not in all_item_links: all_item_links.append(target_link) print(f"已提取链接:{target_link}") try: # 定位下一页按钮(eBay分类页下一页按钮的固定标识为aria-label="Go to next page") next_page_btn = wait.until( EC.element_to_be_clickable((By.XPATH, '//a[@aria-label="Go to next page"]')) ) # 触发下一页点击 next_page_btn.click() # 等待旧页面元素失效,确认页面已完成跳转 wait.until(EC.staleness_of(item_link_elements[0])) except Exception: # 当找不到可点击的下一页按钮时,说明已到达最后一页,跳出循环 print("已到达列表最后一页,爬取流程结束") break # 爬取完成后关闭驱动 driver.quit() print(f"本次共提取{len(all_item_links)}个有效商品链接")
关键逻辑说明
- 显式等待替代固定sleep:只有当目标元素真正加载完成、满足交互条件时才执行后续操作,大幅降低因网络波动、页面渲染慢导致的报错概率,比固定时长的等待稳定很多。
- 循环停止的判断逻辑:列表到最后一页时,分页区域的下一页按钮会被设置为不可点击状态,此时判断按钮可点击的等待条件无法满足,捕获对应异常后直接跳出循环,不会出现死循环的问题。
- 重复数据过滤:跳转页面时可能因页面缓存出现重复加载旧链接的问题,在存入总列表前做去重判断,避免最终结果里出现重复数据。
- 可灵活调整爬取范围:如果不需要爬完所有页面,可以在循环中加入页数计数,达到预设的爬取页数上限后主动break,无需一直爬到最后一页。
内容的提问来源于stack exchange,提问作者Ranit Bhowmick
相关产品推荐
相关产品推荐

