2016年9月22日 星期四

超簡單爬蟲教學-使用R軟體的rvest套件抓網站資料(基礎篇)

前言
以前覺得爬蟲就是要很會寫程式才能做的事,但這個暑假實習時需要用到爬蟲,不得不自己學,而我本身用R,網路看別人的分享文發現沒那麼難,不需要很會寫程式,簡易的爬蟲很快就可以上手了。多簡單呢?就算第一次用R也看得懂! 就讓我們看下去吧。
  這篇介紹四個部分:

1.安裝並執行rvest套件
2.安裝SelectorGadge CSS選擇器&選擇要爬取的網站內容
3.1開始寫R爬取你要的網頁資訊-爬新聞標題
3.2 想爬新聞標題的超連結
4.magrittr介紹-讓你程式碼更簡潔的好用套件

首先我們需要安裝爬蟲的套件 rvest
每行程式碼的說明會附在程式碼的#後面,複製是不會執行的。

1.安裝並執行rvest套件


install.packages('rvest')  #安裝rvest套件
library(rvest) #開啟rvest套件
2.安裝SelectorGadge CSS選擇器&選擇要爬取的網站內容
這是一個可以讓你點選你要爬網頁上甚麼資訊的好用小軟體,
 SelectorGadge安裝連結。
接著以自由電子報棒球版為選擇示範,


Step1.點選右上角的放大鏡SelectorGadge工具
Step2.我想要抓中間的主要新聞的標題,點一下標題會顯示成綠色和黃色的,表示你有選到
Step3.若不想要抓的右上角的熱門新聞,點一下就會顯示紅色,表示不會抓到。
Step4.看到下面的紅框處有程式碼,這就是很重要你等下會用到的程式碼,複製他。
Step5.要重新選擇,按Clear,要關掉選擇模式,按右邊的叉叉。


3.1開始寫R爬取你要的網頁資訊-爬新聞標題
title=read_html("http://sports.ltn.com.tw/baseball")   
#輸入你要爬取網頁的網址,爬取此網頁的html資訊 

title=html_nodes(title,".boxTitle .listA .list_title")   
#函數首先代入剛剛的網頁資訊,逗號後就是很重要的輸入你前面使用Selector複製的程式碼,他會從此網頁中篩選出剛剛你想要爬的新聞標題。 

title=html_text(title)   # 只篩選出文字
title=iconv(title,"UTF-8")  #若是文字出現亂碼,將格式改成可以辨識的形式
#來看看跑出的結果
title
 [1] "中職》鋒哥引退好風光 日韓敵人跨海祝福"              
 [2] "中職》向陳金鋒致敬 Lamigo宣布52號退休"              
 [3] "中職》發表引退感言 陳金鋒:我愛你們!"              
 [4] "中職》林哲瑄:好希望鋒哥把球打來我這邊"             
 [5] "中職 Live》陳鏞基本季第20轟   統一11:6擊敗兄弟"    
 [6] "中職Live》鋒哥引退賽完美落幕 犀牛13:9猿"           
 [7] "中職》鋒哥引退賽 4支0、3K抱憾收場"                  
 [8] "中職》高國輝最速百轟 桃園球場貢獻第2多"             
 [9] "MLB》向洋基球迷說拜拜 老爹:跪求噓爆我"             
[10] "中職》二壘審跑壘卡位「被觸殺」 統一獅雙盜壘離奇得分"
3.2 想爬新聞標題的超連結-
url=read_html("http://sports.ltn.com.tw/baseball") #爬取同一個網頁
url=html_nodes(url,".boxTitle .listA a")  
#這裡要注意,使用Selector選區塊時不要按在標題上,要點在旁邊,框框會比點在標題上面大喔,
#所以所選出來的程式碼和剛剛的不一樣。

url=html_attr(url,"href")  #選擇html頁面中的連結網址的部分(若使用剛剛爬標題的Selector碼會跑不出來,出現NA)
#看跑出的結果,現這頁20篇新聞的連結囉

[1] "news/breakingnews/1831833" "news/breakingnews/1831833" "news/breakingnews/1831860"
 [4] "news/breakingnews/1831860" "news/breakingnews/1831841" "news/breakingnews/1831841"
 [7] "news/breakingnews/1831835" "news/breakingnews/1831835" "news/breakingnews/1831825"
[10] "news/breakingnews/1831825" "news/breakingnews/1831791" "news/breakingnews/1831791"
[13] "news/breakingnews/1831800" "news/breakingnews/1831800" "news/breakingnews/1831768"
[16] "news/breakingnews/1831768" "news/breakingnews/1831750" "news/breakingnews/1831750"
[19] "news/breakingnews/1831618" "news/breakingnews/1831618"
4.magrittr介紹-讓你程式碼更簡潔的好用套件
覺得上面的程式碼太冗,需要指定參數(table,url)太多次嗎?
 #先安裝magrittr套件
install.packages('magrittr')
library(magrittr)
#爬棒球新聞標題-程式碼精簡版
title=read_html("http://sports.ltn.com.tw/baseball/") %>% 
html_nodes(".boxTitle .listA .list_title") %>% 
html_text() %>% iconv("UTF-8")

#只要在開頭指定title,後面幾行只要加上%>%,就不用再指定,
#中間的函數也不用輸入title,此套件會自動把前面的函數指定到下個函數的第一個參數中,
#如此程式碼就變得簡潔許多啦
----------------------------------------------------------------------------------------------------------------------

以上是最基本的爬蟲單個網頁,下一篇會介紹
1.如果想要一次爬很多頁怎麼做?
2.出現error
3.想爬其他attr屬性的網頁資訊



  寫這篇分享文主要是因為之前工作內容而需要爬蟲,從零開始花時間各方參考學習終於會一點技巧,所以分享心得給也想開始用R學爬蟲的人參考。



參考資料:
http://blog.bryanbigdata.com/2014/05/r.html
https://rpubs.com/SatoshiLiang/159348
https://stat4701.github.io/edav/2015/04/02/rvest_tutorial/
http://www.jerrynest.com/big-data-workshop-r-crawler/


沒有留言:

張貼留言