es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Rascar múltiples listas de elenco de películas de IMDB utilizando RVEST en R.

Tengo una lista de 1000 URLs de películas que enlazan a la página del reparto y equipo técnico de IMDB. Necesito averiguar cómo extraer toda esa información de todas las páginas y crear una tabla de tres columnas con la información.

La columna A tendría el nombre de la película, la columna B tendría el año de lanzamiento, y la columna C contendría el actor. El objetivo final sería unirlo a mi conjunto principal de datos de películas por el nombre y el año de la película para hacer consultas más eficientes.

Originalmente, extraje estos datos con mi conjunto principal de películas, pero todos los miembros del reparto se agruparon en una sola lista en la columna y no puedo averiguar cómo separarlos en Excel.

Aquí hay un ejemplo de lo que estoy tratando de hacer.

La idea detrás del siguiente código sería crear dos tablas: una sería la tabla principal de películas con el nombre, año, director, etc., y la otra sería la tabla descrita anteriormente.

¿Alguien tiene alguna idea de cómo puedo escribir esta lista de elenco de películas para producir su propia tabla como la de la imagen?

Código: [El código y la salida no se traducen en markdown]

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear una tabla con el nombre de la película, el año de lanzamiento y el actor, puede modificar la función “get_cast” para devolver un data frame con tres columnas: movie_name, release_year y actor. Luego, puede usar la función “map_dfr” del paquete “purrr” para aplicar esta función a cada enlace de película y combinar los data frames resultantes en uno solo. Finalmente, puede unir esta tabla con el data frame “movies” usando la función “left_join” del paquete “dplyr”, basado en el nombre de la película y el año de lanzamiento.

    Aquí está el código modificado:

    “`{r}
    library(rvest) # paquete de webscraping
    library(purrr) # programación funcional
    library(dplyr) # manipulación de datos
    library(stringr) # manipulación de cadenas

    get_cast <- function(movie_link2) { movie_page <- read_html(movie_link2) movie_name <- movie_page %>% html_nodes(“.parent a”) %>% html_text() %>% str_trim()
    release_year <- movie_page %>% html_nodes(“.parent span”) %>% html_text() %>% str_extract(“\d+”)
    actor <- movie_page %>% html_nodes(“.loadlate , .primary_photo+ td a”) %>% html_text() %>% str_trim()
    data.frame(movie_name, release_year, actor, stringsAsFactors = FALSE)
    }

    movies <- data.frame()
    movie_cast <- data.frame()

    for (page_result in 1:10) {

    link <- paste0(“https://www.imdb.com/list/ls006266261/?st_dt=&mode=detail&page=”,
    page_result, “&ref_=ttls_vm_dtl&sort=list_order,asc”)

    page <- read_html(link)

    name <- page %>% html_nodes(“.lister-item-header a”) %>% html_text() %>% str_trim() %>% set_names()
    name <- name[!name %in% “Screen Two”]

    movie_link <- html_node(page, '.lister-item-header a') %>% html_attr(‘href’) %>% paste0(“https://www.imdb.com”, .)
    movie_link2 <- file.path(dirname(movie_link), “fullcredits”, str_replace(basename(movie_link), “ttls_li_tt”, “tt_ql_cl”))

    year <- page %>% html_nodes(“.lister-item-header .lister-item-year”) %>% html_text() %>% str_trim() %>% set_names()
    year <- year[!year %in% list(“IMDb user rating (average)”, “Number of votes”, “Release year or range”)]
    year <- str_extract(year, “\d{4}”)

    rating <- page %>% html_nodes(“.certificate”) %>% html_text() %>% str_trim() %>% set_names()

    director <- page %>% html_nodes(“.text-small a:nth-child(1)”) %>% html_text() %>% str_trim() %>% set_names()
    director <- director[!director %in% “gibboanx”]

    gross <- page %>% html_nodes(“.ghost~ .text-muted+ span”) %>% html_text() %>% str_trim() %>% set_names()
    gross <- gross[!gross %in% “|”]

    meta <- page %>% html_nodes(“.ratings-metascore span”) %>% html_text() %>% str_trim() %>% set_names()

    genre <- page %>% html_nodes(“.genre”) %>% html_text() %>% str_trim() %>% set_names()

    cast <- map_dfr(movie_link2, get_cast)

    movies <- bind_rows(movies, data.frame(name, year, rating, director, gross, meta, genre, stringsAsFactors = FALSE))
    movie_cast <- bind_rows(movie_cast, cast)

    print(paste(“Página:”, page_result))
    }

    movie_table <- movies %>%
    select(name, year) %>%
    group_by(name, year) %>%
    slice(1) %>%
    left_join(movie_cast, by = c(“name”, “year”))

    colnames(movie_table) <- c(“name”, “year”, “actor”)

    verificar las primeras filas

    head(movie_table)
    “`

Comments are closed.