Python每日爬取丹麦国家银行5种汇率追加至Excel方案咨询
最简可落地方案(适配Python初学者)
直接选学习成本最低、稳定性最高的技术组合,不用搞复杂框架:
- 依赖安装:执行
pip install requests beautifulsoup4 pandas openpyxl一次性装完所有需要的库 - 网页请求用
requests:代码量少,不用模拟浏览器,足够应付这个静态页面 - 页面解析用
BeautifulSoup4:语法简单,找表格、提数据比正则好上手太多 - Excel读写用
pandas+openpyxl引擎:不用手动操作Excel单元格,几行代码就能实现追加写入,不容易出格式错 - 定时跑任务直接用系统自带工具:Windows用任务计划程序、Mac/Linux用crontab,比写Python死循环定时稳定10倍,电脑重启也能自动恢复
核心实现逻辑
- 发请求拿页面内容
不要裸发请求,加个普通浏览器的User-Agent,加超时时间,避免被拦截或者挂死:import requests from bs4 import BeautifulSoup import pandas as pd from datetime import datetime import os TARGET_CURRENCIES = ["USD", "EUR", "GBP", "JPY", "SEK"] # 替换成你需要的5种货币代码 EXCEL_SAVE_PATH = "dn_exchange_rates.xlsx" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } url = "https://www.nationalbanken.dk/en/statistics/exchange_rates/pages/default.aspx" resp = requests.get(url, headers=headers, timeout=15) resp.raise_for_status() # 状态码不对直接抛错,避免拿错页面解析出垃圾数据 - 解析提取目标数据
打开页面按F12定位到汇率对应的table标签,遍历行匹配你要的5种货币,提取币种、汇率值,加上当日日期字段:soup = BeautifulSoup(resp.text, "html.parser") rate_table = soup.find("table", attrs={"class": "table table-striped"}) # 按实际页面的表格属性调整定位规则 rows = rate_table.find_all("tr")[1:] # 跳过表头行 today_data = [] current_date = datetime.now().strftime("%Y-%m-%d") for row in rows: cols = [col.text.strip() for col in row.find_all("td")] currency_code = cols[0] # 按实际表格列顺序调整索引 if currency_code in TARGET_CURRENCIES: today_data.append({ "record_date": current_date, "currency": currency_code, "exchange_rate": float(cols[2].replace(",", ".")) # 转换欧洲格式的逗号小数点为标准点号 }) # 校验数据完整性 if len(today_data) != len(TARGET_CURRENCIES): raise ValueError(f"缺失目标货币汇率,仅拿到{len(today_data)}种,爬取终止") df_today = pd.DataFrame(today_data) - 追加写入Excel
自动判断文件是否存在,存在就追加,不存在就新建,写入前去重避免重复存当天数据:if os.path.exists(EXCEL_SAVE_PATH): df_old = pd.read_excel(EXCEL_SAVE_PATH, engine="openpyxl") # 剔除已存在的当日数据,避免重复写入 df_old = df_old[df_old["record_date"] != current_date] df_final = pd.concat([df_old, df_today], ignore_index=True) else: df_final = df_today df_final.to_excel(EXCEL_SAVE_PATH, index=False, engine="openpyxl")
开发重点注意事项
- 别上来就用Selenium/Playwright这类浏览器自动化工具:这个页面是静态渲染的,直接发请求就能拿数据,上自动化工具不仅装环境麻烦,还容易因为浏览器驱动版本、页面加载慢出各种幺蛾子,新手hold不住。
- 数据格式要统一:欧洲网站的小数默认用逗号分隔,爬下来要替换成点再转成数值类型,不然存到Excel里是文本,没法做计算。日期格式固定成
YYYY-MM-DD,别用带斜杠或者本地化的格式,后续筛选排序更方便。 - 防数据损坏:写Excel的时候一定要确保文件是关闭状态,被其他程序占用的话会直接报错。稳妥点可以每次写入前把旧文件复制一份加个日期后缀当备份,就算代码写崩了也不会丢历史数据。
- 定时任务别踩坑:不要写
while True + time.sleep(86400)的循环定时,电脑关机、程序闪退就会中断任务,用系统自带的定时工具最稳。执行时间选在丹麦央行更新汇率之后,别爬早了拿到前一天的旧数据。 - 反爬不用过度紧张:你一天只爬1次,加个正常User-Agent就不会被封,没必要买代理、搞IP池,纯浪费成本。
- 异常要加捕获:网络波动、页面结构微调都可能导致爬取失败,给核心逻辑加try-except,失败了打印错误日志就行,别让程序直接闪退,也别把错误的空数据写到Excel里。
内容的提问来源于stack exchange,提问作者B.Birgovan
相关产品推荐
相关产品推荐

