RSelenium: очистка динамически загружаемой страницы, которая загружается медленно

Я не уверен, что это из-за того, что у меня медленный интернет, но я пытаюсь очистить веб-сайт, который загружает информацию, когда вы прокручиваете страницу вниз. Я выполняю скрипт, который идет в конец страницы и ждет, пока сервер 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

person Beemyfriend    schedule 04.03.2017    source источник


Ответы (1)


Веб-сайт предоставляет API, который должен быть первым портом захода. В противном случае вы можете получить доступ к отдельным страницам, используя, например:

http://www.codewars.com/kata?page=21

Если вы хотите прокручивать страницу вниз до тех пор, пока с RSelenium не останется контента, вы можете использовать элемент «Загрузка...», у которого есть 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
  }
}
person jdharrison    schedule 04.03.2017