用R語言rvest包爬取豆瓣電影top250并做可視化分析

爬取網(wǎng)頁數(shù)據(jù):

1.安裝selectorGadget插件

這個(gè)插件是安裝在谷歌瀏覽器上的芝此,長這樣:

安裝方法:先下載這個(gè)插件,是一個(gè)文件:


1

然后點(diǎn)擊谷歌瀏覽器

這里因痛,更多工具婚苹,擴(kuò)展程序,把那個(gè)crx文件拖進(jìn)去就好了。

2.用R語言實(shí)現(xiàn)網(wǎng)頁爬取

訪問https://movie.douban.com/top250網(wǎng)頁


3.現(xiàn)在我們從這個(gè)網(wǎng)站上爬下這些數(shù)據(jù):

Rank:電影排名(1-250)

Title:電影標(biāo)題

Description:電影描述

Year:電影年份

Country:國家或地區(qū)

Genre:電影類型

Rating:用戶打分

這個(gè)一個(gè)包含所有字段的頁面截圖


步驟1:現(xiàn)在我們先來爬取rank字段。為此咱揍,我們將使用Selector Gadget來獲取包含排名的特定CSS選擇器筷弦。您可以在瀏覽器中點(diǎn)擊這個(gè)擴(kuò)展程序,并用光標(biāo)選擇排名字段档插。


步驟2:當(dāng)你確定已選擇字段后,查看對應(yīng)的css選擇器,在底部查看

?

步驟3:當(dāng)您知道CSS選擇器已包含了排名順序之后非区,您可以使用這個(gè)簡單的R語言代碼來獲取所有的排名:


步驟4:當(dāng)您有了數(shù)據(jù)后,請確保它看起來是您所需的格式盹廷。我在對數(shù)據(jù)進(jìn)行預(yù)處理征绸,將其轉(zhuǎn)換為數(shù)字格式。


步驟5:現(xiàn)在您可以清除選擇器部分并選擇所有標(biāo)題俄占。您可以直觀地檢查所有標(biāo)題是否被選中歹垫。使用您的光標(biāo)進(jìn)行任何所需的添加和刪除。


步驟6:再一次颠放,我有了相應(yīng)標(biāo)題的CSS選擇器:.title:nth-child(1)排惨。我將使用該選擇器和以下代碼爬取所有標(biāo)題。


步驟7:在下面的代碼中碰凶,我對description暮芭、year鹿驼、country、genre辕宏、rating做了同樣的操作畜晰。


爬取電影類型gener部分


有點(diǎn)難度,因?yàn)椴荒苤苯佣ㄎ坏筋愋湍抢锶鹂穑蚁劝颜麄€(gè)爬取下看看凄鼻。


然后我采用strsplit()函數(shù)不斷地對gener_data進(jìn)行字符串切割直到選擇到電影類型的第一個(gè),以下是我的代碼:



去掉第一個(gè)元素聚假,不要的“豆瓣”


選擇想要的內(nèi)容


將列表轉(zhuǎn)為向量再操作




選擇第一個(gè)作為電影類型?



將文本數(shù)據(jù)轉(zhuǎn)為因子

爬取year块蚌、country、rating部分也是一樣的方法膘格。

步驟8:按照這種做法峭范,然后我突然發(fā)現(xiàn)這樣做只是爬取了一頁的數(shù)據(jù)而已,也就是第1到第25的電影瘪贱,后面的數(shù)據(jù)沒抓取到纱控。我觀察后發(fā)現(xiàn)每頁的數(shù)據(jù)有規(guī)律:

這個(gè)第一頁的網(wǎng)址:

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

這是第二頁的網(wǎng)址:

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

它是有規(guī)律的,所以我才用了循環(huán)來爬取10頁的數(shù)據(jù)菜秦,爬取數(shù)據(jù)的完整代碼在末尾甜害。

步驟9:爬完數(shù)據(jù)后驗(yàn)證時(shí)發(fā)現(xiàn)description部分,year部分球昨,gener部分還有country部分有錯(cuò)誤唾那。


人為查找之后發(fā)現(xiàn)description部分缺失的是201,203,233,238

修改:


而年份,國家和劇情出現(xiàn)錯(cuò)誤是因?yàn)榕判?8的電影那里出現(xiàn)錯(cuò)誤:


所以我著重查看那個(gè)位置爬下來的數(shù)據(jù)并進(jìn)行修改褪尝,代碼如下:


步驟10:將數(shù)據(jù)整理到一起:



結(jié)果發(fā)現(xiàn)數(shù)據(jù)有些原因闹获,沒辦法我就在excel表上進(jìn)行修改了,變成下表:


對爬取的數(shù)據(jù)進(jìn)行可視化分析


(1)哪種類型的電影更受歡迎



可以看到劇情類電影大受歡迎河哑,其次是喜劇避诽,動(dòng)作,犯罪跟動(dòng)畫璃谨。其實(shí)網(wǎng)頁數(shù)據(jù)顯示電影類型都多個(gè)沙庐,但是我只選擇了第一個(gè),可能有點(diǎn)影響佳吞。

(2)哪個(gè)時(shí)期的電影更受青睞




就這份榜單來講拱雏,20世紀(jì)的電影更多一些。

?(3)哪個(gè)地區(qū)的電影更受歡迎



從這個(gè)圖可以看到底扳,美國的電影最受歡迎铸抑,影響也最廣,畢竟好萊塢不是蓋的哈哈衷模。其次是日本電影鹊汛,香港電影蒲赂,英國,法國跟我們內(nèi)地的電影刁憋。我個(gè)人也很喜歡日本電影滥嘴,真的很有韻味。

這個(gè)分析我就做到這里啦至耻,第一次做第一次發(fā)表若皱,有很多不對的地方歡迎指出謝謝!

參考資料:https://mp.weixin.qq.com/s/mIL-p2q7Jp-dhkXkDIrdHQ

爬取網(wǎng)頁數(shù)據(jù)完整代碼:

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選擇器爬取電影標(biāo)題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')#按\來劃分內(nèi)容,向量變成了列表

total_data[1]<-NULL#爬下來的第一個(gè)元素是“豆瓣”泥耀,是不要的饺汹,要?jiǎng)h掉

total_data<-lapply(total_data,function(x){x[-c(1,2,4)]})#去除不要的內(nèi)容蛔添,只保留含有年份痰催,國家,電影類型的元素

total_data<-unlist(total_data)#將列表轉(zhuǎn)為向量再操作

???????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)

#將爬取的特征整合到一個(gè)數(shù)據(jù)框

???????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("動(dòng)畫"))

??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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迎瞧,一起剝皮案震驚了整個(gè)濱河市夸溶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凶硅,老刑警劉巖缝裁,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異足绅,居然都是意外死亡捷绑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門氢妈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粹污,“玉大人,你說我怎么就攤上這事首量∽撤裕” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵加缘,是天一觀的道長鸭叙。 經(jīng)常有香客問我,道長拣宏,這世上最難降的妖魔是什么沈贝? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮勋乾,結(jié)果婚禮上缀程,老公的妹妹穿的比我還像新娘搜吧。我一直安慰自己,他們只是感情好杨凑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布滤奈。 她就那樣靜靜地躺著,像睡著了一般撩满。 火紅的嫁衣襯著肌膚如雪蜒程。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天伺帘,我揣著相機(jī)與錄音昭躺,去河邊找鬼。 笑死伪嫁,一個(gè)胖子當(dāng)著我的面吹牛领炫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播张咳,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼帝洪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脚猾?” 一聲冷哼從身側(cè)響起葱峡,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎龙助,沒想到半個(gè)月后砰奕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡提鸟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年军援,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片称勋。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胸哥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铣缠,到底是詐尸還是另有隱情烘嘱,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布蝗蛙,位于F島的核電站蝇庭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捡硅。R本人自食惡果不足惜哮内,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧北发,春花似錦纹因、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至狱庇,卻和暖如春惊畏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背密任。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工颜启, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浪讳。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓缰盏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親淹遵。 傳聞我的和親對象是個(gè)殘疾皇子口猜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容