Selenium+BeautifulSoup爬虫数据被覆盖仅存2页数据的解决方案咨询
解决Selenium+BeautifulSoup爬取时CSV数据被覆盖的问题
核心问题定位
你遇到的CSV仅保留第2页数据的情况,大概率是以下两个原因:
- 数据存储变量在循环内被重复初始化,导致每爬一页就清空之前的累积数据;
- CSV写入逻辑错误——比如在循环内用
'w'模式写入,每次都会覆盖整个文件;或是用'a'但没处理好表头/数据追加逻辑。
针对性解决方案
方案1:先累积所有数据,再一次性写入CSV
这种方式最稳妥,避免多次写入的覆盖问题:
from selenium import webdriver from bs4 import BeautifulSoup import csv # 总数据列表放在循环外,避免每次循环重置 all_data = [] # 初始化一次浏览器,减少资源开销 driver = webdriver.Chrome() # 遍历目标页面 for page_num in range(1, 3): # 示例爬1-2页 driver.get(f"你的目标URL?page={page_num}") soup = BeautifulSoup(driver.page_source, "html.parser") # 提取当前页数据(替换成你的实际元素定位逻辑) items = soup.find_all("div", class_="target-item") for item in items: title = item.find("h2").text.strip() price = item.find("span", class_="price").text.strip() all_data.append({"标题": title, "价格": price}) # 所有页面爬取完成后,一次性写入CSV with open("result.csv", "w", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=["标题", "价格"]) writer.writeheader() writer.writerows(all_data) driver.quit()
方案2:逐页追加写入CSV(适合大数量数据,避免内存占用过高)
如果数据量很大,不想一次性存在内存里,可以用追加模式,但要注意只写一次表头:
from selenium import webdriver from bs4 import BeautifulSoup import csv import os driver = webdriver.Chrome() fieldnames = ["标题", "价格"] # 判断文件是否已存在,决定是否写入表头 file_exists = os.path.isfile("result.csv") for page_num in range(1, 3): driver.get(f"你的目标URL?page={page_num}") soup = BeautifulSoup(driver.page_source, "html.parser") page_data = [] items = soup.find_all("div", class_="target-item") for item in items: title = item.find("h2").text.strip() price = item.find("span", class_="price").text.strip() page_data.append({"标题": title, "价格": price}) # 用追加模式写入 with open("result.csv", "a", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=fieldnames) if not file_exists: writer.writeheader() file_exists = True # 写过表头后标记为已存在,避免重复写入 writer.writerows(page_data) driver.quit()
排查验证步骤
- 在循环内打印
len(all_data)(方案1)或len(page_data)(方案2),确认每一页的数据都被正确提取; - 检查写入CSV的代码位置——如果是在循环内用
'w'模式,必然会覆盖之前的内容,直接改成上述两种写法即可; - 若用
'a'模式仍无效,检查是否每次循环都重新初始化了数据列表,导致没有数据可追加。
内容的提问来源于stack exchange,提问作者Amen Aziz
相关产品推荐
相关产品推荐

