爬取網(wǎng)頁數(shù)據(jù):
1.安裝selectorGadget插件
這個插件是安裝在谷歌瀏覽器上的,長這樣:

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

然后點擊谷歌瀏覽器

這里,更多工具,擴展程序,把那個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)行字符串切割直到選擇到電影類型的第一個,以下是我的代碼:










爬取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)