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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:06:40