# instalar el paquete rvest install.packages('rvest') # cargar el paquete rvest library('rvest') # especificar la url del website para ser scrapeada url <- 'http://www.imdb.com/search/title?count=100&release_date=2016,2016&title_type=feature' # leer el código HTML del website webpage <- read_html(url) # utilizar selectores CSS para scrapear la sección de rankings rank_data_html <- html_nodes(webpage,'.text-primary') # convertir los datos del ranking en texto rank_data <- html_text(rank_data_html) # imprimir los primeros valores de ranking head(rank_data) # convertir los datos de ranking a números rank_data<-as.numeric(rank_data) # imprimir los primeros valores de ranking head(rank_data) # utilizar selectores CSS para scrapear la sección de títulos title_data_html <- html_nodes(webpage,'.lister-item-header a') # convertir los datos de título a texto title_data <- html_text(title_data_html) # imprimir los primeros datos de título head(title_data) # utilizar selectores CSS para scrapear la sección de descripción description_data_html <- html_nodes(webpage,'.ratings-bar+ .text-muted') # convertir los datos de descripción a texto description_data <- html_text(description_data_html) # imprimir los datos de descripción head(description_data) # remover '\n' description_data<-gsub("\n","",description_data) # imprimir los datos de descripción head(description_data) # utilizar selectores CSS para scrapear la sección de duración runtime_data_html <- html_nodes(webpage,'.text-muted .runtime') # convertir la duración a texto runtime_data <- html_text(runtime_data_html) # imprimir las duraciones head(runtime_data) # remover 'mins' y convertir a numérico runtime_data<-gsub(" min","",runtime_data) runtime_data<-as.numeric(runtime_data) # imprimir las duraciones head(runtime_data) # utilizar selectores para scrapear los géneros genre_data_html <- html_nodes(webpage,'.genre') # convertir los géneros a texto genre_data <- html_text(genre_data_html) # imprimir los géneros head(genre_data) # remover '\n' genre_data<-gsub("\n","",genre_data) # removes espacios genre_data<-gsub(" ","",genre_data) # tomar sólo el primer género genre_data<-gsub(",.*","",genre_data) # convertir los géneros a factor genre_data<-as.factor(genre_data) # imprimir los géneros head(genre_data) # utilizar selectores para scrapear los ratings rating_data_html <- html_nodes(webpage,'.ratings-imdb-rating strong') # convertir los ratings a texto rating_data <- html_text(rating_data_html) # imprimir los ratings head(rating_data) # convertir los ratings a número rating_data<-as.numeric(rating_data) # imprimir los ratings head(rating_data) # utilizar selectores para scrapear los votos votes_data_html <- html_nodes(webpage,'.sort-num_votes-visible span:nth-child(2)') # convertir los votos a texto votes_data <- html_text(votes_data_html) # imprimir los votos head(votes_data) # remover las comas votes_data<-gsub(",","",votes_data) # convertir los votos a número votes_data<-as.numeric(votes_data) # imprimir los votos head(votes_data) # utilizar selectores para scrapear los directores directors_data_html <- html_nodes(webpage,'.text-muted+ p a:nth-child(1)') # convertir los directores a texto directors_data <- html_text(directors_data_html) # imprimir los directores head(directors_data) # convertir los directores a factor directors_data<-as.factor(directors_data) # utilizar selectores para scrapear los autores actors_data_html <- html_nodes(webpage,'.lister-item-content .ghost+ a') # convertir los autores a texto actors_data <- html_text(actors_data_html) # imprimir los actores head(actors_data) # convertir los actores a factor actors_data<-as.factor(actors_data) # imprimir el factor de autores actors_data # utilizar selectores para scrapear los metascore metascore_data_html <- html_nodes(webpage,'.metascore') # convertir los metascore a texto metascore_data <- html_text(metascore_data_html) # imprimir los metascore head(metascore_data) # remover los espacios metascore_data<-gsub(" ","",metascore_data) # imprimir la longitud de los metascore length(metascore_data) # rellenar los missings con NA's for (i in c(39,73,80,89)){ a<-metascore_data[1:(i-1)] b<-metascore_data[i:length(metascore_data)] metascore_data<-append(a,list("NA")) metascore_data<-append(metascore_data,b) } # convertir metascores a numérico metascore_data<-as.numeric(metascore_data) # imprimir longitud de metascores length(metascore_data) # imprimir el resumen estadístico summary(metascore_data) # utilizar selectores para scrapear las ganancias gross_data_html <- html_nodes(webpage,'.ghost~ .text-muted+ span') # convertir las ganancias a texto gross_data <- html_text(gross_data_html) # imprimir las ganancias head(gross_data) # remover las M's gross_data<-gsub("M","",gross_data) # removes las $ gross_data<-substring(gross_data,2,6) # imprimir la longitud de las ganancias length(gross_data) # rellenar los missings con NA for (i in c(17,39,49,52,57,64,66,73,76,77,80,87,88,89)){ a<-gross_data[1:(i-1)] b<-gross_data[i:length(gross_data)] gross_data<-append(a,list("NA")) gross_data<-append(gross_data,b) } # convertir las ganancias a numérico gross_data<-as.numeric(gross_data) # imprimir la longitud de las ganancias length(gross_data) # imprimir el resumen estadístico de las ganancias summary(gross_data) # combinar todas las listas en un data frame movies_df<-data.frame(Rank = rank_data, Title = title_data, Description = description_data, Runtime = runtime_data, Genre = genre_data, Rating = rating_data, Metascore = metascore_data, Votes = votes_data, Gross_Earning_in_Mil = gross_data, Director = directors_data, Actor = actors_data) # imprimir la estructura del data frame str(movies_df) # cargar ggplot2 library('ggplot2') # crear un histograma qplot(data = movies_df,Runtime,fill = Genre,bins = 30) # crear scatters ggplot(movies_df,aes(x=Runtime,y=Rating))+ geom_point(aes(size=Votes,col=Genre)) ggplot(movies_df,aes(x=Runtime,y=Gross_Earning_in_Mil))+ geom_point(aes(size=Rating,col=Genre))