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

如何在Pandas循环中积累网页爬取的DataFrame数据?

解决循环爬取气象数据时无法积累历史数据的问题

你当前的问题核心是每次循环都会覆盖df_table变量,导致最终只保留最后一天的数据。要实现多日数据积累,需要把每天的DataFrame暂存到一个列表中,最后再合并成完整的数据集。

修改思路

  1. 初始化一个空列表,用于存储每日爬取的DataFrame
  2. 循环内将每日处理后的df_table添加到列表中
  3. 循环结束后,用pd.concat()合并列表中所有DataFrame
  4. 统一处理列名并导出CSV

修改后的完整代码

import pandas as pd
import requests
from bs4 import BeautifulSoup
from datetime import date, timedelta

def daterange(start_date, end_date):
    for n in range(int ((end_date - start_date).days)):
        yield start_date + timedelta(n)

start_date = date(2020, 6, 1)
end_date = date(2021, 3, 3)

# 初始化空列表存储每日数据
daily_dfs = []

for single_date in daterange(start_date, end_date):
    # 构造请求URL
    url = f"https://www.meteo.cat/observacions/xema/dades?codi=V3&dia={single_date}T00:00Z"        

    # 发送请求并解析页面
    res = requests.get(url)
    soup = BeautifulSoup(res.content,'lxml')
    table = soup.find_all('table')[2]
    df_table = pd.read_html(str(table))[0]
    # 添加日期列
    df_table['Fecha'] = single_date
    
    # 将当日数据添加到列表
    daily_dfs.append(df_table)

# 合并所有每日数据为一个大DataFrame
full_data = pd.concat(daily_dfs, ignore_index=True)

# 重命名列(按你的需求映射)
full_data.rename(columns={
    'PeríodeTU': 'Hora',
    'TM°C': 'Temperatura_Media',
    'HRM%': 'Humedad_Relativa'
}, inplace=True)

# 导出CSV
full_data.to_csv('Data/tempset.csv', header=True, index=False)

关键修改点说明

  • daily_dfs列表:作为每日DataFrame的容器,避免每次循环覆盖数据
  • daily_dfs.append(df_table):将当日处理好的DataFrame存入列表
  • pd.concat(daily_dfs, ignore_index=True):把列表中所有小DataFrame纵向合并,ignore_index=True重置索引避免重复
  • 列名映射:用rename()统一调整列名,替代原代码中手动赋值的方式,更简洁可靠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:06:09