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

