如何用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
相关产品推荐
相关产品推荐

