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

如何使用read_html_live()处理JavaScript分页的网页爬虫?

问题解决:rvest read_html_live 点击分页按钮失败

核心问题:选择器错误

你用的选择器.pagination-direction-btn:nth-child(1)定位的是「上一页」按钮,而非「下一页」,这才导致找不到目标元素报错。实际网站的分页栏中,.pagination-direction-btn类的第一个按钮是上一页(默认可能处于禁用状态),第二个才是下一页按钮。

修正方案

1. 更换正确的选择器

推荐用两种更可靠的选择器定位下一页按钮:

  • 基于位置:.pagination-direction-btn:nth-child(2)
  • 基于图标语义(不受布局位置变化影响,更稳定):button.pagination-direction-btn:has(svg[aria-label='Next page'])

2. 优化代码逻辑

增加元素等待机制,确保按钮加载完成后再点击;同时处理最后一页无下一页的情况,避免循环报错。

修正后的完整代码

library(tidyverse)
library(rvest)

ad_links_all <- tibble()
n_of_pages <- 10

page <- read_html_live("https://www.supralift.com/uk/itemsearch/results")

for (i in 1:n_of_pages) {
  # 抓取当前页面广告链接
  page_ad_links <- page %>% 
    html_elements(".product-info .h-full a:has(.line-clamp-2)") %>% 
    html_attr("href") %>% 
    str_split("\\?searchKey=", n = 2) %>% 
    map_chr(~ .x[1]) %>% 
    tibble(link = .)
  
  ad_links_all <- bind_rows(ad_links_all, page_ad_links)
  
  # 检查是否还有下一页按钮,避免最后一页报错
  next_btn_exists <- page %>% html_elements("button.pagination-direction-btn:has(svg[aria-label='Next page'])") %>% length() > 0
  
  if (!next_btn_exists || i == n_of_pages) {
    break
  }
  
  # 等待下一页按钮加载完成后点击
  page$wait_for_selector("button.pagination-direction-btn:has(svg[aria-label='Next page'])", timeout = 10)
  page$click("button.pagination-direction-btn:has(svg[aria-label='Next page'])")
  
  Sys.sleep(1) # 延长等待时间,确保页面完全加载
}

print(ad_links_all)

关键说明

  • wait_for_selector():强制等待目标元素加载完成,避免因页面动态加载导致的元素找不到问题,可根据网络情况调整timeout参数。
  • 下一页按钮存在性检查:当遍历到最后一页时自动终止循环,防止无意义的报错。
  • 用map_chr()替代lapply()+unlist(),代码更简洁贴合tidyverse风格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:23:20