這裡介紹如何運用 R 的 rvest 套件來擷取任何的網頁資料,直接將資料從網頁中萃取出來,匯入 R 中進行後續的處理。

在巨量資料(big data)與物聯網(IOT)的時代,有相當多的資料都是透過網路來取得的,由於資料量日益增加,對於資料分析者而言,如何使用程式將網頁中大量的資料自動匯入是很重要的。

許多程式語言都有網頁擷取的工具可以使用,R 語言也不例外,以下我們要介紹如何使用 R 的 rvest 套件擷取任意的網頁資料,並將大量結構化的資料直接匯入 R 中,讓資料分析者可以省去手動整理資料的時間。

網頁資料結構

首先我們要先簡單介紹 HTML 的資料結構,以及 CSS 選擇器(selector)的使用方式,有了這些觀念才能精準地抓出網頁中的資料。

HTML 資料基本觀念

目前網路上絕大部分的網頁都是以 HTML 格式來呈現的,因此若想要抓取其中的資料,就必須對 HTML 的格式有初步的了解,這裡簡單介紹基本 HTML 的資料格式與概念,有了基本的概念才能做進一步的資料擷取。若您已經熟悉 HTML 的語法,可以跳過這一段的說明。

以下是一個簡單的 HTML 網頁原始程式碼。

<html>
  <head>
    <title>網頁標題</title>
  </head>
  <body>
    <div class="container">
      <p>網頁內容</p>
      <p>
        <ul>
          <li>foo</li>
          <li>bar</li>
        </ul>
      </p>
    </div>
  </body>
</html>

一個 HTML 網頁中含有各種網頁的元素(elements),每一個元素通常都會使用 HTML 的標籤(tags)前後包起來,例如:

<p>網頁內容</p>

而大部分的 HTML 元素都是以巢狀的資料結構存在的,也就是說一個元素中可能還會包含其他很多不同的元素,例如:

<ul>
  <li>foo</li>
  <li>bar</li>
</ul>

這樣的狀況就是一個 <ul> 元素中還包含兩個 <li> 元素。

基本上每一個 HTML 網頁中的資料都是以這樣的階層式規則來呈現的,當要抓取網頁中的資料時,只要明確得知資料在這個階層結構中的位置,就可以很容易的將資料以程式自動取出。

若只是要抓取網頁資料,僅需了解 HTML 基本的朝狀結構概念即可,網頁中的每個 HTML 標籤都有不同的意義,關於細部的內容請自行參考網路上的教學。

CSS 選擇器(Selector)

CSS 選擇器(Selector)是 CSS 用來指定網頁元素的一種語法,假設一個 HTML 網頁中有一個 <p> 元素:

<p class="key" id="principal"> ... </p>

若要使用 CSS 選擇器來選擇這個元素的話,可以直接寫標籤名稱:

p { /* CSS 設定值 ... */ }

這樣寫的意思就是取出所有網頁 HTML 中所有的 <p> 元素,但是這樣可能會連同其它不需要的 <p> 元素也一起選取進來,如果要更精準的選取元素,可以加上 class 屬性的資訊:

p.key { /* CSS 設定值 ... */ }

這樣就會選取網頁中 class 屬性為 key<p> 元素,另外也可以單獨使用 class 屬性來篩選:

.key { /* CSS 設定值 ... */ }

這樣就會選取網頁中 class 屬性為 key 的所有元素。最精準的方式則是使用 id 屬性:

#principal { /* CSS 設定值 ... */ }

這樣就會選取網頁中 id 屬性為 principal 的元素。

對於比較複雜的結構,也可以用階層式的 CSS 選擇器來指定,假設 HTML 程式碼為:

<div class="foo">
  <p>
    <span class="bar"> ... </span>
  </p>
</div>

若要選擇此結構下最內層的 <span> 元素,可以使用:

div.foo p span.bar { /* CSS 設定值 ... */ }

以上就是基本的 HTML 結構與 CSS 選擇器的概念,對於這些技術有基本的認識之後,就可以開始進行網頁資料的擷取工作了。