使用Selenium遍历无下一页按钮的表格分页方案咨询
分页爬取实现方案
原有代码核心问题
- XPath语法错误,格式化字符串没有预留
{}占位符,无法匹配到对应页码元素 - 直接指定页码点击的方案,遇到分页出现省略号的场景会直接失效
- 没有等待页面跳转/元素加载完成就执行操作,容易触发无意义报错
实现逻辑
不用预先获取总页码,依靠当前页的active类标记判断分页进度:
- 每次先爬取当前页的表格数据
- 定位带有
active类的当前页码元素 - 查找该元素的下一个同级
<li>节点,如果该节点存在可点击的<a>标签,就点击进入下一页 - 如果找不到下一个可点击的分页节点,说明已经到最后一页,终止循环
完整修改后代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup as bs import pandas as pd import time path_driver = "C:/Users/CS330584/Documents/Documentos de Defesa da Concorrência/Automatização de Processos/chromedriver.exe" website = "https://sat.sef.sc.gov.br/tax.NET/Sat.Dva.Web/ConsultaPublicaDevedores.aspx" value_search = "300" # 存储所有爬取的数据 all_data = [] driver = webdriver.Chrome(path_driver) driver.get(website) # 显式等待设置,最长等10秒 wait = WebDriverWait(driver, 10) # 输入查询条件并搜索 search_max = wait.until(EC.presence_of_element_located((By.ID, "Body_Main_Main_ctl00_txtTotalDevedores"))) search_max.send_keys(value_search) btn_consult = wait.until(EC.element_to_be_clickable((By.ID, "Body_Main_Main_ctl00_btnBuscar"))) btn_consult.click() while True: # 等待当前页表格加载完成 wait.until(EC.presence_of_element_located((By.ID, "Body_Main_Main_grpDevedores_gridView"))) # 解析当前页表格 soup = bs(driver.page_source, 'lxml') table = soup.find('table', id='Body_Main_Main_grpDevedores_gridView') # 提取表格行数据,跳过表头和分页行 rows = table.find_all('tr')[1:-1] for row in rows: cols = [col.get_text(strip=True) for col in row.find_all('td')] if cols: all_data.append(cols) # 尝试找下一页 try: # 定位当前激活的页码 active_page = driver.find_element(By.CSS_SELECTOR, '#Body_Main_Main_grpDevedores_gridView li.active') # 找下一个分页li节点 next_page_li = active_page.find_element(By.XPATH, './following-sibling::li[1]') # 判断下一个节点是否有可点击的a标签(排除禁用的分页节点) next_page_a = next_page_li.find_element(By.TAG_NAME, 'a') # 点击下一页 next_page_a.click() # 等待页面跳转,新的页码激活 wait.until(EC.staleness_of(active_page)) time.sleep(0.5) except: # 找不到下一页节点,终止循环 break # 导出数据到csv df = pd.DataFrame(all_data) df.to_csv('devedores.csv', index=False, encoding='utf-8-sig') driver.quit()
注意事项
- 如果你使用的是selenium 4.6+版本,不需要手动指定chromedriver路径,Selenium会自动匹配对应版本的驱动
- 可以根据你的网络情况调整显式等待的时长,避免加载慢导致报错
- 爬取过程中不要手动操作浏览器窗口,避免元素定位失效
内容的提问来源于stack exchange,提问作者Rafael Queiroz
相关产品推荐
相关产品推荐

