R学习:用rvest包爬取imdb网站电影信息

    原文链接:http://www.ituring.com.cn/article/465317

    感觉这篇文章对于学习rvest爬取网页数据非常有价值,下面是我的学习操作记录。

# 加载包
library('rvest')

# 指定要爬取的url
url <- 'http://www.imdb.com/search/title?count=100&release_date=2016,2016&title_type=feature'

# 从网页读取html代码
webpage <- read_html(url)

# 用CSS选择器获取排名部分
rank_data_html <- html_nodes(webpage,'.text-primary')

# 把排名转换为文本
rank_data <- html_text(rank_data_html)

# 检查一下数据
head(rank_data)

# 数据预处理:把排名转换为数值型
rank_data<-as.numeric(rank_data)

# 再检查一遍
head(rank_data)

# 爬取标题
title_data_html <- html_nodes(webpage,'.lister-item-header a')

# 把标题转换为文本
title_data <- html_text(title_data_html)

# 检查一下
head(title_data)

# 爬取描述
description_data_html <- html_nodes(webpage,'.ratings-bar+ .text-muted')

# 把描述转换为文本
description_data <- html_text(description_data_html)

# 检查一下
head(description_data)

# 移除 '\n'
description_data<-gsub("\n","",description_data)

# 再检查一下
head(description_data)

# 爬取runtime section
runtime_data_html <- html_nodes(webpage,'.text-muted .runtime')

head(runtime_data_html)

# 把时长转换为文本
runtime_data <- html_text(runtime_data_html)

# 检查一下
head(runtime_data)

# 数据预处理: 去除“min”并把数字转换为数值型
runtime_data<-gsub(" min","",runtime_data)

# 数据预处理:把排名转换为数值型
runtime_data<-as.numeric(runtime_data)

# 检查一下
head(runtime_data)

# 爬取genre
genre_data_html <- html_nodes(webpage,'.text-muted .genre')

# 把genre转换为文本
genre_data <- html_text(genre_data_html)

# 检查一下
head(genre_data)

# 移除 '\n'
genre_data <- gsub("\n","",genre_data)

# 去除多余空格
genre_data<-gsub(" ","",genre_data)

# 检查一下
head(genre_data)

# 每部电影只保留第一种类型
genre_data<-gsub(",.*","",genre_data)

# 检查一下
head(genre_data)

# 转化为因子
genre_data<-as.factor(genre_data)

# 再检查一下
head(genre_data)

# 爬取IMDB rating
rating_data_html <- html_nodes(webpage,'.ratings-imdb-rating strong')

# 把genre转换为文本
rating_data <- html_text(rating_data_html)

# 检查一下
head(rating_data)

# 转为数值型
rating_data<-as.numeric(rating_data)

# 再检查一下
head(rating_data)

# 爬取votes section
votes_data_html <- html_nodes(webpage,'.sort-num_votes-visible span:nth-child(2)')

# 把投票点赞数转换为文本
votes_data <- html_text(votes_data_html)

# 检查一下
head(votes_data)

# 移除 ','
votes_data <- gsub(",","",votes_data)

# 检查一下
head(votes_data)

# 转为数值型
votes_data<-as.numeric(votes_data)

# 检查一下
head(votes_data)

# 爬取导演
directors_data_html <- html_nodes(webpage,'.text-muted+ p a:nth-child(1)')

# 把导演转换为文本
directors_data <- html_text(directors_data_html)

# 检查一下
head(directors_data)

# 转为因子
directors_data<-as.factor(directors_data)

# 检查一下
head(directors_data)

# 爬取演员
actors_data_html <- html_nodes(webpage,'.text-muted+ p a:nth-child(2)')

# 把演员转换为文本
actors_data <- html_text(actors_data_html)

# 检查一下
head(actors_data)

# 转为因子
actors_data<-as.factor(actors_data)

# 检查一下
head(actors_data)

# 爬取 metascore
metascore_data_html <- html_nodes(webpage,'.ratings-metascore .metascore')

# 把metascore转换为文本
metascore_data <- html_text(metascore_data_html)

# 检查一下
metascore_data

# 移除 ' '
metascore_data <- gsub(" ","",metascore_data)

# 检查一下
head(metascore_data)

#填补缺失值
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)
}

#填补缺失值 也可以用下面的办法,这种办法更好
length(metascore_data)
for (i in c(39,73,80,89)) {
  metascore_data <- append(metascore_data, 'NA', (i-1))
}
metascore_data

# 转为数值型
metascore_data<-as.numeric(metascore_data)

# 检查一下
metascore_data

length(metascore_data)

# 爬取revenue (收入)
gross_data_html <- html_nodes(webpage,'.ghost~ .text-muted+ span')

# 把revenue转换为文本
gross_data <- html_text(gross_data_html)

# 检查一下
gross_data

# 去除'$' 和 'M' 标记
gross_data <- gsub("M", "", gross_data)
gross_data <- substring(gross_data, 2, 6)

# 填充缺失值
for (i in c(17,30,31,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)
}

# 转为数值
gross_data<-as.numeric(gross_data)

# 再次检车长度
length(gross_data)

# 合并所有list来创建一个数据框
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
)

# 查看数据框结构
str(movies_df)

#6. 分析从网页爬取的数据

library('ggplot2')
qplot(data = movies_df,Runtime,fill = Genre,bins = 30)

#**Question 1: ** 那个类型的电影市场最长?

ggplot(movies_df,aes(x=Runtime,y=Rating))+
  geom_point(aes(size=Votes,col=Genre))

# **Question 2: ** 市场130-160分钟的电影里,哪一类型东西好评率最高?
ggplot(movies_df,aes(x=Runtime,y=Gross_Earning_in_Mil))+
  geom_point(aes(size=Rating,col=Genre))




    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值