使用rvest与SelectorGadget爬取YouGov品牌列表仅获前20条的求助
解决YouGov品牌列表爬取仅返回前20条的问题
问题根源
YouGov这个页面用了动态加载的方式,默认只渲染前20个品牌,剩下的内容得滚动页面或者触发加载按钮才会被浏览器请求并显示。而rvest的read_html()只能抓取页面初始的静态HTML,拿不到动态加载出来的内容,所以只能得到前20条数据。
解决方案1:用RSelenium模拟浏览器加载全部内容
RSelenium可以模拟真实浏览器的操作,触发动态加载逻辑,拿到完整的页面内容。
操作步骤:
- 安装并加载所需包:
install.packages(c("RSelenium", "rvest", "dplyr")) library(RSelenium) library(rvest) library(dplyr)
- 启动Chrome浏览器驱动(注意:Chrome版本要和chromedriver版本匹配,否则会报错):
# 启动Chrome驱动,端口可自行调整 driver <- rsDriver(browser = "chrome", port = 4444L) remDr <- driver[["client"]]
- 访问目标页面并循环滚动加载全部内容:
# 打开目标页面 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 }
- 提取页面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)
- 用完记得关闭浏览器驱动:
remDr$close() driver$server$stop()
解决方案2:直接调用页面的API接口(更高效)
很多动态加载的页面会通过API接口获取数据,你可以用浏览器开发者工具找到这个接口,直接请求获取完整数据,不用模拟浏览器。
操作步骤:
- 打开浏览器按F12调出开发者工具,切换到「网络」标签,刷新页面后滚动加载内容,找到带
api标识的请求(一般是JSON格式)。 - 复制该请求的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
相关产品推荐
相关产品推荐

