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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:20:42