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

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

1.安裝selectorGadget插件

這個插件是安裝在谷歌瀏覽器上的,長這樣:

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


1

然后點擊谷歌瀏覽器

這里,更多工具,擴展程序,把那個crx文件拖進(jìn)去就好了。

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

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


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

Rank:電影排名(1-250)

Title:電影標(biāo)題

Description:電影描述

Year:電影年份

Country:國家或地區(qū)

Genre:電影類型

Rating:用戶打分

這個一個包含所有字段的頁面截圖


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


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

?

步驟3:當(dāng)您知道CSS選擇器已包含了排名順序之后,您可以使用這個簡單的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部分


有點難度,因為不能直接定位到類型那里,我先把整個爬取下看看。


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



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


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


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




選擇第一個作為電影類型?



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

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

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

這個第一頁的網(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ù)后驗證時發(fā)現(xiàn)description部分,year部分,gener部分還有country部分有錯誤。


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

修改:


而年份,國家和劇情出現(xiàn)錯誤是因為排行78的電影那里出現(xiàn)錯誤:


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


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



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


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


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



可以看到劇情類電影大受歡迎,其次是喜劇,動作,犯罪跟動畫。其實網(wǎng)頁數(shù)據(jù)顯示電影類型都多個,但是我只選擇了第一個,可能有點影響。

(2)哪個時期的電影更受青睞




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

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



從這個圖可以看到,美國的電影最受歡迎,影響也最廣,畢竟好萊塢不是蓋的哈哈。其次是日本電影,香港電影,英國,法國跟我們內(nèi)地的電影。我個人也很喜歡日本電影,真的很有韻味。

這個分析我就做到這里啦,第一次做第一次發(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#爬下來的第一個元素是“豆瓣”,是不要的,要刪掉

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)

#將爬取的特征整合到一個數(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("動畫"))

??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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容