Очистка связанных веб-страниц HTML с помощью цикла функции rvest :: follow_link ()

Как я могу зациклить функцию rvest::follow_link() для очистки связанных веб-страниц?

Пример использования:

  1. Определите всех участников Lego Movie.
  2. Подпишитесь на все ссылки на актеров Lego Movie
  3. Возьмите таблицу каждого фильма (+ год) для всех актеров.

Необходимые мне селекторы приведены ниже:

library(rvest)
lego_movie <- html("http://www.imdb.com/title/tt1490017/")
lego_movie <- lego_movie %>%
  html_nodes(".itemprop , .character a") %>%
  html_text()

# follow cast links
(".itemprop .itemprop") 

# grab tables of all movies and dates for each cast member
(".year_column , b a")

Желаемый результат:

castMember       movie    year
Will Arnett      Lego     2017
Will Arnett      BoJack   2014
Will Arnett      Wander   2014
        ............
Elizabeth Banks  Moonbeam 2015
Elizabeth Banks  Wet Hot  2015
        ............
Alison Brie      Get Hard 2015
Alison Brie      GetaJob  2015
        .....etc.....

person emehex    schedule 04.03.2015    source источник


Ответы (2)


Возможно, что-то подобное могло бы сработать.

library(rvest)
library(stringr)
library(data.table)
lego_movie <- read_html("http://www.imdb.com/title/tt1490017/")
cast <- lego_movie %>%
    html_nodes("#titleCast .itemprop span") %>%
    html_text()
cast

s <- html_session("http://www.imdb.com/title/tt1490017/")

cast_movies <- list()

for(i in cast[1:3]){
    actorpage <- s %>% follow_link(i) %>% read_html()
    cast_movies[[i]]$movies <-  actorpage %>% 
        html_nodes("b a") %>% html_text() %>% head(10)
    cast_movies[[i]]$years <- actorpage %>%
        html_nodes("#filmography .year_column") %>% html_text() %>% 
        head(10) %>% str_extract("[0-9]{4}")
    cast_movies[[i]]$name <- rep(i, length(cast_movies[[i]]$years))
}

cast_movies
as.data.frame(cast_movies[[1]])
rbindlist(cast_movies)
person mileschen    schedule 12.10.2015

Это не проверено, поэтому может ошибаться. Я бы прошел его шаг за шагом и убедился, что он правильный. Я не уверен, как использовать follow_link в этом контексте ... но вот что я придумал ...

library("rvest")
library("stringr")
lego_movie <- html("http://www.imdb.com/title/tt1490017/")
links <- lego_movie %>%
            html() %>%
            html_nodes(".itemprop , a") %>% xml_attr("href")
links[is.na(links)] <- ""

actors <- lego_movie %>%
  html() %>%
  html_nodes(".itemprop , a") %>%
html_text()

df <- data.frame(name=actors, link=links, stringsAsFactors=F)
df <- subset(df, substring(link, 2, 5)=="name")
df <- subset(df, name!="")
df$name <- gsub("\\n", "", df$name)
df$name <- str_trim(df$name)
df <- df[order(df$name),]
df <- subset(df, !duplicated(df$name))

get_movies <- function(name, link){
  url <- paste0("http://www.imdb.com", link)
  movies <- url %>%
    html() %>%
    html_nodes(".year_column , b a") %>%
    html_text()
  # take care of random date at top of some actors stuff...
  if(length(movies)%%2==1){movies <- movies[-1]}
  movies <- gsub("\\n", "", movies)
  movies <- str_trim(movies)
  df <- data.frame(date=movies[seq(1, length(movies), 2)], 
                   movie=movies[seq(2, length(movies), 2)],
                   stringsAsFactors=F)
  df <- cbind(name=rep(name, nrow(df)), df)
  return(df)
}

final_df <- data.frame()
for(i in 1:nrow(df)){
  final_df <- rbind(final_df, get_movies(df$name[i], df$link[i]))
}
person cory    schedule 04.03.2015
comment
Спасибо за попытку, но это не совсем ответ на вопрос. На основе документации rvest (cran.r-project.org/web/ packages / rvest / rvest.pdf) похоже, что функция follow_link () должна резко сократить код. Но примеры документации недостаточно ясны, чтобы адаптироваться к другим случаям ... - person emehex; 05.03.2015
comment
Прошу прощения, в следующий раз постараюсь еще больше. - person cory; 05.03.2015
comment
Возможно, я смогу адаптировать код для своего использования ... но я надеюсь, что мы увидим, как можно использовать функцию follow_link! - person emehex; 05.03.2015