Извлекайте данные из нескольких ссылок с помощью rvest и purrr - PullRequest
0 голосов
/ 01 августа 2020

У меня есть список ссылок в DF, на котором я хотел бы запустить функцию для извлечения данных из каждого.

Библиотеки и данные:

library(rvest)
library(tidyverse)

link_df <- tribble(~title, ~episode, ~link,
        "a", "1", "https://www.backlisted.fm/episodes/1-j-l-carr-a-month-in-the-country",
        "b", "2", "https://www.backlisted.fm/episodes/2-jean-rhys-good-morning-midnight",
        "c", "3", "https://www.backlisted.fm/episodes/3-david-nobbs-1")

Я пробовал взять части из this и this , но я где-то пропустил шаг:

recs_extract <- function(df){
  
  pages <- df %>% map(read_html, url = link)
  
data <- pages %>% 
  map_dfr(. %>% 
          html_nodes(css = "ul li") %>% 
            html_text() %>% 
            tibble(title = .) %>% 
            slice(12:n()-2) %>% 
            separate(col = title,
                     into = c("author", "titles"),
                     sep = "-" ) %>% 
            separate(titles, 
                     into = c(paste("books", 1:15)),
                     sep = ",", 
                     extra = "drop") %>% 
            mutate(across(where(is.character), str_trim)) %>% 
            janitor::remove_empty(which = "cols") %>% 
            pivot_longer(cols = contains("books"),
                         names_to = NULL, 
                         values_to = "Title", 
                         values_drop_na = TRUE)
          )
  
}

Эта функция работает с одной ссылкой:

link_df$link[1] %>% map(recs_extract)

[[1]]
# A tibble: 15 x 2
   author                       Title                                   
   <chr>                        <chr>                                   
 1 J L Carr                     A Month in the Country                  
 2 J L Carr                     Harpole and Foxberrow General Publishers
 3 J L Carr                     The Battle of Pollocks Crossing         
 4 Vasily Grossman              Life and Fate                           
 5 Mr Bingo                     Hate Mail                               
 6 William S Burroughs          Naked Lunch                             
 7 Nancy Mitford                Love in a Cold Climate                  
 8 J Arthur Gibbs               A Cotswold Village                      
 9 Giuseppe Tomasi di Lampedusa The Leopard                             
10 W N P Barbellion             Journal of a Disappointed Man           
11 Lissa Evans                  Their Finest Hour and a Half            
12 Lissa Evans                  Crooked Heart                           
13 Byron Rogers                 The Last Englishman                     
14 Andy Miller                  Tilting at Windmills                    
15 William Golding              Darkness Visible                        

Должен ли я сначала помещаться во вложенный df? Как переходить по каждой ссылке и хранить?

#doesn't work
link_df %>% 
  group_by(title) %>%
  nest() %>% 
  mutate(data = map(data, recs_extract, link))

Спасибо, извиняюсь за длинный пост.

1 Ответ

0 голосов
/ 01 августа 2020

Вы можете использовать map например:

library(dplyr)
library(purrr)

link_df %>% mutate(data = map(link, recs_extract))


# A tibble: 3 x 4
#  title episode link                                                                 data             
#  <chr> <chr>   <chr>                                                                <list>           
#1 a     1       https://www.backlisted.fm/episodes/1-j-l-carr-a-month-in-the-country <tibble [15 × 2]>
#2 b     2       https://www.backlisted.fm/episodes/2-jean-rhys-good-morning-midnight <tibble [17 × 2]>
#3 c     3       https://www.backlisted.fm/episodes/3-david-nobbs-1                   <tibble [18 × 2]>
...