用R语言rvest包爬取豆瓣电影top250并做可视化分析

爬取网页数据:

1.安装selectorGadget插件

这个插件是安装在谷歌浏览器上的,长这样:

安装方法:先下载这个插件,是一个文件:


1

然后点击谷歌浏览器

这里,更多工具,扩展程序,把那个crx文件拖进去就好了。

2.用R语言实现网页爬取

访问https://movie.douban.com/top250网页


3.现在我们从这个网站上爬下这些数据:

Rank:电影排名(1-250)

Title:电影标题

Description:电影描述

Year:电影年份

Country:国家或地区

Genre:电影类型

Rating:用户打分

这个一个包含所有字段的页面截图


用R语言rvest包爬取豆瓣电影top250并做可视化分析_第1张图片

步骤1:现在我们先来爬取rank字段。为此,我们将使用Selector Gadget来获取包含排名的特定CSS选择器。您可以在浏览器中点击这个扩展程序,并用光标选择排名字段。


用R语言rvest包爬取豆瓣电影top250并做可视化分析_第2张图片

步骤2:当你确定已选择字段后,查看对应的css选择器,在底部查看

用R语言rvest包爬取豆瓣电影top250并做可视化分析_第3张图片

步骤3:当您知道CSS选择器已包含了排名顺序之后,您可以使用这个简单的R语言代码来获取所有的排名:


用R语言rvest包爬取豆瓣电影top250并做可视化分析_第4张图片

步骤4:当您有了数据后,请确保它看起来是您所需的格式。我在对数据进行预处理,将其转换为数字格式。


步骤5:现在您可以清除选择器部分并选择所有标题。您可以直观地检查所有标题是否被选中。使用您的光标进行任何所需的添加和删除。


用R语言rvest包爬取豆瓣电影top250并做可视化分析_第5张图片

步骤6:再一次,我有了相应标题的CSS选择器:.title:nth-child(1)。我将使用该选择器和以下代码爬取所有标题。


步骤7:在下面的代码中,我对description、year、country、genre、rating做了同样的操作。


爬取电影类型gener部分


用R语言rvest包爬取豆瓣电影top250并做可视化分析_第6张图片

有点难度,因为不能直接定位到类型那里,我先把整个爬取下看看。


用R语言rvest包爬取豆瓣电影top250并做可视化分析_第7张图片

然后我采用strsplit()函数不断地对gener_data进行字符串切割直到选择到电影类型的第一个,以下是我的代码:


用R语言rvest包爬取豆瓣电影top250并做可视化分析_第8张图片


去掉第一个元素,不要的“豆瓣”


用R语言rvest包爬取豆瓣电影top250并做可视化分析_第9张图片
选择想要的内容


用R语言rvest包爬取豆瓣电影top250并做可视化分析_第10张图片
将列表转为向量再操作




用R语言rvest包爬取豆瓣电影top250并做可视化分析_第11张图片
选择第一个作为电影类型 


用R语言rvest包爬取豆瓣电影top250并做可视化分析_第12张图片


将文本数据转为因子

爬取year、country、rating部分也是一样的方法。

步骤8:按照这种做法,然后我突然发现这样做只是爬取了一页的数据而已,也就是第1到第25的电影,后面的数据没抓取到。我观察后发现每页的数据有规律:

这个第一页的网址:

https://movie.douban.com/top250?start=0&filter=

这是第二页的网址:

https://movie.douban.com/top250?start=25&filter=

它是有规律的,所以我才用了循环来爬取10页的数据,爬取数据的完整代码在末尾。

步骤9:爬完数据后验证时发现description部分,year部分,gener部分还有country部分有错误。


用R语言rvest包爬取豆瓣电影top250并做可视化分析_第13张图片

人为查找之后发现description部分缺失的是201,203,233,238

修改:


用R语言rvest包爬取豆瓣电影top250并做可视化分析_第14张图片

而年份,国家和剧情出现错误是因为排行78的电影那里出现错误:


用R语言rvest包爬取豆瓣电影top250并做可视化分析_第15张图片

所以我着重查看那个位置爬下来的数据并进行修改,代码如下:


用R语言rvest包爬取豆瓣电影top250并做可视化分析_第16张图片

步骤10:将数据整理到一起:



结果发现数据有些原因,没办法我就在excel表上进行修改了,变成下表:


用R语言rvest包爬取豆瓣电影top250并做可视化分析_第17张图片

对爬取的数据进行可视化分析


用R语言rvest包爬取豆瓣电影top250并做可视化分析_第18张图片

(1)哪种类型的电影更受欢迎



用R语言rvest包爬取豆瓣电影top250并做可视化分析_第19张图片

可以看到剧情类电影大受欢迎,其次是喜剧,动作,犯罪跟动画。其实网页数据显示电影类型都多个,但是我只选择了第一个,可能有点影响。

(2)哪个时期的电影更受青睐




用R语言rvest包爬取豆瓣电影top250并做可视化分析_第20张图片

就这份榜单来讲,20世纪的电影更多一些。

�(3)哪个地区的电影更受欢迎



用R语言rvest包爬取豆瓣电影top250并做可视化分析_第21张图片

从这个图可以看到,美国的电影最受欢迎,影响也最广,毕竟好莱坞不是盖的哈哈。其次是日本电影,香港电影,英国,法国跟我们内地的电影。我个人也很喜欢日本电影,真的很有韵味。

这个分析我就做到这里啦,第一次做第一次发表,有很多不对的地方欢迎指出谢谢!

参考资料:https://mp.weixin.qq.com/s/mIL-p2q7Jp-dhkXkDIrdHQ

爬取网页数据完整代码:

library(rvest)

for (i in 0:9) {

       url<-paste('https://movie.douban.com/top250?start=',25*i,'&filter=&type=',sep="")

       webpage<-read_html(url)

#使用css选择器爬取rank排名部分

       rank_data_html<-html_nodes(webpage,'em')

       rank_data<-html_text(rank_data_html)

       rank_data<-as.numeric(rank_data)

#使用css选择器爬取电影标题title部分

       title_data_html<-html_nodes(webpage,'.title:nth-child(1)')

       title_data<-html_text(title_data_html)

#爬取电影描述description部分

       description_data_html<-html_nodes(webpage,'.inq')

       description_data<-html_text(description_data_html)

       description_data<-unlist(description_data)

#爬取电影类型gener、年份year、国家country部分

       total_data_html<-html_nodes(webpage,'.bd p:nth-child(1)')

       total_data<-html_text(total_data_html)

total_data<-strsplit(total_data,'\n')#按\来划分内容,向量变成了列表

total_data[1]<-NULL#爬下来的第一个元素是“豆瓣”,是不要的,要删掉

total_data<-lapply(total_data,function(x){x[-c(1,2,4)]})#去除不要的内容,只保留含有年份,国家,电影类型的元素

total_data<-unlist(total_data)#将列表转为向量再操作

       total_data<-strsplit(total_data,'/')

#选择年份部分

       year_data<-lapply(total_data, function(x){x[-c(2,3)]})

       year_data<-unlist(year_data)

       year_data<-sub("^\\s+","",year_data)

#选择国家部分

       country_data<-lapply(total_data, function(x){x[-c(1,3)]})

       country_data<-unlist(country_data)

       country_data<-strsplit(country_data,' ')

       country_data<-lapply(country_data, function(x){x[1]})

       country_data<-unlist(country_data)

#选择电影类型部分

       gener_data<-lapply(total_data,function(x){x[-c(1,2)]})

       gener_data<-unlist(gener_data)

       gener_data<-strsplit(gener_data,' ')

       gener_data<-lapply(gener_data,function(x){x[1]})

       gener_data<-unlist(gener_data)

#爬取评分部分rating

       rating_data_html<-html_nodes(webpage,'.rating_num')

       rating_data<-html_text(rating_data_html)

       rating_data<-as.numeric(rating_data)

#将爬取的特征整合到一个数据框

       if(i==0){

         rank<-rank_data

         title<-title_data

         description<-description_data

         year<-year_data

         country<-country_data

         gener<-gener_data

         rating<-rating_data

       } else {

         rank<-c(rank,rank_data)

         title<-c(title,title_data)

         description<-c(description,description_data)

         year<-c(year,year_data)

         country<-c(country,country_data)

         gener<-c(gener,gener_data)

         rating<-c(rating,rating_data)

       }

}

for(i in c(201,203,233,238)){

  a<-description[1:(i-1)]

  b<-description[i:length(description)]

  description<-append(a,list("NA"))

  description<-append(description,b)

  description<-unlist(description)

}

for (i in c(78)) {

  c<-country[1:(i-1)]

  d<-country[(i+4):length(country)]

country<-append(c,list("香港"))

  country<-append(country,d)

  country<-unlist(country)

}

for (i in c(78)) {

  m<-gener[1:(i-1)]

  n<-gener[(i+4):length(gener)]

gener<-append(m,list("动画"))

  gener<-append(gener,n)

  gener<-unlist(gener)

}

for (i in c(78)) {

  e<-year[1:(i-1)]

  f<-year[(i+3):length(year)]

  year<-append(e,list("1961","1997","1987"))

  year<-append(year,f)

  year<-unlist(year)

}

for (i in c(81,82,83)) {

  year<-year[-i]

}

length(rank)

length(title)

length(description)

length(year)

length(country)

length(gener)

length(rating)

movie_df<-data.frame(Rank=rank,Title=title,Description=description,Year=year,Country=country,Gener=gener,Rating=rating)

str(movie_df)

head(movie_df)

write.csv(movie_df,"doubanmovietop250.csv",row.names = FALSE)

你可能感兴趣的:(用R语言rvest包爬取豆瓣电影top250并做可视化分析)