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

使用rvest与SelectorGadget爬取YouGov品牌列表仅获前20条的求助

解决YouGov品牌列表爬取仅返回前20条的问题

问题根源

YouGov这个页面用了动态加载的方式,默认只渲染前20个品牌,剩下的内容得滚动页面或者触发加载按钮才会被浏览器请求并显示。而rvest的read_html()只能抓取页面初始的静态HTML,拿不到动态加载出来的内容,所以只能得到前20条数据。

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

RSelenium可以模拟真实浏览器的操作,触发动态加载逻辑,拿到完整的页面内容。

操作步骤:

  1. 安装并加载所需包:
install.packages(c("RSelenium", "rvest", "dplyr"))

library(RSelenium)
library(rvest)
library(dplyr)
  1. 启动Chrome浏览器驱动(注意:Chrome版本要和chromedriver版本匹配,否则会报错):
# 启动Chrome驱动,端口可自行调整
driver <- rsDriver(browser = "chrome", port = 4444L)
remDr <- driver[["client"]]
  1. 访问目标页面并循环滚动加载全部内容:
# 打开目标页面
remDr$navigate("https://today.yougov.com/ratings/consumer/fame/brands/all")

# 循环滚动页面,直到没有新内容加载
repeat {
  # 记录当前已加载的品牌数量
  current_num <- length(remDr$findElements(using = "css selector", "span:nth-child(3)"))
  # 滚动到页面底部
  remDr$executeScript("window.scrollTo(0, document.body.scrollHeight);")
  # 等待2秒让内容加载完成
  Sys.sleep(2)
  # 记录滚动后的品牌数量
  new_num <- length(remDr$findElements(using = "css selector", "span:nth-child(3)"))
  # 如果数量不再增加,说明已加载全部内容,退出循环
  if (new_num == current_num) break
}
  1. 提取页面HTML并解析品牌名称:
# 获取完整页面的HTML源码
page_html <- remDr$getPageSource()[[1]]
yougov_page <- read_html(page_html)

# 提取品牌名称(用你之前的选择器即可)
brand_list <- yougov_page %>% 
  html_nodes("span:nth-child(3)") %>%  
  html_text()

# 查看结果
head(brand_list)
  1. 用完记得关闭浏览器驱动:
remDr$close()
driver$server$stop()

解决方案2:直接调用页面的API接口(更高效)

很多动态加载的页面会通过API接口获取数据,你可以用浏览器开发者工具找到这个接口,直接请求获取完整数据,不用模拟浏览器。

操作步骤:

  1. 打开浏览器按F12调出开发者工具,切换到「网络」标签,刷新页面后滚动加载内容,找到带api标识的请求(一般是JSON格式)。
  2. 复制该请求的URL和参数,用httr包发送请求解析数据:
install.packages(c("httr", "jsonlite"))

library(httr)
library(jsonlite)

# 示例请求(实际需替换成你抓包到的真实API地址和参数)
api_response <- GET("https://today.yougov.com/api/ratings/consumer/fame/brands/all",
                    query = list(
                      page = 1,
                      per_page = 1000  # 设置足够大的每页数量,一次性获取全部数据
                    ))

# 解析返回的JSON数据
api_data <- fromJSON(content(api_response, "text"))

# 提取品牌名称(路径要根据实际返回的JSON结构调整)
brand_list <- api_data$items$name

注意:API接口可能有反爬限制,或者参数会随时调整,要以你实际抓包到的内容为准。


内容的提问来源于stack exchange,提问作者Max Schmidt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:25:39