You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python+Selenium爬取数据写入CSV仅保存最后一条如何解决

问题根因
  • 核心问题是CSV文件打开的位置和模式错误:你在每次遍历单个条目的循环内部,用w(覆盖写入)模式打开zbuyer6.csv,每次打开都会清空文件原有内容,只有最后一次循环写入的数据会被保留。
  • 其次是写入逻辑缩进错误:writer.writerow放在了for section in sections循环之外,若单页返回多个section,只会写入最后一个section的数据。
  • 反复在循环内开关文件也会增加不必要的IO开销。
修正方案
  1. 将CSV文件初始化、写入表头的逻辑移到所有循环的最外层,全程只打开一次文件,所有数据写入完成后再自动关闭。
  2. 调整writer.writerow的缩进,保证每个section提取到的数据都能正常写入。
  3. 可添加表头行,方便后续CSV文件的字段识别,同时指定utf-8-sig编码避免中文乱码。
优化后完整代码
import csv
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 外层初始化CSV文件,仅打开一次
with open('zbuyer6.csv', 'w', encoding='utf-8-sig', newline='') as file:
    writer = csv.writer(file)
    # 写入表头
    writer.writerow(['姓名', '邮箱'])
    
    i = 1
    while i < 10:
        myxpath = "/html/body/div[1]/div[3]/div/div[1]/leads-list/div/ul/li["+str(i)+"]"
        print(myxpath)
        time.sleep(5)
        item = (By.XPATH, '//*[@id="description"]')
        WebDriverWait(driver, 50).until(EC.element_to_be_clickable(item))
        Itemlinks = driver.find_elements_by_xpath(myxpath)
        print('total items displayed in current page', len(Itemlinks))
        for items in Itemlinks:
            items.click()
            print("item clicked")
            time.sleep(10)
            sections = driver.find_elements_by_xpath('//*[@id="longDescriptionHTML"]')
            for section in sections:
                name = section.find_element_by_xpath(
                    "/html/body/div[1]/div[3]/div/div[2]/lead-detail/div[4]/div[1]/div[2]/h1").text
                email = section.find_element_by_xpath(
                    "/html/body/div[1]/div[3]/div/div[2]/lead-detail/div[4]/div[1]/ul[1]/li[1]/div[1]/ul/li[2]").text
                print(name, email)
                # 调整缩进,每个section的数据直接写入
                writer.writerow((name, email))
            driver.find_element_by_class_name("back-link.pull-left.col-md-3").click()
            driver.execute_script("window.scrollTo(0, 50)")
            time.sleep(5)
        i += 1
补充说明
  • 若你使用的是Selenium 4.0+版本,原有的find_elements_by_xpath、find_element_by_xpath方法已被弃用,可统一替换为find_elements(By.XPATH, 路径)、find_element(By.XPATH, 路径)写法。
  • 代码中的newline=''参数是为了避免CSV写入时出现多余空行。

内容的提问来源于stack exchange,提问作者haben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:57:02