使用Rvest抓取麦当劳产品页面数据失败,返回NA/无结果求助
解决方案
问题分析
你之前的代码未能获取数据,核心原因是节点定位错误,目标数据所在的HTML标签并非你指定的路径;另外该页面部分内容可能通过JavaScript动态加载,直接用read_html()无法完整抓取到数据。
方案1:静态抓取(内容已嵌入HTML时适用)
如果页面数据是静态嵌入的,通过正确定位节点即可抓取:
library(rvest) library(dplyr) library(tidyr) # 目标URL url <- "https://www.mcdonalds.com/de/de-de/product/grand-cheese-n-beef-classic-5642.html" page <- read_html(url) ### 1. 抓取「更多信息」 more_info <- page %>% html_nodes("div.product-info__details div.product-info__detail") %>% html_text2() %>% str_split_fixed(": ", 2, n = 2) %>% as.data.frame(stringsAsFactors = FALSE) %>% setNames(c("项目", "内容")) %>% pivot_wider(names_from = 项目, values_from = 内容) ### 2. 抓取「营养数据」 nutrition_data <- page %>% html_nodes("div.nutrition-table table") %>% html_table(header = TRUE, fill = TRUE) %>% .[[1]] %>% rename(营养成分 = 1, 每100克 = 2, 每份 = 3) ### 3. 抓取「过敏原」 allergens <- page %>% html_nodes("ul.allergens-list__items li") %>% html_text2() %>% paste(collapse = ", ") %>% data.frame(过敏原 = ., stringsAsFactors = FALSE) # 整理为包含所有模块的结果集 result <- list( 更多信息 = more_info, 营养数据 = nutrition_data, 过敏原 = allergens ) # 查看结果 print(result)
方案2:动态抓取(应对JavaScript加载内容)
如果静态抓取返回空数据,说明内容是动态加载的,需要用RSelenium模拟浏览器加载:
library(RSelenium) library(rvest) library(dplyr) library(tidyr) # 启动Chrome浏览器驱动(需提前安装ChromeDriver并配置环境变量) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] # 访问目标页面并等待加载 remDr$navigate("https://www.mcdonalds.com/de/de-de/product/grand-cheese-n-beef-classic-5642.html") Sys.sleep(3) # 获取完整页面源码 page_source <- remDr$getPageSource()[[1]] page <- read_html(page_source) # 重复静态抓取的步骤获取数据 more_info <- page %>% html_nodes("div.product-info__details div.product-info__detail") %>% html_text2() %>% str_split_fixed(": ", 2, n = 2) %>% as.data.frame(stringsAsFactors = FALSE) %>% setNames(c("项目", "内容")) %>% pivot_wider(names_from = 项目, values_from = 内容) nutrition_data <- page %>% html_nodes("div.nutrition-table table") %>% html_table(header = TRUE, fill = TRUE) %>% .[[1]] %>% rename(营养成分 = 1, 每100克 = 2, 每份 = 3) allergens <- page %>% html_nodes("ul.allergens-list__items li") %>% html_text2() %>% paste(collapse = ", ") %>% data.frame(过敏原 = ., stringsAsFactors = FALSE) # 整理结果 result <- list( 更多信息 = more_info, 营养数据 = nutrition_data, 过敏原 = allergens ) # 关闭浏览器驱动 remDr$close() driver$server$stop() # 查看结果 print(result)
补充说明
- 优先尝试静态抓取,效率更高;若返回空数据,再启用动态抓取。
- 动态抓取需提前安装对应浏览器的驱动(如ChromeDriver),并确保其路径已加入系统环境变量。
- 可根据需求调整结果结构,比如将「更多信息」「过敏原」合并为单行数据,「营养数据」作为嵌套列,或分别存储为独立的dataframe。
内容的提问来源于stack exchange,提问作者none
相关产品推荐
相关产品推荐

