You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python判断下一页按钮是否可用并实现循环爬取

分页爬取下判断下一页按钮可用性的实现

需要实现网页活动数据的分页爬取,循环进入下一页继续爬取,直到下一页按钮不可用时停止,核心是在if...else中完成下一页按钮的可用性判断逻辑。


现有代码片段

1. 依赖库及驱动初始化代码

from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
selector = '.event-poster'
driver.get('website_link_here')
links = WebDriverWait(driver, timeout=500).until(lambda d: d.find_elements(By.CSS_SELECTOR, selector))

注:原代码中导入的lib2to3.pgen2.driver为无用依赖,建议删除

2. scrapy()函数代码

def scrapy(i):
    event_name = '.col-md-12 h1'
    # 直接使用主循环中已获取的links,无需重复查询
    links[i].click()
    name_e = WebDriverWait(driver, timeout=500).until(lambda d: d.find_element(By.CSS_SELECTOR, event_name))
    print(name_e.text)
    driver.back()

注:原函数依赖全局变量i,改为传入参数可避免作用域冲突问题

3. 主循环代码

while True:
    for i in range(len(links)):
        scrapy(i)

    # 需补充下一页按钮的判断逻辑
    if # 此处填写判断条件: 
        next_page = '//*[@class="pagination"]/span[7]/a'
        link = WebDriverWait(driver, timeout=160).until(lambda d: d.find_element(By.XPATH, next_page))
        driver.execute_script("arguments[0].click();", link)
        # 点击下一页后必须重新获取当前页的活动链接
        links = WebDriverWait(driver, timeout=500).until(lambda d: d.find_elements(By.CSS_SELECTOR, selector))
    else:
        break

driver.quit()

下一页按钮可用性的判断逻辑实现

根据网页下一页按钮的两种常见状态,对应不同的判断方式:

场景1:最后一页无下一页按钮

通过尝试查找元素,判断是否存在来确认是否还有下一页:

while True:
    for i in range(len(links)):
        scrapy(i)

    has_next = False
    try:
        # 缩短超时时间,避免不必要的等待
        next_page = '//*[@class="pagination"]/span[7]/a'
        WebDriverWait(driver, 10).until(lambda d: d.find_element(By.XPATH, next_page))
        has_next = True
    except:
        # 捕获元素未找到异常,说明已到最后一页
        pass

    if has_next:
        link = driver.find_element(By.XPATH, next_page)
        driver.execute_script("arguments[0].click();", link)
        # 重新获取当前页的活动链接
        links = WebDriverWait(driver, timeout=500).until(lambda d: d.find_elements(By.CSS_SELECTOR, selector))
    else:
        break

driver.quit()

场景2:最后一页下一页按钮存在但被禁用

若最后一页仍显示下一页按钮,但通过disabled类或属性标记为不可点击,可通过检查元素属性判断:

while True:
    for i in range(len(links)):
        scrapy(i)

    has_next = False
    try:
        next_page = '//*[@class="pagination"]/span[7]/a'
        link = WebDriverWait(driver, 10).until(lambda d: d.find_element(By.XPATH, next_page))
        # 根据网页实际禁用特征调整判断条件,比如检查class或disabled属性
        if 'disabled' not in link.get_attribute('class') and link.is_enabled():
            has_next = True
    except:
        pass

    if has_next:
        driver.execute_script("arguments[0].click();", link)
        links = WebDriverWait(driver, timeout=500).until(lambda d: d.find_elements(By.CSS_SELECTOR, selector))
    else:
        break

driver.quit()

额外注意事项

  • 点击下一页后必须重新获取当前页的links,否则会持续操作上一页的链接
  • 超时时间可根据网页实际加载速度调整,无需设置过大(如原代码的160秒可改为10-30秒)
  • 尽量避免全局变量依赖,可考虑将links作为参数传入scrapy()函数

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:10:29