R: Создание фрейма данных с очищенными данными из RSelenium - PullRequest
4 голосов
/ 26 марта 2019

Я собираю некоторую информацию из Google Книг (проводя исследования для команд НХЛ), и для начала использую RSelenium:

library(tidyverse)
library(RSelenium) # using Docker
library(rvest)
library(httr)

remDr <- remoteDriver(port = 4445L, browserName = "chrome")
remDr$open()
remDr$navigate("https://books.google.com/")
books <- remDr$findElement(using = "css", "[name = 'q']")
books$sendKeysToElement(list("NHL teams", key = "enter"))
bookElem <- remDr$findElements(using = "xpath",
                           "//h3[@class = 'LC20lb']//parent::a")

links <- sapply(bookElem, function(bookElem){
  bookElem$getElementAttribute("href")
})

Выше приведен переход на правильную страницу и поиск "команд НХЛ". Единственное предостережение состоит в том, что некоторые из этих книг имеют страницу «предварительного просмотра», и чтобы добраться до сути (название, автор и т. Д.), Нужно сделать один щелчок дальше, в «Об этой книге»:

for(link in links) {
  remDr$navigate(link)

  # If statement to get past book previews
  if (str_detect(link, "frontcover")) {

    # Finding elements for "About this book"
    link2 <- remDr$findElements(using = 'xpath', 
                                '//a[@id="sidebar-atb-link" and span[.="About this book"]]')

    # Clicking on the "About this book" links
    link2_about <- sapply(link2, function(link2){
      link2$getElementAttribute('href') 
    })

    duh <- map(link2_about, read_html)

    # NHL book title, author
    nhl_title <- duh %>% 
      map(html_nodes, '#bookinfo > h1 > span.fn > span') %>% 
      map_chr(html_text) %>% 
      print()

    author1 <- duh %>% 
      map(html_nodes, '#bookinfo div:nth-child(1) span') %>% 
      map_chr(html_text) %>% 
      print()

    test_df <- cbind(nhl_title, author1) # ONLY binds the last book/author
    print(test_df)

  } else {          
    print("lol you thought this would work?") # haven't built this part out yet             
  }
} 

Мое использование map печатает отдельные заголовки / авторов, и я не могу понять, как поместить их в кадр данных. Каждый раз, когда я использую tibble() или map_dfr(), я получаю ошибки. В приведенном выше цикле for указан заголовок, а затем автор, но ничего не собрано. Как мне связать все это в один кадр?

1 Ответ

2 голосов
/ 29 марта 2019

Ответ оказался довольно простым.Мне просто нужно было добавить пустой список над циклом for, а затем добавить его внутри цикла.Например,

blank_list <- list()

for(link in links) {
....

  blank_list[[link]] <- tibble(nhl_title, author1)
  wow <- bind_rows(blank_list) 
  print(wow)

}

Не используйте do.call() или другие опции, bind_rows() просто быстрее, чем остальные.

...