While循环在分页按钮禁用后未终止,重复爬取同一页面问题
解决Selenium分页爬取时禁用按钮无法退出循环的问题
问题根源分析
- 表格元素未刷新:原代码中
row_group在循环外初始化,页面切换后仍引用旧页面的表格元素,导致每次循环都重复爬取同一页内容。 - 分页按钮判断逻辑错误:禁用状态下的分页按钮依然存在,
presence_of_element_located会成功找到元素,但点击无效且不会触发异常,循环持续执行。 - 异常处理冗余:异常分支里的等待操作没必要,且未正确判断按钮的禁用状态。
修改后的代码
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import csv import time with open('testfile.csv', 'w', newline='') as csvfile: wr = csv.writer(csvfile, delimiter=',', skipinitialspace=True) wr.writerow(header) while True: # 每次循环重新定位当前页面的表格tbody,确保获取最新内容 row_group = WebDriverWait(driver, 10).until(EC.element_to_be_clickable( (By.XPATH, '//*[@id="mainPanel"]/div/div/div[2]/div[1]/div[2]/div/div/div[3]/div/div/div/div/div[2]/table/tbody'))) # 爬取当前页面所有行数据 for row in row_group.find_elements(By.CSS_SELECTOR, 'tr'): wr.writerow([d.text for d in row.find_elements(By.CSS_SELECTOR, 'td')]) time.sleep(1) # 非必需,可根据页面实际情况移除或替换为显式等待 print(f"当前页处理完成") try: # 等待下一页按钮可点击,超时则说明按钮已禁用 next_link = WebDriverWait(driver, 5).until( EC.element_to_be_clickable((By.CLASS_NAME, "ant-pagination-next"))) next_link.click() # 等待旧表格元素失效,确保新页面加载完成(替代固定sleep) WebDriverWait(driver, 10).until(EC.staleness_of(row_group)) except: print('没有更多页面了') break
关键修改点说明
- 表格元素循环内获取:将
row_group的定位移到while循环内部,每次页面切换后重新获取当前页的表格,避免引用旧元素。 - 用可点击状态判断分页按钮:
EC.element_to_be_clickable会等待按钮处于可点击状态,若按钮禁用(不可点击)则触发超时异常,直接进入退出逻辑。 - 替换固定sleep为显式等待:用
EC.staleness_of(row_group)等待旧表格元素失效,确保新页面加载完成,提升代码稳定性。 - 简化异常处理:移除冗余的等待操作,捕获超时异常后直接退出循环。
额外优化方案(可选)
可以直接检查按钮的类属性判断是否禁用,避免依赖异常处理:
next_link = driver.find_element(By.CLASS_NAME, "ant-pagination-next") if "ant-pagination-disabled" in next_link.get_attribute("class"): print('没有更多页面了') break else: next_link.click() WebDriverWait(driver, 10).until(EC.staleness_of(row_group))
内容的提问来源于stack exchange,提问作者abs
相关产品推荐
相关产品推荐

