1. 程式人生 > >[筆記]R語言爬蟲入門——豆瓣新片資料爬取

[筆記]R語言爬蟲入門——豆瓣新片資料爬取

工具準備

chrome瀏覽器+SelectorGadget外掛。

SelectorGadget外掛:可以從這裡(http://selectorgadget.com)訪問和下載Selector Gadge的擴充套件程式。請確保跟隨該網站上的指示來安裝這個擴充套件程式。我已經完成了這一步,現在正在使用谷歌chrome,並且可以通過chrome右上角的擴充套件欄上的這個圖示使用它,選擇網站所需要的部分就可以獲得相關標籤。

選擇網站:第一次做,選了一個數據很少但很詳細的網站@^@

https://movie.douban.com/chart

下載並載入所需要的包

library(xml2)
library(rvest)

獲取資料

url <- 'https://movie.douban.com/chart'
webpage <- read_html(url)
#獲取網頁資料
name_data_html<-html_nodes(webpage,'.pl2 a')
name_data<-html_text(name_data_html)
> name_data
 [1] "\n                        昆池巖\n                        / 鬼病院:靈異直播(臺) / 瘋人院逐個捉(港)\n                    "          
 [2] "\n                        現在去見你\n                        / 雨你再次相遇(臺) / 現在,很想見你\n                    "            
 [3] "\n                        血觀音\n                        / 修羅花 / The Bold, the Corrupt, and the Beautiful\n                    "
 [4] "\n                        黑豹\n                    "                                                                               
 [5] "\n                        紅雀\n                        / 紅雀特工(港) / 紅色麻雀\n                    "                            
 [6] "\n                        忍者蝙蝠俠\n                        / ニンジャバットマン\n                    "                           
 [7] "\n                        戀愛迴旋\n                        / 混合雙打 / 乒乓情人夢(港)\n                    "                      
 [8] "\n                        比得兔\n                        / 彼得兔\n                    "                                           
 [9] "\n                        極惡非道3\n                        / 極惡非道3:最終章 / 極惡非道最終章(臺)\n                    "        
[10] "\n                        憑空而來\n                        / 烈愛天堂(臺) / 公義暗角(港)\n

得到的name_data資料如上,需要進一步處理。

> name_data<-strsplit(name_data,split = '\n')
> name_data
[[1]]
[1] ""                                                                 
[2] "                        昆池巖"                                   
[3] "                        / 鬼病院:靈異直播(臺) / 瘋人院逐個捉(港)"
[4] "                    "                                             

[[2]]
[1] ""                                                           
[2] "                        現在去見你"                         
[3] "                        / 雨你再次相遇(臺) / 現在,很想見你"
[4] "                    "                                       
……
#所需要的title都在第二個元素,單獨獲取第二個元素後進行進一步處理。
> name_data<-sapply(name_data,function(x) x[2])
> name_data
 [1] "                        昆池巖"     "                        現在去見你"
 [3] "                        血觀音"     "                        黑豹"      
 [5] "                        紅雀"       "                        忍者蝙蝠俠"
 [7] "                        戀愛迴旋"   "                        比得兔"    
 [9] "                        極惡非道3"  "                        憑空而來"  
> name_data<-gsub(' ','',name_data)    #刪除空格
 [1] "昆池巖"     "現在去見你" "血觀音"     "黑豹"       "紅雀"       "忍者蝙蝠俠"
 [7] "戀愛迴旋"   "比得兔"     "極惡非道3"  "憑空而來"  

採取同樣的方法獲取評分資料:

score_data_html<-html_nodes(webpage,'.rating_nums')
score_data<-html_text(score_data_html)
score_data<-as.numeric(score_data)

評價人數:

count_data_html<-html_nodes(webpage,'.star .pl')
count_data_html<-html_nodes(webpage,'.star .pl')
#下面是簡單粗暴的資料處理部分@^@
count_data<-strsplit(count_data,split = '人')
count_data<-sapply(count_data,function(x) x[1])
count_data<-gsub("\\(","",count_data)
#括號需要用"\\"轉義

感覺這裡也可以用正則,但是我正則不過關

字串處理函式也可以用,substr啥的,這裡我也還不過關QAQ

然後就是比較麻煩的部分了,中間的那一長串資訊

同上獲取,然後處理,得到的結果如下:

> info_data
[[1]]
 [1] "2018-03-28(韓國) "       " 魏河俊 "                " 樸智賢 "               
 [4] " 吳雅妍 "                " 樸成勳 "                " 文藝媛 "               
 [7] " 劉帝允 "                " 李丞旭 "                " 韓國 "                 
[10] " 鄭凡植 "                " 94分鐘 "                " 昆池巖 "               
[13] " 驚悚 "                  " 恐怖 "                  " 鄭凡植 Baum-sik Jeong "
[16] " 韓語"                  


[[2]]
 [1] "2018-03-14(韓國) "          " 蘇志燮 "                  
 [3] " 孫藝珍 "                   " 金智煥 "                  
 [5] " 金賢秀 "                   " 李有鎮 "                  
 [7] " 高昌錫 "                   " 李俊赫 "                  
 [9] " 孫雲恩 "                   " 裴侑藍 "                  
[11] " 韓國 "                     " 李章焄 "                  
[13] " 132分鐘 "                  " 現在去見你 "              
[15] " 劇情 "                     " 愛情 "                    
[17] " 奇幻 "                     " 李章焄 Jang-Hoon Lee "    
[19] " 姜秀貞 Soo-Jine Kang "     " 市川拓司 Takuji Ichikawa "
[21] " 韓語"                     


[[3]]
 [1] "2017-10-15(釜山電影節) " " 2017-11-24(臺灣) "      " 惠英紅 "               
 [4] " 吳可熙 "                " 文淇 "                  " 柯佳嬿 "               
 [7] " 陳莎莉 "                " 丁強 "                  " 劉尚謙 "               
[10] " 林志儒 "                " 王月 "                  " 溫貞菱 "               
[13] " 王偉六 "                " 陳珮騏 "                " 尹昭德  "              
[16] " 大久保麻梨子 "          " 巫書維 "                " 顏毓麟 "               
[19] " 劉越逖 "                " 傅子純 "                " 陳武康 "               
[22] " 施名帥 "                " 秀蘭瑪雅..."           

……  

嗯。。同樣是字串處理不過關,我無法準確的將上映時間和主演分開,就只提取了上映時間的資訊,處理方式和電影名相同。

處理後的資訊如下:

> time_data
 [1] "2018-03-28(韓國) "         "2018-03-14(韓國) "        
 [3] "2017-10-15(釜山電影節) "   "2018-02-16(美國) "        
 [5] "2018-03-02(美國) "         "2018-04-24(美國網路) "    
 [7] "2017-10-21(日本) "         "2018-02-09(美國) "        

 [9] "2017-09-09(威尼斯電影節) " "2017-05-26(戛納電影節) "  

最後是將以上所有資訊整合到表中:

movie<-data.frame(title=title_data,score=score_data,time=time_data,count=count_data)

等我有時間了再把主演加上來!!

我覺得time那部分也可以怎麼改進一下ORZ

遇到的問題總結:

正則表示式匹配!!

字串處理!!

列表的讀取和錄入

sapply函式

自定義function