使用R批量抓取美联储指定PDF文件的技术求助
用R批量抓取美联储FOMC相关PDF文件
需求说明
需要从美联储FOMC历史年份主页面及各年份子页面,批量下载三类PDF文件:
- Beige Book(褐皮书)
- Tealbook A(青皮书A)
- FOMC会议声明
已尝试的无效方法
直接抓取主页面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")硬编码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 }
自动化解决方案
核心思路
- 从主页面抓取所有年份子页面的链接
- 遍历每个年份子页面,根据链接文本筛选目标三类PDF的链接
- 将相对链接转换为绝对链接
- 批量下载,加入错误处理避免中断
完整代码
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
相关产品推荐
相关产品推荐

