You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 07:54:22