如何用R的httr::GET/POST正确请求网页提取信息栏链接?
解决R语言爬取Swissmedic页面「信息」栏链接的问题
问题背景
- 目标:从https://fsca.swissmedic.ch/mep/#/页面的「信息」栏目提取链接
- 当前路径:空搜索导出的CSV不含所需链接,计划用CSV中的唯一标识(如
Vk_20220224_16)拼接成详情页URL(https://fsca.swissmedic.ch/mep/#/?q=Vk_20220224_16)爬取 - 遇到的障碍:
httr::GET(url)返回400 Bad Request,推测缺少服务器要求的参数- 改用
httr::POST后仅得到「Loading...」文本,无法获取实际页面内容或表格
解决方法
1. 排查服务器所需参数(通过浏览器抓包)
该网站是单页应用(SPA),直接请求页面URL只能拿到未渲染的框架,真实数据通过后台API加载。用Firefox抓包步骤:
- 打开目标详情页,按F12调出开发者工具
- 切换到「网络」标签,刷新页面
- 筛选「XHR/Fetch」类型请求,找到返回实际数据的API接口
- 查看该请求的请求方法、请求头(比如User-Agent、Referer)、请求参数(比如包含唯一标识的
q参数),这些就是服务器要求的参数
2. 直接调用API获取结构化数据
跳过页面渲染,直接请求API接口更高效,示例代码:
library(httr) library(jsonlite) # 替换为抓包得到的真实API地址 api_url <- "https://fsca.swissmedic.ch/mep/api/xxx" # 复制抓包得到的请求头,关键字段需保留 request_headers <- add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0", "Referer" = "https://fsca.swissmedic.ch/mep/#/", "Accept" = "application/json" ) # 替换为抓包得到的参数,包含目标唯一标识 request_params <- list( q = "Vk_20220224_16", # 补充其他必要参数,如分页、筛选条件等 ) # 发送请求并解析JSON数据 response <- GET(api_url, request_headers, query = request_params) raw_data <- content(response, "text") %>% fromJSON() # 从JSON结构中提取「信息」栏链接(需根据实际返回路径调整) info_links <- raw_data$data$info_section$links
3. 模拟浏览器渲染(API无法定位时的备选方案)
如果API难以抓取,用RSelenium模拟浏览器加载页面后提取内容:
library(RSelenium) library(rvest) # 启动Chrome驱动(需提前安装Chrome和对应版本的chromedriver) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] # 访问目标详情页 remDr$navigate("https://fsca.swissmedic.ch/mep/#/?q=Vk_20220224_16") # 等待页面完全加载(可根据页面加载速度调整时长) Sys.sleep(5) # 获取渲染后的HTML并提取链接 page_source <- remDr$getPageSource()[[1]] %>% read_html() info_links <- page_source %>% html_elements(".info-section a") %>% html_attr("href") # 关闭浏览器和驱动 remDr$close() driver$server$stop()
内容的提问来源于stack exchange,提问作者ava
相关产品推荐
相关产品推荐

