R:抓取一个动态加载的页面,滚动时间长但有限,直到结束(使用 RSelenium?)
R: Scraping a dynamically loading page with long but finite scrolling until the end (with RSelenium?)
This page 几乎看起来是无限的,因为它在动态加载页面中显示超过 6.000 个配置文件。
A similar one 只显示 310 个配置文件,因此滚动到最后不需要那么多时间。
有没有一种方法可以编写一个代码,通过滚动到末尾来抓取两个页面?
出于类似的目的,我使用了带有 RSelenium
的代码,如下所示:
journal_url <- "https://www.frontiersin.org/journals/photonics#editorial-board"
rD <- RSelenium::rsDriver(browser="chrome", port=4546L, verbose=F, chromever="87.0.4280.20")
for(i in 1:5){
remDr$executeScript(paste("scroll(0,",i*10000,");"))
Sys.sleep(3)
}
但在目前的情况下,虽然像 for(i in 1:5)
那样滚动五次对于第二页(有 350 个配置文件)可能就足够了,但对于第一个页面(有 6.000 个配置文件)来说就不够了。如果有人能给我指出可以处理不同大小页面的单一代码,我将不胜感激!
相信你会在这里找到答案,
在副标题“向下滚动到最后(如果页面太多,不推荐)”下。
编辑:这是来自 link.
的建议代码
element <- driver$findElement("css", "body")
flag <- TRUE
counter <- 0
n <- 5
while(flag){
counter <- counter + 1
#compare the pagesource every n(n=5) time, since sometimes one scroll down doesn't render new content
for(i in 1:n){
element$sendKeysToElement(list("key"="page_down"))
Sys.sleep(2)
}
if(exists("pagesource")){
if(pagesource == driver$getPageSource()[[1]]){
flag <- FALSE
writeLines(paste0("Scrolled down ",n*counter," times.\n"))
} else {
pagesource <- driver$getPageSource()[[1]]
}
} else {
pagesource <- driver$getPageSource()[[1]]
}
}
This page 几乎看起来是无限的,因为它在动态加载页面中显示超过 6.000 个配置文件。
A similar one 只显示 310 个配置文件,因此滚动到最后不需要那么多时间。
有没有一种方法可以编写一个代码,通过滚动到末尾来抓取两个页面?
出于类似的目的,我使用了带有 RSelenium
的代码,如下所示:
journal_url <- "https://www.frontiersin.org/journals/photonics#editorial-board"
rD <- RSelenium::rsDriver(browser="chrome", port=4546L, verbose=F, chromever="87.0.4280.20")
for(i in 1:5){
remDr$executeScript(paste("scroll(0,",i*10000,");"))
Sys.sleep(3)
}
但在目前的情况下,虽然像 for(i in 1:5)
那样滚动五次对于第二页(有 350 个配置文件)可能就足够了,但对于第一个页面(有 6.000 个配置文件)来说就不够了。如果有人能给我指出可以处理不同大小页面的单一代码,我将不胜感激!
相信你会在这里找到答案,
在副标题“向下滚动到最后(如果页面太多,不推荐)”下。
编辑:这是来自 link.
的建议代码element <- driver$findElement("css", "body")
flag <- TRUE
counter <- 0
n <- 5
while(flag){
counter <- counter + 1
#compare the pagesource every n(n=5) time, since sometimes one scroll down doesn't render new content
for(i in 1:n){
element$sendKeysToElement(list("key"="page_down"))
Sys.sleep(2)
}
if(exists("pagesource")){
if(pagesource == driver$getPageSource()[[1]]){
flag <- FALSE
writeLines(paste0("Scrolled down ",n*counter," times.\n"))
} else {
pagesource <- driver$getPageSource()[[1]]
}
} else {
pagesource <- driver$getPageSource()[[1]]
}
}