如何使用Selenium遍历分页,提取表格的全部数据?
使用Selenium提取带分页的表格全量数据
你的问题在于目标页面的分页数据是动态加载的,requests只能获取初始加载的第一页内容,而Selenium可以模拟浏览器的翻页操作,遍历所有页面提取完整数据。以下是实现步骤和完整代码:
实现思路
- 用Selenium启动浏览器,加载目标页面
- 提取当前页的表格数据(表头只提取一次)
- 找到分页栏的「下一页」按钮,点击切换页面
- 重复提取+翻页,直到「下一页」按钮不可点击(或不存在)
- 将所有数据保存到CSV文件
完整代码
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 selenium.common.exceptions import NoSuchElementException, ElementClickInterceptedException import csv # 初始化Chrome浏览器(需提前下载对应版本的ChromeDriver) driver = webdriver.Chrome() url = "https://www.portfoliopersonal.com/Cotizaciones/Cedears" driver.get(url) # 存储所有表格数据,先初始化表头 all_table_data = [] wait = WebDriverWait(driver, 10) try: # 等待表格加载完成,提取表头(仅执行一次) table = wait.until(EC.presence_of_element_located((By.TAG_NAME, "table"))) header_row = table.find_element(By.TAG_NAME, "tr") headers = [cell.text.strip() for cell in header_row.find_elements(By.TAG_NAME, "th")] all_table_data.append(headers) while True: # 提取当前页的表格数据(跳过已提取的表头行) rows = table.find_elements(By.TAG_NAME, "tr")[1:] for row in rows: row_data = [cell.text.strip() for cell in row.find_elements(By.TAG_NAME, "td")] all_table_data.append(row_data) # 尝试点击下一页按钮 try: next_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.pagination-next"))) # 检查按钮是否处于禁用状态 if "disabled" in next_button.get_attribute("class"): break next_button.click() # 等待页面刷新,表格重新加载 wait.until(EC.staleness_of(table)) table = wait.until(EC.presence_of_element_located((By.TAG_NAME, "table"))) except (NoSuchElementException, ElementClickInterceptedException): # 找不到下一页按钮或无法点击,说明已到最后一页 break finally: # 关闭浏览器 driver.quit() # 保存全量数据到CSV with open('full_output.csv', 'w', newline='', encoding='utf-8') as csvfile: csv_writer = csv.writer(csvfile) csv_writer.writerows(all_table_data) print(f"全量表格数据已保存到 'full_output.csv',共{len(all_table_data)-1}条记录")
关键注意事项
- ChromeDriver配置:需下载与你的Chrome浏览器版本匹配的ChromeDriver,可将其放在Python安装目录,或在初始化时指定路径
webdriver.Chrome(executable_path="path/to/chromedriver") - 等待机制:使用
WebDriverWait替代time.sleep(),确保元素加载完成后再操作,避免页面加载慢导致的错误 - 分页按钮定位:若目标网站的分页按钮选择器不同,需通过浏览器开发者工具查看实际HTML结构,修改
By.CSS_SELECTOR的参数(比如有些网站用#next-page或.next作为选择器) - 异常处理:捕获找不到按钮或无法点击的异常,避免程序崩溃,确保正常退出循环
内容的提问来源于stack exchange,提问作者megaqbit
相关产品推荐
相关产品推荐

