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

如何用rvest提取网页中智能手机的标题与价格?解决空值问题

解决rvest爬取电商页面返回空结果的问题

问题分析

你遇到的核心问题是目标页面的产品数据属于动态加载内容——页面初始HTML不包含产品信息,而是通过JavaScript在浏览器渲染后才加载完成。直接用read_html()只能获取静态初始代码,自然拿不到产品内容。另外你原代码的XPath仅定位了单个产品,就算能获取数据也只能拿到单条记录。

解决方案

推荐两种可行方案,优先选择API抓取(效率更高、资源消耗更低),若API难以定位再用浏览器模拟加载。

方法1:直接调用数据接口(推荐)

动态页面的产品数据通常来自后端API接口,可通过浏览器开发者工具找到对应请求:

  • 打开目标页面按F12进入开发者工具,切换到「网络」标签
  • 刷新页面后筛选「XHR/Fetch」类型请求,找到返回产品列表的接口

针对该Claro页面,可直接调用以下API获取数据,示例代码:

library(httr)
library(jsonlite)
library(dplyr)

# 请求产品数据API
response <- GET("https://catalogo.claro.com.ec/api/catalogo/postpago?page=1&size=24")
data <- fromJSON(content(response, "text"))

# 提取名称与价格字段
products <- data$content %>%
  select(
    产品名称 = nombreEquipo,
    总价 = precioTotal
  )

print(products)

方法2:用RSelenium模拟浏览器渲染

若找不到合适API,可通过RSelenium模拟真实浏览器加载页面后再抓取内容:

library(RSelenium)
library(rvest)
library(dplyr)
library(purrr)

# 启动Chrome浏览器(需提前安装对应版本的ChromeDriver)
driver <- rsDriver(browser = "chrome", port = 4567L)
remDr <- driver[["client"]]

# 打开目标页面
remDr$navigate("https://catalogo.claro.com.ec/postpago/catalogo?utm_source=catalogo&utm_medium=menu-header&utm_campaign=equipos-celulares&utm_content=navigation")

# 等待页面加载完成(根据网络情况调整等待时长)
Sys.sleep(5)

# 获取渲染后的页面源码
page_source <- remDr$getPageSource()[[1]]
first_page <- read_html(page_source)

# 批量抓取所有产品的名称和价格
products <- first_page %>%
  html_nodes("article.catalogo--productos__item") %>%
  map_df(function(item) {
    tibble(
      产品名称 = item %>% html_node("h3") %>% html_text(trim = TRUE),
      价格 = item %>% html_node(".catalogo--productos__precio") %>% html_text(trim = TRUE)
    )
  })

print(products)

# 关闭浏览器与驱动
remDr$close()
driver$server$stop()

注意事项

  • 调用API时需控制请求频率,遵守网站robots.txt规则,避免触发反爬机制
  • 使用RSelenium时,需保证浏览器驱动(如ChromeDriver)与本地浏览器版本一致
  • 若遇到反爬限制,可给请求添加自定义User-Agent头信息

内容的提问来源于stack exchange,提问作者Duck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:32:26