RSelenium - как перейти на следующую страницу, нажав кнопку «Далее»? - PullRequest
0 голосов
/ 01 февраля 2019

мой вопрос касается очистки с помощью RSelenium.

Я пытаюсь очистить данные со следующего веб-сайта:

"https://www.nhtsa.gov/ratings" с использованием RSelenium.

Моя нынешняя трудность заключается в том, что я могу пропустить страницы для данного автопроизводителя.

Пока это мой код:

library(RSelenium)

#opens a connection
rD <- rsDriver()
remDr <- rD$client

#goes to the page we want
url <- "https://www.nhtsa.gov/ratings"
remDr$navigate(url)

#clicking to open the manufacturer selection "page"
webElem <- remDr$findElement(using = 'css selector', "#vehicle a")
webElem$clickElement()

#opening the options menu
option.menu <- remDr$findElement(using='css selector', 'select')
option.menu$clickElement()

#selecting one maker, loop over this later
maker.select <- remDr$findElement(using = 'xpath', "//*/option[@value = 'AUDI']")
maker.select$clickElement()

#search our selection
maker.click<-remDr$findElement(using='css selector', '.manufacturer-search-submit')
maker.click$clickElement()

#now we have to go through each car (10 per page), loop later
cars<-remDr$findElement(using='css selector', 'tbody:nth-child(6) a')
individual.link<-cars$getElementAttribute("href")

#going to the next page
next_page<-remDr$findElement(using='css selector', 'button.btn.link-arrow::after')
next_page$clickElement()

Но я получаю ошибку:

Error:   Summary: NoSuchElement
     Detail: An element could not be located on the page using the given search parameters.
     Further Details: run errorDetails method

Как вы, вероятно, видите, я новичок в RSelenium. Любая помощь, которую вы можете мне оказать, будет признательна. Заранее спасибо.

1 Ответ

0 голосов
/ 01 февраля 2019

Вот еще один подход, который может помочь.

Вы можете получить доступ к данным, просто отправив запрос GET на веб-сайт.С веб-сайта (на первой странице) мы можем увидеть

'https://api.nhtsa.gov/vehicles/byManufacturer?offset=0&max=10&sort=overallRating&order=desc&data=crashtestratings,recommendedfeatures&productDetail=all&dateStart=2011-01-01&manufacturerName=AUDI&dateEnd=3000-01-01&name='

Здесь мы можем получить данные.Вторая страница будет иметь offset=10, затем 20,30,etc.

Если api_url определен как вышеупомянутый URL, то мы можем получить данные, используя httr

# request the data
request <- httr::GET(api_url)
# retrieve the content
request_content <- httr::content(request)
request_result <- request_content$results
# request results contains the data of interest
# A few glimpses into the data
# The first model
request_result[[1]]$vehicleModel
# [1] "A3"
request_result[[1]]$modelYear
# [1] 2018
request_result[[1]]$manufacturer
# [1] "AUDI OF AMERICA, INC"

Теперь, играя с offset, это прямо впередсоздайте цикл и соберите все страницы

out <- list()
k <- 0L
i <- 1L
while (k < 1e+3) {
  req_url <- paste0('https://api.nhtsa.gov/vehicles/byManufacturer?offset=',
                    k, 
                    '&max=10&sort=overallRating&order=desc&data=crashtestratings,recommendedfeatures&productDetail=all&dateStart=2011-01-01&manufacturerName=AUDI&dateEnd=3000-01-01&name=')
  req <- httr::content(httr::GET(req_url))$result
  if (length(req) == 0) break
  out[[i]] <- req
  cat(paste0('\nAdded content for offset \t', k))
  i <- i + 1L
  k <- k + 10L
}
lengths(out)
# [1] 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10

Обратите внимание, что вы также можете поиграть с manufacturerName в URL-адресе и множеством других аргументов для получения чистых и адаптированных данных.

...