如何在Pandas循环中积累网页爬取的DataFrame数据?
解决循环爬取气象数据时无法积累历史数据的问题
你当前的问题核心是每次循环都会覆盖df_table变量,导致最终只保留最后一天的数据。要实现多日数据积累,需要把每天的DataFrame暂存到一个列表中,最后再合并成完整的数据集。
修改思路
- 初始化一个空列表,用于存储每日爬取的DataFrame
- 循环内将每日处理后的
df_table添加到列表中 - 循环结束后,用
pd.concat()合并列表中所有DataFrame - 统一处理列名并导出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
相关产品推荐
相关产品推荐

