2016 年初,現在用 R 做爬蟲大概都會從 rvest 這個套件開始。

這篇主要的對象是給:

如果有困難可在本篇下面留言,或是發訊息到 Taiwan R User Group 粉絲團

安裝 rvest 套件

我假設讀者已經從其他來源知道怎麼安裝 R核心 還有 Rstudio 。我們只要安裝 rvest 套件。

install.packages("rvest")

需求簡介

以下程式碼以公視新聞的政治新聞為例。最常見的爬蟲需求大概是這種列表頁:列表頁提供所有內容頁的連結,一般使用者需要所有內容頁的內容。然後再去爬列表頁裡面所有的內容頁的內容。

列表頁圖示

內容頁圖示

找到正確的 css 路徑

右鍵點擊標題,從清單中點選「檢查」,可看到如下畫面。一般來說,每樣網頁上漂亮的內容都是對應到下面的「 html 」文件的其中一個地方。例如:從圖可見同樣的標題文字出現在 a 標籤中。

爬蟲程式只看得懂 html 檔案,所以我們要用 css 路徑告訴程式怎麼抓到我們要的路徑。我們用下圖介紹一些 html 與 css 基本概念:

用 css 路徑定位的話,我們可以用幾種方式告訴程式我們要範例中的 a 標籤

方便找 css 路徑的方式: Selector Gadget

我們可以用 Selector Gadget 輕易找到我們要的 css 路徑

Chrome 瀏覽器版 Selector Gadget

官網 有個簡單的影片,不會英文也看得懂

操作方式很簡單,點想要的,點掉不想要的。最後路徑就會列在下面:

Selector Gadget 告訴我們想要的連結在 .list-news-title a

使用套件

# 引入套件
library(rvest)
## Loading required package: xml2
# 把網址餵給 read_html
read_html("http://news.pts.org.tw/list/1")
## {xml_document}
## <html>
## [1] <head>\n    <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compat ...
## [2] <body><div id="fb-root"/>\n  <script><![CDATA[\n    (function(d, s,  ...

read_html 會回傳一個 xml_document 物件。這重要在哪呢?使用這些函數時要注意函數要吃的 「輸入 input 」是什麼, 「輸出 output 」是什麼。這樣才知道怎麼樣把不同的輸入輸出接在一起。

doc <- read_html("http://news.pts.org.tw/list/1") # 把網頁先存在一個變數裡,不用每次都連線造訪
doc %>% html_nodes(".list-news-title a") # 取得 css 路徑下的所有節點
## {xml_nodeset (20)}
##  [1] <a href="http://news.pts.org.tw/article/318430">陸方稱貨貿已談完 是否簽署在我方</a>
##  [2] <a href="http://news.pts.org.tw/article/318432">蔡:當選總統 證明台灣邁向性別平等</a>
##  [3] <a href="http://news.pts.org.tw/article/318403">蔡英文:就職總統 致力平等性別友善</a>
##  [4] <a href="http://news.pts.org.tw/article/318367">馬出訪拉美"久安專案" 外長今立院報告 ...
##  [5] <a href="http://news.pts.org.tw/article/318378">台北文創被爆摻廢爐碴 柯:先確認安全</a>
##  [6] <a href="http://news.pts.org.tw/article/318379">排案順序喬不攏 內政委員會開天窗</a>
##  [7] <a href="http://news.pts.org.tw/article/318342">藍委提減稅法案 長照.看球賽可抵稅</a>
##  [8] <a href="http://news.pts.org.tw/article/318343">習近平:對台方針 不因台灣政局改變</a>
##  [9] <a href="http://news.pts.org.tw/article/318330">藍委提減稅法案 長照.看球賽可抵稅</a>
## [10] <a href="http://news.pts.org.tw/article/318313">習近平:對台方針 不因台灣政局改變</a>
## [11] <a href="http://news.pts.org.tw/article/318314">兩岸協議監督條例 三版本付委審查</a>
## [12] <a href="http://news.pts.org.tw/article/318293">談兩岸 蔡:維持現狀符合多數人主張</a>
## [13] <a href="http://news.pts.org.tw/article/318294">新政府"類主權基金" 投資新興產業</a>
## [14] <a href="http://news.pts.org.tw/article/318298">西藏抗暴57週年遊行 北巿千人上街</a>
## [15] <a href="http://news.pts.org.tw/article/318301">柯文哲計畫下週訪美 浩鼎高層隨行</a>
## [16] <a href="http://news.pts.org.tw/article/318302">兩岸協議監督條例 2版本定公務員條款</a>
## [17] <a href="http://news.pts.org.tw/article/318281">人大會議報告 李克強:堅持九二共識</a>
## [18] <a href="http://news.pts.org.tw/article/318283">中國兩會召開之際 美航母開進南海</a>
## [19] <a href="http://news.pts.org.tw/article/318272">柯文哲計畫下週訪美 浩鼎高層隨行</a>
## [20] <a href="http://news.pts.org.tw/article/318273">兩岸協議監督條例 2版本定公務員條款</a>

注意這裡使用了 %>% 這個符號,這是個好用的東西,代表上一個函數的「輸出」,成為下一個函數的第一個參數。但如果讀者有要自行讀文件的話,再來理解他即可。

doc %>% html_nodes(".list-news-title a") %>% html_attr("href") # 取得 href 屬性
##  [1] "http://news.pts.org.tw/article/318430"
##  [2] "http://news.pts.org.tw/article/318432"
##  [3] "http://news.pts.org.tw/article/318403"
##  [4] "http://news.pts.org.tw/article/318367"
##  [5] "http://news.pts.org.tw/article/318378"
##  [6] "http://news.pts.org.tw/article/318379"
##  [7] "http://news.pts.org.tw/article/318342"
##  [8] "http://news.pts.org.tw/article/318343"
##  [9] "http://news.pts.org.tw/article/318330"
## [10] "http://news.pts.org.tw/article/318313"
## [11] "http://news.pts.org.tw/article/318314"
## [12] "http://news.pts.org.tw/article/318293"
## [13] "http://news.pts.org.tw/article/318294"
## [14] "http://news.pts.org.tw/article/318298"
## [15] "http://news.pts.org.tw/article/318301"
## [16] "http://news.pts.org.tw/article/318302"
## [17] "http://news.pts.org.tw/article/318281"
## [18] "http://news.pts.org.tw/article/318283"
## [19] "http://news.pts.org.tw/article/318272"
## [20] "http://news.pts.org.tw/article/318273"
doc %>% html_nodes(".list-news-title a") %>% html_text() # 取得文字
##  [1] "陸方稱貨貿已談完 是否簽署在我方"      
##  [2] "蔡:當選總統 證明台灣邁向性別平等"     
##  [3] "蔡英文:就職總統 致力平等性別友善"     
##  [4] "馬出訪拉美\"久安專案\" 外長今立院報告"
##  [5] "台北文創被爆摻廢爐碴 柯:先確認安全"   
##  [6] "排案順序喬不攏 內政委員會開天窗"      
##  [7] "藍委提減稅法案 長照.看球賽可抵稅"     
##  [8] "習近平:對台方針 不因台灣政局改變"     
##  [9] "藍委提減稅法案 長照.看球賽可抵稅"     
## [10] "習近平:對台方針 不因台灣政局改變"     
## [11] "兩岸協議監督條例 三版本付委審查"      
## [12] "談兩岸 蔡:維持現狀符合多數人主張"     
## [13] "新政府\"類主權基金\" 投資新興產業"    
## [14] "西藏抗暴57週年遊行 北巿千人上街"      
## [15] "柯文哲計畫下週訪美 浩鼎高層隨行"      
## [16] "兩岸協議監督條例 2版本定公務員條款"   
## [17] "人大會議報告 李克強:堅持九二共識"     
## [18] "中國兩會召開之際 美航母開進南海"      
## [19] "柯文哲計畫下週訪美 浩鼎高層隨行"      
## [20] "兩岸協議監督條例 2版本定公務員條款"

知道這些基本技巧和概念之後,即可從取得的連結配合 for 迴圈去取得內容頁裡的文字