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

爬取网页数据:

1.安装selectorGadget插件

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

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


1

然后点击谷歌浏览器

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

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

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


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

Rank:电影排名(1-250)

Title:电影标题

Description:电影描述

Year:电影年份

Country:国家或地区

Genre:电影类型

Rating:用户打分

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


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


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

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


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


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


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


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


爬取电影类型gener部分


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


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



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


选择想要的内容


将列表转为向量再操作




选择第一个作为电影类型 



将文本数据转为因子

爬取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部分有错误。


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

修改:


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


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


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



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


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


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



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

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




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

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



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

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

参考资料: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)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,881评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,052评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,598评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,407评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,823评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,872评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,037评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,778评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,505评论 1 247
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,745评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,233评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,231评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,141评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,939评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,954评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,784评论 2 275

推荐阅读更多精彩内容