在本篇文章中,將帶大家一同瞭解如何使用 n8n 這套強大的自動化工具,完成一個「擷取 Yahoo 新聞並寫入資料庫」的自動化流程。此工作流程的目標如下:
- 取得 Yahoo 綜合新聞與政治新聞
- 擷取新聞列表中的每篇新聞連結,並深入抓取內文、JSON-LD 結構化資料
- 將所有擷取到的資料插入 MongoDB
以下就讓我們拆解這個工作流程中的各個節點,並簡單介紹其設計思路。
1. 觸發節點(Manual Trigger)
- 名稱:When clicking ‘Test workflow’
- 類型:
n8n-nodes-base.manualTrigger
- 作用:工作流程的第一個節點,方便在開發測試時手動觸發執行。只要點擊 n8n 介面中的「Test workflow」按鈕,即可執行後續流程。
2. 取得 Yahoo 新聞列表
2.1 Yahoo 綜合新聞
- 名稱:Yahoo 綜合新聞
- 類型:
n8n-nodes-base.httpRequest
- 作用:向
https://tw.news.yahoo.com/archive/
發送一個 HTTP GET 請求,取得「Yahoo 綜合新聞」的 HTML 內容。
2.2 Yahoo 政治新聞
- 名稱:Yahoo 政治新聞
- 類型:
n8n-nodes-base.httpRequest
- 作用:與上方節點類似,但網址為
https://tw.news.yahoo.com/politics/archive
,獲取「Yahoo 政治新聞」的 HTML 內容。
這兩個節點的輸出,都會包含網頁的整段 HTML,後續透過 HTML Parser 節點做進一步處理。
3. HTML Parser:擷取新聞列表(HTML 節點)
- 名稱:HTML
- 類型:
n8n-nodes-base.html
- 主要設定:
- operation:
extractHtmlContent
- cssSelector:
.StreamMegaItem
- key:
StretchedBox
- operation:
- 作用:將上一個節點(Yahoo 新聞列表)回傳的 HTML 內容中,選出
.StreamMegaItem
區塊,並以StretchedBox
作為 key。- 這些區塊通常代表新聞列表頁面上一則則的新聞區塊(包含標題、連結、圖片、描述等)。
4. 拆解新聞列表內容(split news 節點)
- 名稱:split news
- 類型:
n8n-nodes-base.code
- 程式碼功能:
- 使用 BeautifulSoup 解析前一步驟抓到的 HTML (key:
StretchedBox
)。 - 針對每個新聞項目,提取:
- 標題(使用
<h3>
) - 新聞連結(多數情況下為
<a>
裏的href
) - 圖片 URL(透過
<img>
的src
) - 描述(從
<p>
取得) - 來源與時間(尋找
.C(#959595)
這個 class) - 留言連結(透過
.comment-btn-link
class)
- 標題(使用
- 將取得的新聞資料組成一個 JSON,並以
return_dict['news']
的形式輸出。
- 使用 BeautifulSoup 解析前一步驟抓到的 HTML (key:
5. 移除第一筆廣告或無用項(removed ad 節點)
- 名稱:removed ad
- 類型:
n8n-nodes-base.code
- 程式碼功能:
without_ad = _input.all()[1:] return without_ad
- 有時候網站在第一筆會放置廣告或無效資料,這個節點則是直接跳過 input 中的第一筆,僅回傳之後的項目。
6. Split In Batches:Loop Over Items
- 名稱:Loop Over Items
- 類型:
n8n-nodes-base.splitInBatches
- 作用:迴圈處理每一則新聞項目,為後續對每篇新聞做更深入抓取及擷取做準備。
- 輸出路徑包含:
- Main:[0] 一般輸出(此流程未使用)
- Main:[1] 給後續的「get article content」或合併節點使用
- 輸出路徑包含:
7. 取得新聞內文(get article content 節點)
- 名稱:get article content
- 類型:
n8n-nodes-base.httpRequest
- 主要設定:
- URL:
={{ $json['連結'] }}
- Response Format:text (純文字)
- URL:
- 作用:根據剛剛取得的新聞連結,對單篇新聞發送 HTTP GET,取得完整 HTML 內容,準備後續進一步的內文解析。
8. 解析內容(HTML 節點)
- 名稱:解析內容
- 類型:
n8n-nodes-base.html
- 主要設定:
- operation:
extractHtmlContent
- cssSelector:
.caas-container
- key:
body
- operation:
- 作用:在每篇新聞的原始 HTML 裏,擷取
.caas-container
區塊,並用body
作為 key,方便我們能在後續 Code 節點中進行更精細的處理。
9. 提取 JSON-LD 與新聞內容(extract info 節點)
- 名稱:extract info
- 類型:
n8n-nodes-base.code
- 程式碼概略:
- 使用 BeautifulSoup 解析
body
內文。 - 尋找
<script type="application/ld+json">
,以json.loads()
方式取出 JSON-LD。 - 從中可以取得:
- 標題、發佈時間、修改時間、關鍵詞、描述、發布者、作者、新聞連結、圖片連結 等。
- 另外也直接在 HTML 中找出:
- 文章標題(
<h1>
) - 來源(
.caas-attr-provider
) - 時間(
<time>
) - 內文(搜集所有
<p>
標籤文字)
- 文章標題(
- 最後將兩者合併,輸出結構化資料(
ld_json | structured_data
)。
- 使用 BeautifulSoup 解析
10. Merge 節點
- 名稱:Merge
- 類型:
n8n-nodes-base.merge
- 設定:
- mode:
combine
- combineBy:
combineAll
- mode:
- 作用:用來合併多條輸入(包含原先新聞列表與從 HTML 解析出來的更多詳細資料),最終以一組 JSON 整合所有來源的欄位。
11. MongoDB 儲存
- 名稱:MongoDB
- 類型:
n8n-nodes-base.mongoDb
- 主要設定:
- Operation:
insert
- Collection:
news_v1
- fields:動態取得
={{ $json.keys().join(',') }}
- Operation:
- 作用:將最終所有整合好的新聞資料,插入到名為
news_v1
的 MongoDB 集合中,做資料庫儲存備份。
12. 迴圈結束回到 Loop Over Items
- 名稱:Loop Over Items
- 說明:
- 在完成插入 MongoDB 後,又回傳到
Loop Over Items
節點做迭代,直到所有新聞批次處理結束。
- 在完成插入 MongoDB 後,又回傳到
總結
透過以上的範例,我們可以看到 n8n 在自動化流程上具有以下優點:
- 圖形化設計:易於理解與維護,將每一個處理步驟(HTTP 請求、HTML 擷取、程式碼處理、資料庫儲存等)模組化。
- 彈性的程式碼節點:在工作流程中可隨時插入程式碼節點,以 Python(或 JavaScript)撰寫資料處理邏輯,對資料進行客製化解析與轉換。
- 整合多元服務:n8n 內建與MongoDB、HTTP APIs 等多種服務節點的整合,易於擴充整個自動化流程。
如果你也對自動化作業流程感到興趣,n8n 絕對是值得一試的工具。可以先從簡單的 HTTP 請求與 HTML 節點組合開始,逐步將新聞內容或其他網路資源抓取下來,做篩選、整理、轉換,最後自動送到資料庫或發佈到其他平台。相信透過此流程,你將更有效率地管理與運用自己掌握到的網路資料!