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

Rvest无法抓取Etsy搜索页全部产品名称问题求助

问题原因

Etsy搜索结果采用动态加载机制:服务器返回的原始HTML仅包含前12个产品,剩余内容会在用户滚动页面时通过AJAX请求逐步加载。SelectorGadget是在浏览器渲染完成(已加载全部64个产品)的页面上匹配选择器,而rvest::read_html()只能获取服务器初始返回的静态HTML,因此只能抓取到前12个产品。

解决方案

方法1:用RSelenium模拟浏览器加载全部内容

RSelenium可以模拟真实浏览器的行为,滚动页面触发内容加载,再抓取完整的页面源码。

代码示例

library(rvest)
library(dplyr)
library(RSelenium)

# 启动Chrome浏览器(需提前安装Chrome和对应版本的ChromeDriver)
driver <- rsDriver(browser = "chrome", port = 4444L, verbose = FALSE)
remDr <- driver[["client"]]

# 打开目标页面
link <- "https://www.etsy.com/search?q=cat+toy&page=1&ref=pagination"
remDr$navigate(link)

# 模拟滚动页面,直到加载完所有内容
repeat {
  # 获取当前已加载的产品数量
  current_count <- length(remDr$findElements(using = "css selector", value = "li.wt-list-unstyled .v2-listing-card__info h3"))
  # 滚动到页面底部
  remDr$executeScript("window.scrollTo(0, document.body.scrollHeight);")
  # 等待加载(根据网络情况调整等待时间)
  Sys.sleep(2)
  # 获取新的产品数量
  new_count <- length(remDr$findElements(using = "css selector", value = "li.wt-list-unstyled .v2-listing-card__info h3"))
  # 如果数量不再增加,说明已加载全部
  if (new_count == current_count) break
}

# 获取完整页面源码并解析
page_source <- remDr$getPageSource()[[1]]
page <- read_html(page_source)

# 提取产品名称
product_name <- page %>%
  html_nodes("li.wt-list-unstyled .v2-listing-card__info h3") %>%
  html_text() %>%
  str_trim()

# 查看结果数量
length(product_name)

# 关闭浏览器
remDr$close()
driver$server$stop()

方法2:调用Etsy官方搜索API(更稳定)

直接使用Etsy的Search API可以批量获取搜索结果,无需处理动态加载问题。你需要先注册Etsy开发者账号获取API密钥,然后通过API请求获取结构化数据。

基本思路

  • 构造包含关键词、分页参数的API请求URL
  • 使用httr包发送请求,解析返回的JSON数据提取产品名称
注意事项
  • 使用RSelenium时,确保ChromeDriver版本与本地Chrome版本匹配,否则会启动失败
  • 频繁抓取可能触发Etsy的反爬机制,建议添加合理的等待时间,避免短时间内大量请求

内容的提问来源于stack exchange,提问作者Gregor Fištravec

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:31:04