[筆記]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