使用RSelenium爬取院校数据时点击下一页页面持续加载求助
问题
我是网络爬虫新手,想要从https://www.forwardpathway.com/us-college-database爬取数据。我使用以下代码提取表格数据,但点击下一页按钮后页面一直处于加载状态,恳请各位指出问题所在。
library(RSelenium) library(tidyverse) library(netstat) library(xml2) library(data.table) library(rvest) binman::list_versions("chromedriver") rs_driver_object<-rsDriver(browser="chrome", chromever="107.0.5304.62", verbose=F, port=free_port()) ## create the client remDr<-rs_driver_object$client ## open the brower remDr$open() remDr$navigate("https://www.forwardpathway.com/us-college-database") ## locate the table that stores the data data_table<-remDr$findElement(using = "id","table_1") #And I tried three different methods to click the next button, but the problem persisted. ## next button method 1 next_button<-remDr$findElement(using = "id",'table_1_next') next_button$clickElement() ## next button method 2 remDr$executeScript("document.getElementById('table_1_next').click()") ## next button method 3 next_button <- remDr$findElement("id", "table_1_next") next_button$sendKeysToElement(list(key="enter")) all_data<-list() cond<-TRUE while(cond == TRUE){ data_table_html<-data_table$getPageSource() page<-read_html(data_table_html %>% unlist()) df<-html_table(page) %>% .[[1]] all_data<-rbindlist((list(all_data,df))) Sys.sleep(5) tryCatch( {next_button <- remDr$findElement("id", "table_1_next") next_button$sendKeysToElement(list(key="enter")) }, error=function(e){ print("script complete") cond<<-FALSE } ) if (cond ==FALSE){ break } }
解决方案
以下是导致页面持续加载的常见原因及对应修复方案:
等待机制不完善
固定的Sys.sleep(5)无法适配网络波动或服务器延迟,且未等待页面元素更新就继续操作。建议改用显式等待:# 等待下一页按钮可点击且未被禁用 wait_for_next_page <- function(remDr) { remDr$waitForElement(using = "id", "table_1_next", timeout = 10000) is_disabled <- remDr$executeScript("return document.getElementById('table_1_next').classList.contains('disabled');")[[1]] return(!is_disabled) }页面元素复用问题
循环前获取的data_table元素会缓存旧页面内容,每次循环应重新获取完整页面源码:# 替换循环内的页面读取逻辑 page_source <- remDr$getPageSource() %>% unlist() page <- read_html(page_source) df <- html_table(page) %>% .[[1]]反爬机制触发
频繁固定间隔的点击易被识别为爬虫,可优化为:- 随机延迟:
Sys.sleep(runif(1, 3, 7)) - 模拟真实操作:添加滚动或鼠标移动
remDr$executeScript("window.scrollTo(0, document.body.scrollHeight);")
- 随机延迟:
ChromeDriver版本不匹配
确保ChromeDriver版本与本地Chrome浏览器一致,可自动匹配最新版本:rs_driver_object <- rsDriver(browser="chrome", chromever = "latest", verbose=F, port=free_port())循环逻辑优化
需先判断下一页按钮是否禁用,避免无效点击:while(cond == TRUE){ # 获取当前页数据逻辑... Sys.sleep(runif(1, 3, 7)) tryCatch( { next_button <- remDr$findElement("id", "table_1_next") is_disabled <- remDr$executeScript("return document.getElementById('table_1_next').classList.contains('disabled');")[[1]] if(is_disabled){ print("已到最后一页") cond <- FALSE } else { next_button$clickElement() remDr$waitForElement(using = "id", "table_1", timeout = 10000) } }, error=function(e){ print("脚本完成") cond<<-FALSE } ) }
内容的提问来源于stack exchange,提问作者Luna
相关产品推荐
相关产品推荐

