如何用BeautifulSoup抓取FRED网站指定时段的图表数据?
解决方法
直接解析页面的Highcharts图表标签效率低且易出错,FRED页面源码中嵌入了完整的时间序列数据,我们可以直接提取该数据块,筛选目标时段后保存为Excel文件,具体步骤如下:
步骤1:提取页面内嵌的JSON数据
页面源码里的<script>标签包含window.fred.seriesObservations变量,存储了所有观测数据。用正则表达式匹配该JSON块即可获取完整数据集。
步骤2:筛选目标时间段数据
将JSON中的日期字符串转换为可识别的时间格式,筛选出2021年7月至2022年7月的数据,并格式化为需求的样式。
步骤3:保存为Excel文件
使用pandas库处理数据并生成Excel文件,比原生csv模块更适配表格格式。
完整可运行代码
import requests import re import json import pandas as pd from datetime import datetime url = "https://fred.stlouisfed.org/series/PCU33633363" page = requests.get(url, verify=False) # 匹配页面中的数据JSON块 pattern = re.compile(r'window\.fred\.seriesObservations = (.*?);') match = pattern.search(page.text) if not match: raise ValueError("未找到目标数据块") data_json = json.loads(match.group(1)) observations = data_json['observations'] # 筛选并格式化数据 filtered_data = [] start_date = datetime(2021, 7, 1) end_date = datetime(2022, 7, 1) for obs in observations: date = datetime.strptime(obs['date'], '%Y-%m-%d') if start_date <= date <= end_date: month_str = date.strftime('%b %Y') # 转换为"Jul 2021"格式 value = float(obs['value']) filtered_data.append({ 'Months': month_str, 'Value': value }) # 保存为Excel文件(需提前安装openpyxl:pip install openpyxl) df = pd.DataFrame(filtered_data) df.to_excel('fred_data.xlsx', index=False) # 输出需求格式的结果 for item in filtered_data: print(f"{item['Months']} = {item['Value']}")
代码说明
- 正则匹配JSON:精准定位页面中存储数据的变量,避免解析复杂HTML结构的麻烦。
- 时间筛选:通过
datetime对象实现时间段的精准判断,确保只保留目标区间的数据。 - Excel保存:
pandas的to_excel方法直接生成标准Excel文件,无需手动处理格式。
更稳定的替代方案:使用FRED官方API
如果需要长期抓取FRED数据,建议使用官方API(需注册获取免费密钥),数据请求更稳定且格式规范:
import pandas as pd from fredapi import Fred # 替换为你的FRED API密钥(注册地址:fred.stlouisfed.org/docs/api/api_key.html) fred = Fred(api_key='你的API密钥') data = fred.get_series('PCU33633363', start='2021-07-01', end='2022-07-01') data = data.reset_index() data.columns = ['Months', 'Value'] data['Months'] = data['Months'].dt.strftime('%b %Y') data.to_excel('fred_data_api.xlsx', index=False)
内容的提问来源于stack exchange,提问作者Zubair
相关产品推荐
相关产品推荐

