Google Apps Script 抓 RSS 資料

/

本篇要解決的問題

最近正在幫之前開發的 生活小幫手 把放在 GCP 上的 Node.js 功能陸續搬到 Google Apps Script 上,因為免費額過了開始收到繳費單 == ,想看搬上 GAS 後會不會讓使用額度是在免費以內。

在搬功能的時候,發現有幾個功能是要抓 RSS 的資料來發送,就查了一下 GAS 是否也可以抓 RSS / XML 的資料,查完後還發現真的有,而且實際使用後也抓成功了,就筆記成這篇。


選定要抓的 RSS 資料

本篇的練習我們找中央社的國際新聞 RSS,主要是因為最近看烏俄戰爭的新聞很常看他們家寫的。

他們的網站有一頁就是 RSS 列表:中央通訊社RSS服務

點擊「國際」後會打開這個網址:https://feeds.feedburner.com/rsscna/intworld

這個網址就是國際新聞的 RSS 網址,我們下一步在 Google Apps Script 上抓這個網址就行。


Google Apps Script 上抓 RSS 資料

在 Google 雲端硬碟上開好一份 Google Apps Script 的檔案(以下簡稱 GAS),命好檔名後便會自動儲存 GAS 檔案,我們再把上一步取得的 RSS 網址設成變數,然後命一個函式來準備抓資料:

// 中央社國際新聞 RSS 網址
const rss = 'https://feeds.feedburner.com/rsscna/intworld';
function getRSS() {
  // 準備來抓資料
}

GAS 上抓 RSS / XML 的文件在這:XML Service

文件上已經寫好了範例的程式碼:

這是廣告,點擊一下可以幫本站多個一點點的廣告收入,謝謝

function parseXml() {
  let url = 'https://blog.google/rss/';
  let xml = UrlFetchApp.fetch(url).getContentText();
  let document = XmlService.parse(xml);
  let root = document.getRootElement();
  let channel = root.getChild('channel');
  let items = channel.getChildren('item');
  items.forEach(item => {
    let title = item.getChild('title').getText();
    let categories = item.getChildren('category');
    let labels = categories.map(category => category.getText());
    console.log('%s (%s)', title, labels.join(', '));
  });
}

看了這段範例後才發現,蝦米!GAS 也支援 ES6 啦~~~

好的,看到範例,就可以之到基本抓出 RSS 資料,有三行是固定要有的:

let xml = UrlFetchApp.fetch(要抓的 RSS 網址).getContentText();
let document = XmlService.parse(xml);
let root = document.getRootElement();

之後就是看 RSS 上的 XML 資料格式,用 root.getChild(欄位名稱) 去抓取就行。

我們先在中央社的 RSS 頁面上點右鍵看一下原始碼,會看到這樣:

可以看到結構是 <channel> 裡面包著 <item><item> 就是我們要抓取的每一則新聞,包含標題、連結、日期、描述。其實 RSS 有一套撰寫規則,大家可以在 W3school 上觀看說明。

這邊 August 直接修改 GAS 文件上的範例程式碼,我們取第一個 <item> 的資料就好:

const rss = 'https://feeds.feedburner.com/rsscna/intworld';
function getRSS() {
  let xml = UrlFetchApp.fetch(rss).getContentText();
  let document = XmlService.parse(xml);
  let root = document.getRootElement();
  let channel = root.getChild('channel');
  let item = channel.getChildren('item')[0];
  let title = item.getChild('title').getText();
  let link = item.getChild('link').getText();
  let pubDate = item.getChild('pubDate').getText();
  console.log(title);
  console.log(link);
  console.log(pubDate);
}

寫好程式碼後,我們按上方選單的「執行」,會看到以下輸出:

執行 getRSS 看輸出
執行 getRSS 看輸出

鏘鏘~有看到輸出結果,就代表我們資料抓取成功啦。

GAS 的文件上有各個參數的說明,想了解更多的朋友請自行觀看啦:XML Service

這是廣告,點擊一下可以幫本站多個一點點的廣告收入,謝謝

Summary
Google Apps Script 抓 RSS 資料
Article Name
Google Apps Script 抓 RSS 資料
Description
本篇大綱:本篇要解決的問題。選定要抓的 RSS 資料。Google Apps Script 上抓 RSS 資料。
Augustus
Let's Write
Let's Write
https://letswrite.tw/wp-content/uploads/2020/08/logo_512.jpg

隨選筆記文

Front-End

Instagram oEmbed 嵌入 IG 貼文

WordPress

WordPress:埋 Google AdSense 廣告

Google Maps

Google Maps API 學習筆記 – 3:用熱圖 / Heat map 製作全台 12 小時雨量分佈圖

Front-End

第 100 篇:起點、轉折、then()

Analytics Google

GA 自訂維度的應用 分類之下的文章成效

Front-End

從使用者輸入網址,到瀏覽器呈現出來,經過了哪些過程?

Vue

Nuxt.js 一些好用的設定

Bot LINE

LINE Bot:用 Google Apps Script 建立簡易網站監測機器人

Front-End Vue

用 Vue.js 製作圖片版 EDM 生成器

Bot LINE

用 LINE Bot API 建立 LINE@ 圖文選單

以下是留言,但關於留言的部份必需先讓你們知道:

本站的文章都是 August 因為覺得有趣,才會實作並整理成筆記文而後進行發表。

如果留言是希望把 Demo 改成「你想要」的樣子,或是把功能改成「符合你需求」的樣子,

Sorry~ 除非那修改是 August 也有興趣的,不然不會幫你們寫程式去面對工作或是交作業。

未來這類的留言不會再主動回覆。😎

另外,公開信箱是為了讓金流驗證用,

因為之前遇過幾次回信協助解決問題後,對方卻一聲謝謝也沒有,就這樣拿去幫工作交差。

因此決定不再回覆信件,有疑問就利用留言功能囉。