Python Selenium爬取分页表格写Excel覆盖仅存最后一页问题
问题根因
代码存在两个逻辑问题导致最终只保留最后一页数据:
- 存储采集结果的
Canada_Result列表定义在分页循环内部,每次翻页都会被重置为空列表,之前采集的数据直接丢失 - 循环内每次采集完当前页数据就调用
to_excel写入文件,pandas该方法默认使用覆盖写入模式,每次执行都会清空原有文件内容替换为当前页数据
修复代码
调整逻辑:将全量结果列表移到循环外初始化,所有分页数据采集完成后统一写入Excel,同时修复原代码硬编码每页25条数据、xpath选择器无效、固定循环20次可能提前/延后终止的问题,修复后完整代码如下:
from selenium import webdriver import pandas as pd import time driver = webdriver.Chrome('C:\Webdriver\chromedriver.exe') driver.get('https://www150.statcan.gc.ca/n1/pub/71-607-x/2021004/imp-eng.htm?r1=(1)&r2=0&r3=0&r4=12&r5=0&r7=0&r8=2022-01-01&r9=2022-01-01') time.sleep(2) # 全量采集结果列表在循环外初始化,全程仅创建一次 Canada_Result = [] for page in range(20): # 移除xpath中无效的["i"]筛选,直接获取当前页所有行的对应元素 commodities = driver.find_elements_by_xpath('.//*[@id="report_table"]/tbody/tr/td[2]/a') countries = driver.find_elements_by_xpath('.//*[@id="report_table"]/tbody/tr/td[4]') quantities = driver.find_elements_by_xpath('.//*[@id="report_table"]/tbody/tr/td[7]') weights = driver.find_elements_by_xpath('.//*[@id="report_table"]/tbody/tr/td[8]/abbr') # 按当前页实际数据条数遍历,避免最后一页不足25条时触发索引报错 for i in range(len(commodities)): row_data = { 'Commodity': commodities[i].text, 'Country': countries[i].text, 'quantity': quantities[i].text, 'weight': weights[i].text } Canada_Result.append(row_data) # 定位下一页按钮,若按钮已置灰(无更多分页)则提前终止循环 next_btn = driver.find_element_by_xpath('//*[@id="report_results_next"]') if "disabled" in next_btn.get_attribute("class"): break next_btn.click() time.sleep(1) # 所有分页数据采集完成后,一次性写入Excel,无覆盖问题 df = pd.DataFrame(Canada_Result) df.to_excel('Canada_scrapping_result.xlsx', index=False) driver.quit()
可选方案
如果需要边采集边写入(适用于数据量极大、内存不足的场景),可以使用追加写入模式,需要提前安装openpyxl库,写入时指定引擎和追加模式:
- 第一次写入(文件不存在时)使用默认覆盖模式,写入表头和第一页数据
- 后续分页写入时添加参数
mode='a', engine='openpyxl', header=False, index=False,即可在已有文件末尾追加数据,不会覆盖原有内容
这种方式效率低于一次性写入,非大内存占用场景不推荐使用。
内容的提问来源于stack exchange,提问作者user16832397
相关产品推荐
相关产品推荐

