R语言rvest爬虫抓取Ripley电商商品价格与网页显示不符求助
问题原因
- 核心错位问题:你当前的代码是先提取整个页面所有商品的原价、促销价、银行卡价三类节点,再统一拼接成数据框。但如果页面中部分商品没有某类价格(比如你举例的海信电视没有银行卡专属价),三类价格的向量长度就会不一致,R在拼接tibble时会自动循环补全短向量,直接导致价格和商品错位,这是你拿到的价格和实际不符的最主要原因。
- 请求标识问题:rvest的
read_html默认请求头会被网站识别为爬虫,部分促销活动价格仅对正常浏览器访客返回,爬虫请求会拿到无折扣的基准价格,也会导致结果偏差。 - 未做格式校验:提取的文本可能包含空格、换行符等不可见字符,也会干扰结果匹配。
解决方法
修改抓取逻辑,先定位每个商品的父容器节点,再从单个商品节点内提取对应价格,保证每个商品的三个价格字段一一对应,同时添加请求头模拟浏览器访问。
修改后的代码如下:
library(rvest) library(purrr) library(tidyverse) library(httr) # 模拟Chrome浏览器请求头,可替换为你自己浏览器的User-Agent headers <- c( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" ) urls <- list("https://simple.ripley.com.pe/tecnologia/tv-y-cine-en-casa/televisores?page=1", "https://simple.ripley.com.pe/tecnologia/tv-y-cine-en-casa/televisores?page=2") # 带请求头抓取页面 h <- urls %>% map(~{ read_html(.x, add_headers(.headers=headers)) }) m <- h %>% map_df(~{ # 先提取每个商品的父节点 product_nodes <- html_nodes(.x, '.catalog-product-item') # 遍历每个商品节点单独提取信息,避免错位 map_df(product_nodes, ~{ producto <- html_node(.x, ".catalog-product-details__name") %>% html_text(trim = T) precio.antes <- html_node(.x, '.catalog-prices__list-price') %>% html_text(trim = T) precio.actual <- html_node(.x, '.catalog-prices__offer-price') %>% html_text(trim = T) precio.tarjeta <- html_node(.x, '.catalog-prices__card-price') %>% html_text(trim = T) tibble( periodo = lubridate::year(Sys.Date()), fecha = Sys.Date(), ecommerce = "ripley", producto = ifelse(length(producto)==0, NA, producto), precio.antes = ifelse(length(precio.antes)==0, NA, precio.antes), precio.actual = ifelse(length(precio.actual)==0, NA, precio.actual), precio.tarjeta = ifelse(length(precio.tarjeta)==0, NA, precio.tarjeta) ) }) })
补充说明
如果修改后仍有偏差,可以在抓取页面后先把html源码保存到本地,和你浏览器看到的页面源码做对比,确认是否是网站给爬虫返回了不同的内容。如果是动态渲染的情况,可以换用RSelenium模拟浏览器操作后再提取内容。
内容的提问来源于stack exchange,提问作者Omar Gonzales
相关产品推荐
相关产品推荐

