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

使用rvest抓取电商网站数据:入门技巧与实操指导请求

嘿,我来帮你搞定用rvest爬Mercado Libre乌拉圭站的手机配件数据!先看看你初始代码里的小疏漏:你定义了url_base但后面调用read_html()时用了url,这会直接报错,得先把这个变量名统一过来。接下来我给你一步步拆解完整的爬取流程,从单页核心数据抓取到多页批量爬取,应该能完美解决你的需求~

第一步:修正基础代码,抓取单页核心数据

首先,你之前用的.main-title其实是页面的大标题(比如“Accesorios para celulares”),不是单个商品的标题。我帮你换成了Mercado Libre商品列表里通用的选择器,同时加上价格、详情链接这些实用字段:

library(rvest)
library(purrr)

# 指定目标URL
url_base <- 'https://telefonia.mercadolibre.com.uy/accesorios-celulares/'

# 读取网站HTML代码(修正变量名,用url_base代替原代码里的url)
webpage <- read_html(url_base)

# 抓取单个商品的标题:替换成商品列表的专属选择器
titles <- webpage %>% 
  html_nodes('.ui-search-item__title') %>% 
  html_text()

# 抓取商品价格(提取整数部分,处理千分位逗号)
prices <- webpage %>% 
  html_nodes('.andes-money-amount__fraction') %>% 
  html_text() %>% 
  gsub(',', '', .) %>%  # 去掉价格里的逗号
  as.numeric()

# 抓取商品详情页的链接
links <- webpage %>% 
  html_nodes('.ui-search-item__group__element.ui-search-link') %>% 
  html_attr('href')

# 把数据整合成整洁的数据框
single_page_data <- data.frame(
  商品标题 = titles,
  价格 = prices,
  详情链接 = links,
  stringsAsFactors = FALSE
)

# 查看前几条数据验证结果
head(single_page_data)

小提示:如何确认选择器?

打开目标页面按F12调出开发者工具,用“选择元素”工具点击你要抓取的内容,就能看到对应的CSS类名——这个方法能帮你应对网站页面结构更新的情况。

第二步:批量抓取多页数据

电商网站的商品肯定不止一页,Mercado Libre的分页URL规律是在基础URL后加_Desde_XX,比如第二页是_Desde_51(每页默认显示50个商品),第三页是_Desde_101,以此类推。我们可以用purrr的批量处理功能来实现多页爬取:

# 定义要爬取的页数,比如先爬前3页
target_pages <- 1:3

# 生成每一页的完整URL
page_urls <- paste0(url_base, '_Desde_', (target_pages - 1)*50 + 1)

# 封装一个单页抓取的函数,方便批量调用
scrape_single_page <- function(page_url) {
  # 加延迟避免被网站反爬(非常重要!)
  Sys.sleep(2)
  
  webpage <- read_html(page_url)
  
  # 重复单页抓取的逻辑
  titles <- webpage %>% 
    html_nodes('.ui-search-item__title') %>% 
    html_text()
  
  prices <- webpage %>% 
    html_nodes('.andes-money-amount__fraction') %>% 
    html_text() %>% 
    gsub(',', '', .) %>% 
    as.numeric()
  
  links <- webpage %>% 
    html_nodes('.ui-search-item__group__element.ui-search-link') %>% 
    html_attr('href')
  
  # 返回带页码的数据框
  data.frame(
    商品标题 = titles,
    价格 = prices,
    详情链接 = links,
    页码 = which(page_urls == page_url),
    stringsAsFactors = FALSE
  )
}

# 批量抓取所有页面数据,自动合并成一个数据框
all_pages_data <- map_dfr(page_urls, scrape_single_page)

# 查看总数据量和前几条结果
dim(all_pages_data)
head(all_pages_data)
第三步:添加异常处理(可选但推荐)

如果某一页加载失败或者选择器失效,整个爬取流程会中断。我们可以给函数加上tryCatch来捕获错误,让程序继续运行:

scrape_single_page <- function(page_url) {
  tryCatch({
    Sys.sleep(2)
    webpage <- read_html(page_url)
    
    titles <- webpage %>% 
      html_nodes('.ui-search-item__title') %>% 
      html_text()
    
    prices <- webpage %>% 
      html_nodes('.andes-money-amount__fraction') %>% 
      html_text() %>% 
      gsub(',', '', .) %>% 
      as.numeric()
    
    links <- webpage %>% 
      html_nodes('.ui-search-item__group__element.ui-search-link') %>% 
      html_attr('href')
    
    data.frame(
      商品标题 = titles,
      价格 = prices,
      详情链接 = links,
      页码 = which(page_urls == page_url),
      stringsAsFactors = FALSE
    )
  }, error = function(e) {
    # 打印错误信息,不中断程序
    message(paste("抓取页面", page_url, "出错:", e$message))
    return(data.frame())
  })
}

内容的提问来源于stack exchange,提问作者Pablo P.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:18:08