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

Python使用BeautifulSoup爬取文件修改日期实现CSV增量下载

实现方法

你之前的代码仅定位了CSV链接所在的<a>标签,没有关联同一表格行内的修改日期字段。该页面的文件列表按行存储,每一行<tr>同时包含下载链接、修改日期、文件大小三个信息,只要逐行遍历条目即可同时提取两个字段。

修正后可直接运行的代码

from bs4 import BeautifulSoup
import requests
import pandas as pd
from io import StringIO
from datetime import datetime, timedelta

target_url = 'https://emi.ea.govt.nz/Wholesale/Datasets/FinalPricing/EnergyPrices'
resp = requests.get(target_url)
soup = BeautifulSoup(resp.text, 'html.parser')

file_list = []
# 遍历所有包含CSV下载链接的表格行
for tr in soup.select('tr:has(td.csv a)'):
    # 提取CSV下载地址
    csv_url = 'https://emi.ea.govt.nz' + tr.select_one('td.csv a')['href']
    # 提取同行第三列的修改日期文本,去除多余空白字符
    date_str = tr.select_one('td:nth-child(3)').text.strip()
    # 转换为datetime对象用于日期比对,匹配网站的 日/月/年 时:分 上/下午 格式
    modify_time = datetime.strptime(date_str, '%d/%m/%Y %I:%M %p')
    file_list.append({
        "url": csv_url,
        "modify_time": modify_time
    })

# 筛选昨日更新的文件,可根据实际需求调整日期阈值
yesterday = datetime.today().date() - timedelta(days=1)
to_download = [f for f in file_list if f['modify_time'].date() == yesterday]

# 仅下载需要增量更新的文件
new_data = []
for file in to_download:
    csv_resp = requests.get(file['url'])
    df = pd.read_csv(StringIO(csv_resp.content.decode('utf-8')))
    new_data.append(df)

# 对接本地存量数据:读入本地已存文件、拼接新数据后覆写保存即可
# local_data = pd.read_csv("energy_prices_history.csv")
# final_data = pd.concat([local_data, *new_data], ignore_index=True)
# final_data.to_csv("energy_prices_history.csv", index=False)

注意事项

  • 你原有代码存在缩进错误:df=pd.read_csv(data)和contents.append(df)未放在for循环内部,会导致仅读取最后一个链接的内容,运行时会报错,使用时需要修正缩进逻辑。
  • 如果运行时日期解析报错,可以先打印date_str查看页面实际返回的日期格式,对应调整strptime的格式参数即可。
  • 更稳妥的增量逻辑可以不用固定匹配昨日:每次脚本运行完记录本次下载到的最新文件修改时间,下次运行时筛选所有修改时间晚于该记录的文件即可,避免因脚本漏跑、网站更新延迟导致的数据遗漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.09 16:15:43