Python+Selenium爬取数据写入CSV仅保存最后一条如何解决
问题根因
- 核心问题是CSV文件打开的位置和模式错误:你在每次遍历单个条目的循环内部,用
w(覆盖写入)模式打开zbuyer6.csv,每次打开都会清空文件原有内容,只有最后一次循环写入的数据会被保留。 - 其次是写入逻辑缩进错误:
writer.writerow放在了for section in sections循环之外,若单页返回多个section,只会写入最后一个section的数据。 - 反复在循环内开关文件也会增加不必要的IO开销。
修正方案
- 将CSV文件初始化、写入表头的逻辑移到所有循环的最外层,全程只打开一次文件,所有数据写入完成后再自动关闭。
- 调整
writer.writerow的缩进,保证每个section提取到的数据都能正常写入。 - 可添加表头行,方便后续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
相关产品推荐
相关产品推荐

