如何用rvest抓取美国PCAB复合药房相关数据?
抓取ACHC网站PCAB复合药房数据的解决方案
- 问题根源:原代码无法获取数据是因为页面的药房数据是动态加载的,静态HTML中不存在
.company_name元素,需要处理JavaScript渲染的内容或直接调用后端API。
方案1:直接调用后端API(高效推荐)
通过浏览器开发者工具可发现,搜索PCAB药房时页面会发送AJAX请求到后端接口,直接请求该接口即可获取结构化数据:
library(httr) library(jsonlite) # 构造请求参数,指定PCAB认证类型与美国地区 payload <- list( action = "provider_search", certification_type = "pcab", country = "US" ) # 发送POST请求获取JSON数据 response <- POST( url = "https://www.achc.org/wp-admin/admin-ajax.php", body = payload, encode = "form" ) # 解析JSON为数据框 pharmacy_data <- fromJSON(content(response, "text")) # 提取核心字段示例:公司名、地址、城市、州、邮编 head(pharmacy_data$results[, c("company_name", "address", "city", "state", "zip")])
方案2:使用RSelenium模拟浏览器操作
如果API接口有变动,可通过模拟浏览器交互抓取动态加载内容:
library(RSelenium) library(rvest) # 启动Chrome浏览器(需提前安装对应版本的ChromeDriver) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] # 打开目标页面 remDr$navigate("https://www.achc.org/find-a-provider/") # 勾选PCAB认证选项 pcab_option <- remDr$findElement(using = "xpath", value = "//input[@value='pcab']") pcab_option$clickElement() # 点击搜索按钮 search_btn <- remDr$findElement(using = "xpath", value = "//button[@id='search-providers']") search_btn$clickElement() # 等待页面加载完成 Sys.sleep(3) # 获取页面源码并解析公司名称 page_source <- remDr$getPageSource()[[1]] company_names <- read_html(page_source) %>% html_nodes(".company_name") %>% html_text() print(company_names) # 关闭浏览器与驱动 remDr$close() driver$server$stop()
注意事项
- 调用API时,若参数失效,可通过浏览器开发者工具的「网络」面板查看最新请求参数;
- 使用RSelenium时,需确保浏览器驱动版本与本地浏览器版本匹配。
内容的提问来源于stack exchange,提问作者Shehroz Malik
相关产品推荐
相关产品推荐

