股票分析不求人 (5): 用 Google 試算表抓取網頁資料

前幾篇簡介了如何以 Google 試算表內置的功能查詢股價及指數。近來收到數個讀者詢問,問題不約而同和某些股票市場有關。這些股票市場的數據不能從 Google 試算表取得,可能因為 Google 與這些交易所的協議限制吧。

在此情況下,可以使用 Google 試算表的其他功能,直接從網頁擷取數據。

ImportHTML 函式

ImportHTML 函式可以用來從網頁取得清單或表格內容。對於那些以表格形式展示的財經資訊,這個功能就最適合。例如,以下網站以表格形式列出上證指數的歷史價格。

https://hk.investing.com/indices/shanghai-composite-historical-data

在 Google 試算表裡,可用以下函式抓取整個表格的內容:

=importhtml(“https://hk.investing.com/indices/shanghai-composite-historical-data”,”table”,2)

其中,第一個參數是網址,以頭尾以”號包圍。第二個參數是要指明抓取的是清單還是表格。清單是 “list” ,表格則用 “table” 。最後一個參數,指定那個清單或表格在網頁裡的索引號,例如第一個表格就是 1 ,最二個就是 2 ,如此類推。

那麼,要怎樣才知道想抓取的表格是第幾個呢?最簡單的方法是由 1 開始逐個測試。另外,亦可查閱網頁的原始碼,或者使用瀏覽器的插件查詢。

輸入函式後,結果如下圖。你可以利用抓取到的數據再製作圖表。

ImportHTML 範例

ImportXML 函式

ImportXML 函式可以用來從網頁取得指定位置的內容。例如剛才提及的網站,內有即時上證指數價格。我們可以用以下函式,直接取得該項資料:

=importxml(“https://hk.investing.com/indices/shanghai-composite-historical-data”,”//span[@class=’arial_26 inlineblock pid-40820-last‘]”)

第一個參數就是網址,不難理解。第二個參數,是用來指定網頁中的哪一個部份。例如即時上證指數價格,在網頁原始碼裡是這一行:

<span class=”arial_26 inlineblock pid-40820-last” id=”last_last” dir=”ltr”>2,605.81</span>

在上述函式裡,第二個參數的 spanarial_26 inlineblock pid-40820-last,就是取自這一行原始碼。

又例如這個價格的標題為 “上證指數 (SSEC)”,原始碼如下:

<h1 class=”float_lang_base_1 relativeAttr” dir=”ltr”>上證指數 (SSEC) </h1>

把以上函式裡藍色和紅色的部份換成 h1float_lang_base_1 relativeAttr,便可以擷取這項資訊,即是:

=importxml(“https://hk.investing.com/indices/shanghai-composite-historical-data&#8221;,”//h1[@class=’float_lang_base_1 relativeAttr‘]”)

要在網頁裡找出合用的原始碼,不需要把原始碼從頭到尾看一遍。筆者習慣使用的 Chrome 瀏覽器,有一個功能可以快速找出網頁特定部份的原始碼。

首先選取你想抓取的資料,然後右按,選擇檢查 (Inspect),在畫面右會彈出網頁的原始碼,而你選取的資料的相關原始碼亦已被反白標示。再右按這段程式碼,選 Copy > Copy XPath,該程式碼就會複製到剪貼簿。

Inspect Element

利用以上兩個函式,就可以輕鬆取得大部份網頁裡的資料。Google 試算表裡還有其他 Import 系列的函式,有機會再談。

有一點必須留意,官方文件說這些函式只會每小時更新數據一次,所以並不適合用來實時擷取不斷更新的資料。但用來做每天收市分析,就綽綽有餘。

筆者已製作一個範例檔案,如欲索取,請到筆者的 Facebook 專頁讚好,然後傳訊息,範例的網址將於稍後奉上。日後有關投資分析的文章,亦會在專頁發佈。如有興趣閱讀更多本系列的文章,請讚好專頁以便收到新文章通知。

← Previous post

Next post →

3 Comments

  1. =importhtml(“https://hk.investing.com/indices/shanghai-composite-historical-data”,”table”,2)

    請問上面這行指令已抓不到網頁數據 是需要改甚麼地方?

    • 萬分抱歉,不知何解一直收不到系統通知,沒有發現你的留言。
      這是Google試算表的字符問題。把所有「“」轉成「”」便沒有問題了。

  2. 請問之前捉取台股的財務資料時會分別排列得很好,現在捉取時變成全部都擠在同一儲存格裡,請教要如何改善 ? 謝謝
    =importhtml(“http://jsjustweb.jihsun.com.tw/z/zc/zcr/zcr_2330.djhtm”,”table”,2)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *