使用rvest爬取Kimovil三星手机列表仅返回40条,如何获取全部51条数据?
问题根因
你爬取的站点手机列表采用了懒加载逻辑,首次请求返回的HTML里仅渲染了前40条数据,剩余11条需要页面滚动到接近底部时才会触发加载、渲染到DOM结构中,因此用rvest直接拉取初始静态HTML只能拿到40条结果。
可行解决方案
方案1:使用RSelenium模拟浏览器操作(无需分析接口)
通过模拟真实浏览器的滚动行为,等待所有数据加载完成后再提取内容,参考代码如下:
# 提前安装对应依赖:install.packages(c("RSelenium", "rvest")) library(RSelenium) library(rvest) # 启动Chrome驱动,注意chromever要和你本地安装的Chrome版本一致 driver <- rsDriver(browser = "chrome", chromever = "你的Chrome版本号") remDr <- driver$client # 访问目标页面 remDr$navigate("https://www.kimovil.com/en/compare-smartphones/f_min_dm+unveileddate.3,i_b+slug.samsung") # 重复滚动到底部2-3次,确保所有懒加载数据都渲染完成 for (i in 1:3) { remDr$executeScript("window.scrollTo(0, document.body.scrollHeight);") Sys.sleep(2) # 等待数据加载 } # 拉取完整页面HTML full_page <- read_html(remDr$getPageSource()[[1]]) # 提取设备名称 device_label <- html_text(html_nodes(full_page, 'div.device-name')) # 校验数据量 print(length(device_label)) # 此时应为51 # 关闭浏览器驱动 remDr$close() driver$server$stop()
方案2:直接抓取数据接口(效率更高)
你可以通过浏览器开发者工具的网络面板,筛选XHR请求,滚动页面时找到加载后续数据的接口,直接调用该接口即可拿到结构化的全量数据,不需要解析HTML,运行效率远高于模拟浏览器方案。
操作流程:
- 打开目标页面后按F12调出开发者工具,切换到「网络」标签,筛选「Fetch/XHR」类型的请求
- 滚动页面到接近底部,找到触发的加载数据请求,复制请求地址和必要的请求头
- 用httr包发送对应请求,解析返回的JSON数据即可获取全量51条手机信息
内容的提问来源于stack exchange,提问作者Naressh Thiagaraj
相关产品推荐
相关产品推荐

