如何使用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
相关产品推荐
相关产品推荐

