RSelenium:抓取加载缓慢的动态加载页面
RSelenium: Scraping a dynamically loaded page that loads slowly
我不确定是不是因为我的网速很慢,但我正在尝试抓取一个在您向下滚动页面时加载信息的网站。我正在执行一个转到页面末尾的脚本,并等待 Selenium/Chrome 服务器加载附加内容。服务器确实更新并加载了新内容,因为我能够抓取原来不在页面上的信息并且新内容显示在 chrome 查看器上,但它只更新一次。我设置了一个 Sys.sleep()
函数每次等待一分钟,这样内容就有足够的时间加载,但它仍然不会更新超过一次。我是否错误地使用了 RSelenium?还有其他方法可以抓取动态加载的网站吗?
无论如何,如果您能提供任何类型的建议或帮助,那就太棒了。
以下是我认为与在页面末尾加载新内容相关的代码部分:
for(i in 1:3){
webElem <- remDr$findElement('css', 'body')
remDr$executeScript('window.scrollTo(0, document.body.scrollHeight);')
Sys.sleep(60)
}
完整代码如下:
library(RSelenium)
library(rvest)
library(stringr)
rsDriver(port = 4444L, browser = 'chrome')
remDr <- remoteDriver(browser = 'chrome')
remDr$open()
remDr$navigate('http://www.codewars.com/kata')
#find the total number of recorded katas
tot_kata <- remDr$findElement(using = 'css', '.is-gray-text')$getElementText() %>%
unlist() %>%
str_extract('\d+') %>%
as.numeric()
#there are about 30 katas per page reload
tot_pages <- (tot_kata/30) %>%
ceiling()
#will be 1:tot_pages once I know the below code works
for(i in 1:3){
webElem <- remDr$findElement('css', 'body')
remDr$executeScript('window.scrollTo(0, document.body.scrollHeight);')
Sys.sleep(60)
}
page_source <- remDr$getPageSource()
kata_vector <- read_html(page_source[[1]]) %>%
html_nodes('.item-title a') %>%
html_attr('href') %>%
str_replace('/kata/', '')
remDr$close
该网站提供了一个 api 应该是第一个停靠点。如果做不到这一点,您可以访问单独的页面,例如:
http://www.codewars.com/kata?page=21
如果您想滚动到页面底部,直到没有更多带有 RSelenium
的内容,您可以使用 "Loading..." 元素,它有一个 class=js-infinite-marker
。虽然我们在页面上仍然有这个元素,但我们尝试每秒向下滚动到它(对于任何问题都会捕获一些错误)。如果该元素不存在,我们假设所有内容都已加载:
library(RSelenium)
rD <- rsDriver(port = 4444L, browser = 'chrome')
remDr <- rD$client # You dont need to use the open method
remDr$navigate('http://www.codewars.com/kata')
chk <- FALSE
while(!chk){
webElem <- remDr$findElements("css", ".js-infinite-marker")
if(length(webElem) > 0L){
tryCatch(
remDr$executeScript("elem = arguments[0];
elem.scrollIntoView();
return true;", list(webElem[[1]])),
error = function(e){}
)
Sys.sleep(1L)
}else{
chk <- TRUE
}
}
我不确定是不是因为我的网速很慢,但我正在尝试抓取一个在您向下滚动页面时加载信息的网站。我正在执行一个转到页面末尾的脚本,并等待 Selenium/Chrome 服务器加载附加内容。服务器确实更新并加载了新内容,因为我能够抓取原来不在页面上的信息并且新内容显示在 chrome 查看器上,但它只更新一次。我设置了一个 Sys.sleep()
函数每次等待一分钟,这样内容就有足够的时间加载,但它仍然不会更新超过一次。我是否错误地使用了 RSelenium?还有其他方法可以抓取动态加载的网站吗?
无论如何,如果您能提供任何类型的建议或帮助,那就太棒了。
以下是我认为与在页面末尾加载新内容相关的代码部分:
for(i in 1:3){
webElem <- remDr$findElement('css', 'body')
remDr$executeScript('window.scrollTo(0, document.body.scrollHeight);')
Sys.sleep(60)
}
完整代码如下:
library(RSelenium)
library(rvest)
library(stringr)
rsDriver(port = 4444L, browser = 'chrome')
remDr <- remoteDriver(browser = 'chrome')
remDr$open()
remDr$navigate('http://www.codewars.com/kata')
#find the total number of recorded katas
tot_kata <- remDr$findElement(using = 'css', '.is-gray-text')$getElementText() %>%
unlist() %>%
str_extract('\d+') %>%
as.numeric()
#there are about 30 katas per page reload
tot_pages <- (tot_kata/30) %>%
ceiling()
#will be 1:tot_pages once I know the below code works
for(i in 1:3){
webElem <- remDr$findElement('css', 'body')
remDr$executeScript('window.scrollTo(0, document.body.scrollHeight);')
Sys.sleep(60)
}
page_source <- remDr$getPageSource()
kata_vector <- read_html(page_source[[1]]) %>%
html_nodes('.item-title a') %>%
html_attr('href') %>%
str_replace('/kata/', '')
remDr$close
该网站提供了一个 api 应该是第一个停靠点。如果做不到这一点,您可以访问单独的页面,例如:
http://www.codewars.com/kata?page=21
如果您想滚动到页面底部,直到没有更多带有 RSelenium
的内容,您可以使用 "Loading..." 元素,它有一个 class=js-infinite-marker
。虽然我们在页面上仍然有这个元素,但我们尝试每秒向下滚动到它(对于任何问题都会捕获一些错误)。如果该元素不存在,我们假设所有内容都已加载:
library(RSelenium)
rD <- rsDriver(port = 4444L, browser = 'chrome')
remDr <- rD$client # You dont need to use the open method
remDr$navigate('http://www.codewars.com/kata')
chk <- FALSE
while(!chk){
webElem <- remDr$findElements("css", ".js-infinite-marker")
if(length(webElem) > 0L){
tryCatch(
remDr$executeScript("elem = arguments[0];
elem.scrollIntoView();
return true;", list(webElem[[1]])),
error = function(e){}
)
Sys.sleep(1L)
}else{
chk <- TRUE
}
}