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

使用R批量抓取美联储指定PDF文件的技术求助

用R批量抓取美联储FOMC相关PDF文件

需求说明

需要从美联储FOMC历史年份主页面及各年份子页面,批量下载三类PDF文件:

  • Beige Book(褐皮书)
  • Tealbook A(青皮书A)
  • FOMC会议声明

已尝试的无效方法

  1. 直接抓取主页面PDF链接
    使用rvest抓取主页面的所有PDF链接,但未获取到任何文件——原因是主页面仅包含年份入口链接,实际PDF链接都在各年份子页面中。
    代码如下:

    library(tidyverse)
    library(rvest)
    
    url <- "https://www.federalreserve.gov/monetarypolicy/fomc_historical_year.htm"
    
    page <- read_html(url)
    
    urls_pdf <- page %>% 
      html_elements("a") %>% 
      html_attr("href") %>% 
      str_subset("\\.pdf") 
    
    urls_pdf[1:3] %>% walk2(basename(.), download.file, mode = "wb")
    
    dir(pattern = "\\.pdf")
    
  2. 硬编码Tealbook A链接格式
    通过固定日期规则生成Tealbook A的链接,但仅部分文件有效——原因是美联储的文件命名规则并非完全统一,部分年份/会议的链接格式存在差异。
    代码片段:

    # Initialize list to store links for tealbook A reports
    tealA <- list()
    
    # Generate links for tealbook A reports
    for (i in seq_along(fomc_dates)) {
      this_fomc <- fomc_dates[i]
      this_teal_A <- this_fomc - days(12)
      link <- paste0("https://www.federalreserve.gov/monetarypolicy/files/FOMC", format(this_fomc, "%Y%m%d"), "tealbooka", format(this_teal_A, "%Y%m%d"), ".pdf")
      tealA[[i]] <- link
    }
    

自动化解决方案

核心思路

  1. 从主页面抓取所有年份子页面的链接
  2. 遍历每个年份子页面,根据链接文本筛选目标三类PDF的链接
  3. 将相对链接转换为绝对链接
  4. 批量下载,加入错误处理避免中断

完整代码

library(rvest)
library(purrr)
library(httr)
library(stringr)

# 1. 获取所有年份子页面链接
main_url <- "https://www.federalreserve.gov/monetarypolicy/fomc_historical_year.htm"
main_page <- read_html(main_url)

year_links <- main_page %>%
  html_elements("a") %>%
  html_attr("href") %>%
  # 筛选年份子页面链接(匹配fomchistorical+年份的格式)
  str_subset("fomchistorical\\d{4}\\.htm") %>%
  # 转换为绝对链接
  url_absolute(base = main_url)

# 2. 定义函数:从单个年份页面抓取目标PDF链接
get_pdf_links <- function(year_url) {
  cat("处理页面:", year_url, "\n")
  page <- tryCatch(read_html(year_url), error = function(e) {
    cat("读取页面失败:", year_url, "\n")
    return(NULL)
  })
  if (is.null(page)) return(NULL)
  
  # 抓取所有带文本的链接,筛选目标类型
  links <- page %>%
    html_elements("a") %>%
    tibble(
      text = html_text(.),
      href = html_attr("href")
    ) %>%
    # 筛选目标三类PDF的链接
    filter(
      str_detect(text, regex("beige book", ignore_case = TRUE)) |
        str_detect(text, regex("tealbook a", ignore_case = TRUE)) |
        str_detect(text, regex("statement", ignore_case = TRUE))
    ) %>%
    # 仅保留PDF链接
    filter(str_detect(href, "\\.pdf")) %>%
    # 转换为绝对链接
    mutate(href = url_absolute(href, base = year_url)) %>%
    pull(href)
  
  return(links)
}

# 3. 批量获取所有目标PDF链接
all_pdf_links <- map(year_links, get_pdf_links) %>%
  flatten_chr() %>%
  unique() # 去重(部分文件可能在多个页面出现)

cat("共找到", length(all_pdf_links), "个目标PDF文件\n")

# 4. 定义下载函数(带错误处理)
download_pdf <- function(link) {
  filename <- basename(link)
  # 如果文件已存在,跳过
  if (file.exists(filename)) {
    cat("文件已存在,跳过:", filename, "\n")
    return(TRUE)
  }
  # 下载,重试3次
  result <- tryCatch(
    download.file(link, destfile = filename, mode = "wb", quiet = TRUE),
    error = function(e) {
      cat("下载失败:", link, "\n")
      return(FALSE)
    }
  )
  if (result == 0) {
    cat("下载成功:", filename, "\n")
    return(TRUE)
  } else {
    cat("下载失败:", link, "\n")
    return(FALSE)
  }
}

# 5. 批量下载
walk(all_pdf_links, download_pdf)

代码说明

  • 链接筛选:通过链接文本的关键词(忽略大小写)精准匹配目标文件,避免硬编码格式的局限性
  • 错误处理:加入tryCatch处理页面读取和下载失败的情况,确保批量任务不会中断
  • 去重逻辑:避免重复下载同一文件
  • 跳过已存在文件:节省时间,避免重复操作

内容的提问来源于stack exchange,提问作者JF96

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:43:19