使用rvest抓取gbarbosa页面仅返回8个节点,求解决方案
解决gbarbosa产品页面抓取不全的问题
可能的原因及对应方案
1. CSS选择器范围过窄
你当前使用的选择器.gbarbosa-gbarbosa-components-0-x-ProductName.false强制要求元素同时包含.false类,但页面中后8个产品的名称元素可能没有这个类,或者类名存在差异。
尝试简化选择器,只保留产品名称的核心类:
library(rvest) url <- "https://www.gbarbosa.com.br/caes/caes?_q=C%C3%A3es&map=ft,categoria&page=1" sku <- read_html(url) |> html_nodes(".gbarbosa-gbarbosa-components-0-x-ProductName") |> html_text(trim = TRUE)
如果仍未解决,可尝试通过产品卡片的父容器来定位,确保覆盖所有产品:
sku <- read_html(url) |> html_nodes(".vtex-search-result-3-x-galleryItem") |> # 产品卡片的通用容器类 html_node(".gbarbosa-gbarbosa-components-0-x-ProductName") |> html_text(trim = TRUE)
2. 页面采用滚动式动态加载
很多电商页面会在用户滚动到页面底部时才加载剩余产品,rvest只能获取初始请求返回的静态HTML,无法触发动态加载逻辑。这种情况需要使用浏览器自动化工具模拟页面滚动:
使用RSelenium的示例:
library(RSelenium) library(rvest) # 启动Chrome浏览器驱动(需提前安装对应版本的chromedriver) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] # 打开目标页面 remDr$navigate("https://www.gbarbosa.com.br/caes/caes?_q=C%C3%A3es&map=ft,categoria&page=1") # 模拟滚动到底部,触发剩余产品加载 for(i in 1:2){ remDr$executeScript("window.scrollTo(0, document.body.scrollHeight);") Sys.sleep(2) # 等待加载完成 } # 提取页面HTML并获取产品名称 page_source <- remDr$getPageSource()[[1]] sku <- read_html(page_source) |> html_nodes(".gbarbosa-gbarbosa-components-0-x-ProductName") |> html_text(trim = TRUE) # 关闭浏览器及驱动 remDr$close() driver$server$stop()
使用playwright的示例(更轻量):
library(playwright) # 初始化playwright pw <- playwright$launch() browser <- pw$chromium$launch(headless = FALSE) # 非无头模式可查看操作过程 page <- browser$new_page() # 打开页面并滚动加载 page$goto("https://www.gbarbosa.com.br/caes/caes?_q=C%C3%A3es&map=ft,categoria&page=1") page$evaluate("window.scrollTo(0, document.body.scrollHeight);") page$wait_for_timeout(2000) # 等待加载完成 # 提取所有产品名称 sku <- page$eval_all(".gbarbosa-gbarbosa-components-0-x-ProductName", function(el) el.textContent.trim()) # 关闭资源 page$close() browser$close() pw$stop()
额外提示
- 先查看网站的
robots.txt文件,确认抓取行为符合网站规则,避免IP被封禁。 - 电商网站的类名可能会动态更新,若后续选择器失效,需重新检查页面HTML结构调整选择器。
内容的提问来源于stack exchange,提问作者Rafael Díaz
相关产品推荐
相关产品推荐

