You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Selenium爬虫无法跳转至下页的技术求助

解决Selenium翻页按钮定位失败的问题

嘿,我刚看完你的问题,这事儿我之前爬招标类网站也遇到过!核心问题大概率出在绝对XPath的脆弱性缺少可靠的等待机制上,再加上市面这类网站的分页按钮经常有动态加载、元素遮挡的情况,咱们一步步来解决:

1. 立刻抛弃绝对XPath,改用稳定的相对定位

你用的绝对XPath(/html/body/div[1]/div[3]/div/div/form/div[3]/div/div/ul[1]/li[4]/a)完全绑定页面DOM的层级结构,只要网站改个弹窗、调个div顺序,这路径直接就废了。我帮你看了下目标站的分页按钮,它有更靠谱的标识——下一页的a标签带rel="next"属性,父级li有pager-next类,换成下面的相对定位试试:

# 推荐方式:通过rel属性精准定位下一页按钮
next_btn_locator = (By.XPATH, '//a[@rel="next"]')
# 备选方式:通过父级class定位
next_btn_locator = (By.XPATH, '//li[contains(@class, "pager-next")]/a')

2. 用显式等待替代硬sleep,确保元素真的可交互

time.sleep(5)是赌运气的硬等待,页面加载慢了不够快了浪费时间。改用WebDriverWait等待按钮可点击,这才是爬虫稳定的关键:

# 先把你的循环逻辑重构一下,记住顺序:爬当前页 → 翻页 → 等新页加载
while True:
    try:
        # ------------ 第一步:先爬当前页数据!你原来的代码漏了这一步! ------------
        # 这里放你解析当前页、写入CSV的代码,比如用BeautifulSoup处理driver.page_source
        
        # 等待下一页按钮可点击,最多等10秒
        next_btn = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable(next_btn_locator)
        )
        # 滚动到按钮可见位置(防止被固定页脚/弹窗遮挡)
        driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", next_btn)
        # 点击下一页
        next_btn.click()
        # 等待新页面加载完成(用页面里的特征元素判断,比如招标列表项)
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '.tender-list-item'))
        )
    except (TimeoutException, NoSuchElementException, ElementClickInterceptedException) as e:
        print(f"翻页结束或出现错误: {str(e)}")
        break

3. 排查几个容易踩坑的细节

  • 检查是否在iframe里:打开开发者工具,看看分页按钮的DOM是不是嵌套在<iframe>里,如果是,得先切换iframe:driver.switch_to.frame("iframe的id或name")
  • 按钮被遮挡就用JS点击:如果滚动后还是点不动(比如有弹窗遮着),换用JS强制点击:driver.execute_script("arguments[0].click();", next_btn)
  • 判断最后一页的状态:到最后一页时,下一页按钮会变成禁用状态(加disabled类),可以提前判断:
    next_btn = driver.find_element(*next_btn_locator)
    if "disabled" not in next_btn.get_attribute("class"):
        next_btn.click()
    else:
        print("已到最后一页,停止翻页")
        break
    

4. 修复你现有代码的逻辑漏洞

你原来的循环直接点击按钮,既没先爬当前页数据,也没等待新页面加载,这要么会导致程序提前报错终止,要么会重复点同一个按钮。一定要遵循爬当前页 → 等待翻页按钮 → 点击后等新页加载的流程。

把这些调整整合到你的代码里,应该就能顺利翻页了!

内容的提问来源于stack exchange,提问作者MBWD

火山引擎 最新活动