单URL下如何用RSelenium抓取需点击箭头翻页的动态页面?
抓取英超官网分页扑救数据的解决方案
问题说明
已通过RSelenium抓取英超官网扑救数据第一页(https://www.premierleague.com/stats/top/players/saves),但第二页无独立URL,需点击分页箭头切换,需实现第二页数据抓取并合并。
解决方案步骤与代码
1. 定位并点击下一页按钮
先定位页面中的下一页箭头按钮,通过RSelenium模拟点击操作完成页面切换。注意需等待按钮加载完成,避免元素未找到报错。
2. 抓取第二页数据
切换页面后,复用第一页的抓取逻辑,获取第二页的排名、球员、俱乐部和扑救数数据。
3. 合并两页数据
将两页数据合并为一个完整的数据框。
完整代码示例:
# 假设已完成RSelenium驱动初始化(如remDr <- remoteDriver(...)) # 导航到目标页面 remDr$navigate("https://www.premierleague.com/stats/top/players/saves") # 抓取第一页数据 epl_page1 <- read_html(remDr$getPageSource()[[1]]) rank_page1 <- epl_page1 %>% html_nodes(".statsTableContainer .rank") %>% html_text() player_page1 <- epl_page1 %>% html_nodes(".playerName ") %>% html_text() club_page1 <- epl_page1 %>% html_nodes(".statNameSecondary") %>% html_text() stat_page1 <- epl_page1 %>% html_nodes(".statsTableContainer .text-centre") %>% html_text() saves_page1 <- data.frame(rank = rank_page1, player = player_page1, club = club_page1, stat = stat_page1) # 等待下一页按钮加载,执行点击 Sys.sleep(2) # 可根据网络情况调整等待时间 next_btn <- remDr$findElement(using = "css selector", value = ".paginationBtn.paginationNext") next_btn$clickElement() # 等待第二页加载完成 Sys.sleep(3) # 抓取第二页数据 epl_page2 <- read_html(remDr$getPageSource()[[1]]) rank_page2 <- epl_page2 %>% html_nodes(".statsTableContainer .rank") %>% html_text() player_page2 <- epl_page2 %>% html_nodes(".playerName ") %>% html_text() club_page2 <- epl_page2 %>% html_nodes(".statNameSecondary") %>% html_text() stat_page2 <- epl_page2 %>% html_nodes(".statsTableContainer .text-centre") %>% html_text() saves_page2 <- data.frame(rank = rank_page2, player = player_page2, club = club_page2, stat = stat_page2) # 合并两页数据 saves_full <- rbind(saves_page1, saves_page2) # 关闭驱动 remDr$close()
注意事项
- 若CSS选择器定位下一页按钮失败,可尝试用Xpath定位:
//button[contains(@class, 'paginationNext')] - 替代
Sys.sleep的更稳定方式是使用waitForElement方法,确保元素加载完成:remDr$waitForElement(using = "css selector", value = ".paginationBtn.paginationNext", timeout = 10000) - 抓取后可对文本做清洗(如去除多余空格、换行符),保证数据整洁。
内容的提问来源于stack exchange,提问作者Tony H
相关产品推荐
相关产品推荐

