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

Selenium+BeautifulSoup爬虫数据被覆盖仅存2页数据的解决方案咨询

解决Selenium+BeautifulSoup爬取时CSV数据被覆盖的问题

核心问题定位

你遇到的CSV仅保留第2页数据的情况,大概率是以下两个原因:

  1. 数据存储变量在循环内被重复初始化,导致每爬一页就清空之前的累积数据;
  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()

排查验证步骤

  1. 在循环内打印len(all_data)(方案1)或len(page_data)(方案2),确认每一页的数据都被正确提取;
  2. 检查写入CSV的代码位置——如果是在循环内用'w'模式,必然会覆盖之前的内容,直接改成上述两种写法即可;
  3. 若用'a'模式仍无效,检查是否每次循环都重新初始化了数据列表,导致没有数据可追加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:35:21