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
相关产品推荐
相关产品推荐

