jumi

不需程式設計!用 Google Sheet 打造屬於你的資料爬蟲

網路資料收集機器人

今天我們來講用 Google sheet 打造資料爬蟲。

現今我們可以從網路上找到成千上萬的資料,不管是新聞主題、天氣、股票資訊等。但所有我們關心的議題,可能分散在各個網站,且資料量巨大。使用手動查找、複製、貼上,是很耗時間。另一個情況是,我們想要定期觀查一個資料,例如某個商品的價格變化等,你就會很希望有隻小精靈幫你把資料拉回來,做存檔或其它處理,方便你進一步的分析。

但對於非軟體工程師來說來說,要寫爬蟲程式的話就很心累了!你需要學習 Python 或是其它程式語言,同時要有伺服器資源,來部署寫好的爬蟲。

Google 試算表提供了很好的替代方案,它不需要寫程式就提供了多種抓取資料的方法,且因為試算表原本的特性,易資料再處理、支援多種設備等,而且不用再額外購買雲端運算資源。

外部引用函數:IMPORT 系列函數

Google 試算表提供了四種外部引用的函數:IMPORTHTML、IMPORTDATA、IMPORTFEED、IMPORTXML ,個別有不同的使用時機,我們再一一來看。

IMPORTHTML

IMPORTHTML 函數會直接從 HTML 頁面提取 表格 ( Table )和列表 ( List ) 到你的工作表中。這可以省下很多大量表格資料的複製貼上的動作。表格屬性通常在網頁上會長這樣:

世界國家人口數

我們可以用 IMPORTHTML 在 HTML 頁面中拉出表格和列表

  • URL - 想爬取資料的網站連結
  • QUERY - 查詢的類型是 "Table" 或 "List"
  • INDEX - 頁面中可能有多組 Table 或 List ,可以指定是第幾個
  • Language_Code - 頁面的語言代碼若有歧異,可指定特定語言代碼去解析資料。

範例 - 使用 IMPORTHTML 抓取維基百科各國人口資料

結果

IMPORTHTML 範例

IMPORTDATA

IMPORTDATA 函數可以直接匯入 CSV 資料,尤其是一些政府網站的公開資料,會用 csv 來提供資料,或者是也有人會把 Google Sheet 公開發佈,那也會是 CSV 格式,可以用 IMPORTDATA 來拉取資料。

語法

  • URL - 想爬取資料的網站連結

範例 - 使用 IMPORTDATA 抓取台中市停車位資訊

結果

IMPORTDATA 範例

IMPORTFEED

IMPORTFEED 函數可以拉取 RSS 或是 Atom 格式的資料,特別適合於收集部落格、新聞網站或是其它會推送 RSS 的站台

語法

  • URL - 想爬取資料的網站連結
  • QUERY - 想要匯入的 feed 資料類型。選項包括 "items", "feed", "title", "summary" 等。預設是 "items" 。
  • HEADERS - 布林值,指定匯入的資料是否包含標頭,預設是 FALSE
  • NUM_ITEMS - 指定匯入的項目數量,預設為所有

範例 - 使用 IMPORTFEED 抓取 iTunes 最受歡迎的電影

結果

IMPORTFEED 範例

IMPORTXML

IMPORTFEED 函數是最通用函數,可以解析多種結構化資料類型的資料,包括 XML、HTML、CSV、TSV 和 RSS 以及 ATOM 。現在很多網站不是用 table 或 list 來作資料集,而是直接用 div 來做表格,所以就要用 IMPORTXML 來作元素的選擇。

語法

  • URL - 想爬取資料的網站連結
  • XPath - XML 節點的查詢語法,有空再來寫一篇,可先參考 https://www.w3school.com.cn/xpath/xpath_syntax.asp
  • Language_Code - 頁面的語言代碼若有歧異,可指定特定語言代碼去解析資料。

舉個例子,下面是個房屋網站的資料,我們可以使用 IMPORTXML 抓取實價登錄資料

資料源-房屋網站

右鍵「檢查」,發現裡頭是 <div> ,所以沒法用 IMPORTHTML 處理

資料源-房屋網站原始碼示意

這時,我們改用 IMPORTXML

這段 XPath 的意思是要抓取 class='trade-obj-card-web' 的 div ,底下的所有資料

結果

IMPORTXML 範例

注意事項

Google 試算表 引用外部資料是不是太方便了?但使用上有一些事情要注意

1. IMPORT 函數執行限制

  • 要預留足夠的展開空間
    • 資料引用會拿到不特定數量的資料,若有其它資料會展開失敗。
  • 一個試算表的 IMPORT 系列函式限制
    • 原本有明確限制 50 個引用,但後來拿掉這個限制,但仍可能會發生 IMPORT 使用數量過多的異常,估計可能是用系統運算時間之類來做限制。
    • 即使沒有 50 個引用限制,它仍會造成大量的系統資源消耗,視窗開啟速度也會變慢,務必減少它的使用。如果有興趣的話請留言,我專門來寫一篇關於公式優化。
  • 每日 20,000 次的呼叫 URL 額度
    • 如果你是 Workspace ,每日的呼叫額度是 100,000 次
    • 這是整個帳戶的配額,不是指單檔。所以,雖然額度不低,但還是建議慎重使用。
    • 配額算在擁有者身上,如果檔案有編輯者在修改公式,可能會影響擁有者的額度

2. 更新頻率

  • 在檔案開啟的時候,IMPORTDATA、IMPORTHTML 和 IMPORTXML 會每小時更新。
  • 重新整理或是開啟檔案,並不會引發 IMPORT 資料更新。
    • 若要強迫更新,可以增加 URL 的引數,如 =importdata("url"&A1),把 A1 做成一個下拉,放 "#A1" | "#A2" 。需要強制刷新時就改 A1 的數值,讓整串 URL 改變,來觸發資料更新。

3. 來源網站的限制

  • 配合來源資料的更新週期。我們都希望資料是最新的,但如果來源網站的資料沒有更新,重複拉取資料也只是徒資網路傳輸的消耗。例如每月更新一次的資料,每天或每小時去拉,實質上沒意議。所以應該了解來源資料的更新週期,正確地設定試算表 IMPORT 函數的更新週期,避免不必要的重複資料拉取。
  • 有些網站的使用條款中可能明確禁止自動化爬取資料,或者限制資料的使用方式,例如禁止商業使用。仔細閱讀並遵循網站的使用條款,可以避免爭議。
  • 合理地設定資料抓取頻率和範圍,避免對網站伺服器造成過大負擔。這不只是道德考量,也是避免去觸發網站的防爬機制。

總結

使用 Google 試算表進行網路資料收集,是一種既簡便又強大的方法,既不用寫程式,也不需要額外的網路運算資源。最重要的是,它可以結合試算表既有的資料處理方式,對資料進行加工,例如:

  • IMPORTHTML( "https://tw.stock.yahoo.com/quote/" & A2 & ".TW" )
  • FILTER( IMPORTHTML( ... ) )

而這些自動化收集的資料還能再加工成圖表,你就擁有一個即時的儀表板了!

當然,所有工具的使用還是要遵循相關的法律限制,但只要在使用時保持謹慎,你就能用低成本又高效的方式,打造自己的資料倉庫。

希望這篇文對你有啟發!

你有試過使用 Google 試算表來抓取網路資料嗎?

你有嘗試過將抓取到的資料進行分析或可視化嗎?

在工作或個人專案中,哪些場景可以應用這些函數來提高效率?

歡迎訂閱我的電子報,持續關注我的 Google Workspace 高效工作術。