如何用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
相关产品推荐
相关产品推荐

