使用Selenium爬取欧盟资助机会页面时持续返回首页求助
解决欧盟资助机会页面翻页重复提取第一页的问题
问题根源分析
这个网站的分页逻辑不依赖URL参数直接生效,大概率是前端路由拦截了URL参数修改,或是需要依赖页面内的会话状态(比如特定Cookie、JS生成的令牌)才能加载对应页码内容。手动改URL跳回首页就是明确信号——页面真实分页由前端JS控制,而非直接读取URL参数。
具体解决方案
1. 强制等待翻页后页面加载完成
点击翻页按钮后,不要立刻提取数据,必须等待新页面的标志性元素加载完成(比如页码指示器变化、列表项内容更新),避免Selenium还没等到新数据就抓取旧内容。
示例代码片段:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 点击下一页按钮 next_btn = driver.find_element(By.CSS_SELECTOR, "button.pagination-next") next_btn.click() # 等待页码更新(假设当前页码元素class为current-page) WebDriverWait(driver, 10).until( EC.text_to_be_present_in_element( (By.CSS_SELECTOR, "span.current-page"), "2" # 对应目标页码 ) ) # 此时再提取页面数据 extract_page_data(driver)
2. 模拟真实用户的翻页交互
不要直接修改URL,完全模拟用户点击翻页按钮的操作,且每次操作前加入1-3秒的随机延迟,避免触发反爬机制:
import time import random for page in range(1, 11): # 覆盖10页数据 # 提取当前页数据 extract_page_data(driver) if page < 10: # 随机延迟模拟用户操作间隔 time.sleep(random.uniform(1, 3)) # 点击未禁用的下一页按钮 next_btn = driver.find_element(By.CSS_SELECTOR, "button.pagination-next:not([disabled])") next_btn.click() # 等待列表内容更新(等待首个列表项失效,即新内容加载) WebDriverWait(driver, 10).until( EC.staleness_of(driver.find_element(By.CSS_SELECTOR, "div.opportunity-item:first-child")) )
3. 保留会话并处理Cookie
确保Selenium浏览器实例全程保持同一个会话,不要每次请求重新打开浏览器。另外,先接受网站的Cookie政策,部分网站会限制未接受Cookie用户的分页功能:
# 初始化浏览器后先处理Cookie cookie_accept_btn = driver.find_element(By.CSS_SELECTOR, "button#cookie-accept") cookie_accept_btn.click() # 之后再执行分页操作
4. 验证翻页是否成功
每次翻页后,抓取页面唯一标识内容(比如首个资助项目的标题),和上一页的标识对比,若相同则说明翻页失败,需重新点击或刷新重试:
prev_first_title = "" for page in range(1, 11): current_first_title = driver.find_element(By.CSS_SELECTOR, "div.opportunity-title").text if current_first_title == prev_first_title: # 翻页失败,重新点击并等待 next_btn.click() time.sleep(2) current_first_title = driver.find_element(By.CSS_SELECTOR, "div.opportunity-title").text # 提取当前页数据 extract_page_data(driver) prev_first_title = current_first_title
关键注意事项
- 不要频繁快速点击翻页,否则会触发网站反爬限制,导致页面无法加载新数据。
- 若翻页按钮点击无反应,检查元素是否正确(页面可能动态渲染按钮,需用
WebDriverWait等待按钮可见)。 - 部分网站分页时会显示加载动画,必须等待动画结束后再提取数据。
内容的提问来源于stack exchange,提问作者Oregon.Vlogrago
相关产品推荐
相关产品推荐

