爬取網(wǎng)頁數(shù)據(jù):
1.安裝selectorGadget插件
這個(gè)插件是安裝在谷歌瀏覽器上的芝此,長這樣:
安裝方法:先下載這個(gè)插件,是一個(gè)文件:
然后點(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è),以下是我的代碼:
爬取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)