如何用Python自动下载英格兰银行官网的CSV文件?
解决英格兰银行官网CSV文件自动下载问题
问题原因
你原代码的核心问题在于:
- 原URL中的
#是页面锚点,并非资源路径,直接拼接.csv无法指向真实的CSV文件 - 该页面的CSV文件是通过表单动态生成的,并非静态文件,无法直接通过简单的URL拼接获取
解决方案
方案一:直接使用预构造的CSV下载链接
英格兰银行的银行利率历史数据可以通过带参数的直接链接获取,以下代码可直接读取CSV数据:
import pandas as pd # 指向完整历史银行利率数据的CSV下载链接 csv_url = "https://www.bankofengland.co.uk/boeapps/database/fromshowcolumns.asp?csv.x=yes&Datefrom=01/01/1975&Dateto=&SeriesCodes=IUDBEDR&CSVF=TN&UsingCodes=Y&VPD=Y&VFD=N" orig_m = pd.read_csv(csv_url).dropna(how='all') # 验证数据 print(orig_m.head())
方案二:模拟表单提交(更通用)
如果后续官网参数发生变化,可通过解析页面表单、模拟提交请求的方式动态获取CSV:
import requests from bs4 import BeautifulSoup import pandas as pd from io import StringIO # 目标页面URL base_url = "https://www.bankofengland.co.uk/boeapps/database/Bank-Rate.asp" # 1. 获取页面内容,解析表单参数 response = requests.get(base_url, headers={"User-Agent": "Mozilla/5.0"}) soup = BeautifulSoup(response.text, "html.parser") # 定位数据导出表单 export_form = soup.find("form", attrs={"action": "fromshowcolumns.asp"}) form_params = {} # 提取表单内的默认参数 for input_tag in export_form.find_all("input"): name = input_tag.get("name") value = input_tag.get("value") if name and value: form_params[name] = value # 添加CSV导出触发参数 form_params["csv.x"] = "yes" # 2. 提交表单获取CSV数据 csv_response = requests.post( "https://www.bankofengland.co.uk/boeapps/database/fromshowcolumns.asp", data=form_params, headers={"User-Agent": "Mozilla/5.0"} ) # 3. 解析CSV为DataFrame orig_m = pd.read_csv(StringIO(csv_response.text)).dropna(how='all') # 验证数据 print(orig_m.head())
注意事项
- 若遇到请求被拦截,可在
headers中添加更多浏览器标识信息模拟正常访问 - 官网的表单参数或下载链接可能会更新,定期检查代码可用性
内容的提问来源于stack exchange,提问作者msh855
相关产品推荐
相关产品推荐

