如何用rvest下载存储在AWS上的网站PDF文件
解决rvest下载澳大利亚政府网页PDF无法打开的问题
问题说明
尝试从指定页面下载约500份PDF文件时,当前代码获取的链接并非直接的AWS存储PDF链接,下载后的文件无法打开。这些链接是跳转页面地址,需要额外步骤提取实际的PDF下载地址。
解决方案
核心思路是先访问每个跳转链接,从跳转页面中提取实际的PDF文件URL,再进行下载。以下是修改后的可运行代码:
# 加载所需包 library(tidyverse) library(rvest) library(polite) # 初始页面URL mdba_NB_url <- "https://getinvolved.mdba.gov.au/bp-amendments-submissions/widgets/139364/documents" session <- bow(mdba_NB_url, force = TRUE) NB_page <- scrape(session) # 提取初始跳转链接和名称 download_links <- tibble( link_names = NB_page %>% html_nodes("a") %>% html_text(), link_urls = NB_page %>% html_nodes("a") %>% html_attr('href') ) %>% # 筛选目标PDF链接(匹配"No. 数字"格式的名称) filter(str_detect(link_names, "No. [0-9]")) %>% # 测试用子集,可注释掉以下载全部 slice(c(1:10)) # 定义函数:从跳转页面提取实际PDF链接 get_real_pdf_url <- function(link) { # 建立会话并抓取跳转页面 sub_session <- bow(link, force = TRUE) sub_page <- scrape(sub_session) # 提取实际PDF链接(根据页面结构,定位到指向AWS的PDF地址) real_url <- sub_page %>% html_nodes("a.download-document") %>% html_attr("href") return(real_url) } # 批量获取实际PDF链接 download_links <- download_links %>% mutate(real_pdf_url = map_chr(link_urls, get_real_pdf_url)) # 批量下载PDF mapply( function(url, filename) { download.file(url, paste0(filename, ".pdf"), mode = "wb") }, download_links$real_pdf_url, download_links$link_names )
关键修改点
- 新增
get_real_pdf_url函数:负责访问每个跳转链接,从页面中提取实际的PDF下载地址(通过定位页面中的下载按钮元素a.download-document) - 批量处理所有跳转链接,替换为真实的PDF URL后再执行下载
- 保留
polite包的会话机制,遵守网站爬虫规则
内容的提问来源于stack exchange,提问作者pparamo
相关产品推荐
相关产品推荐

