使用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.
相关产品推荐
相关产品推荐

