Quantcast
Channel: WFU BLOG
Viewing all articles
Browse latest Browse all 571

使用 Node.js 爬蟲定期抓網頁資料,結合 Google 試算表作為資料庫

$
0
0
使用 Node.js 爬蟲定期抓網頁資料,結合 Google 試算表作為資料庫上一篇「Node.js 爬蟲開發新手技巧﹍Google Apps Script 替代品」說明了為何我選擇 Node.js 作為爬蟲程式,並搭配 Google 試算表這個免費雲端資料庫,只要學會 Javascript 就能通吃「前端+後端+資料庫」,非常方便好上手。 閱讀本篇之前最好先瞭解上一篇的這些內容:
  • 建立 Node.js 開發環境
  • 操作開發工具 Sublime Text 3
  • Node.js 原生/外部模組如何引用
  • 同步/非同步的概念與技巧
接下來本篇會說明爬蟲需用到的第三方模組,提供範例,及瞭解 Windows 如何定期自動執行爬蟲程式。 (圖片出處: pixabay.com)

一、安裝 Axios、Cheerio 模組

以下分別說明兩個 Node.js 爬蟲會用到的重要模組。 1. Axios Jquery 爬取網頁資料使用的方式為 $.ajax,Google Apps Script(簡稱GAS) 爬取網頁資料使用的方式為 UrlFetchApp.fetch。而 Node.js 爬取網頁有很多模組可用,例如: 本篇介紹的是比較熱門的第三方模組 Axios: 使用前需要先安裝,用 npm 或 yarn 都可以: npm i axios -g yarn global add axios2. Cheerio爬回來的網頁資料,無論是 HTML 或 XML 格式都不方便處理,此時需要一個類似 Jquery 的工具來操作 DOM 比較方便。而 Node.js 知名的「類 Jquery」第三方模組為 Cheerio: 使用前需要先安裝,用 npm 或 yarn 都可以: npm i cheerio -g yarn global add cheerio

二、Node.js 爬蟲範例

1. 取得 HTML 資料爬網頁 HTML 內容難度最低,使用 Cheerio 操作 DOM 會更方便(使用技巧可參考「Cheerio 輕鬆解析 HTML 與 XML 」)。 使用 Node.js 爬蟲定期抓網頁資料,結合 Google 試算表作為資料庫那麼就以本站 WFU BLOG 為例,如上圖,練習爬取「本站服務」區塊的文章標題及圖片,資料位於 #HTML8 之下每個 .item 裡的的 .title 及 .thumb。 var axios = require("axios"), cheerio = require("cheerio"), url = "https://www.wfublog.com/"; axios.get(url).then(function(res) { var data = res.data, $ = cheerio.load(data), title_thumb_array = []; $("#HTML8 .item").each(function () { var $this = $(this), title = $this.find(".title").text(), thumbUrl = $this.find(".thumb img").attr("src"); title_thumb_array.push([title, thumbUrl]); }); console.log(title_thumb_array); });下圖為執行結果,成功! 使用 Node.js 爬蟲定期抓網頁資料,結合 Google 試算表作為資料庫2. 取得 JSON 資料如果網頁內容是用 JS 動態產生,那麼撈 HTML 資料就沒用了,此類網頁可參考「製作網路爬蟲工具抓動態產生的網頁資料」,用 Chrome 開發人員工具找出儲存資料的連結。 使用 Node.js 爬蟲定期抓網頁資料,結合 Google 試算表作為資料庫本篇同樣以 NBA 官網作為範例,找出當日的比賽結果。找出 json 檔的流程省略,如上圖,今天是總冠軍賽最後一場,勇士 4-2 獲勝,資料檔案放在 scoreboardv3.json: var axios = require("axios"), url = "https://cdn.nba.com/static/json/staticData/scoreboardv3.json"; axios.get(url).then(function(res) { var data = res.data, scoreboard = data.scoreboard; console.log(scoreboard); });下圖為執行結果,成功! 使用 Node.js 爬蟲定期抓網頁資料,結合 Google 試算表作為資料庫

三、寫入資料庫

1. 寫入檔案處理完爬蟲資料後,寫入檔案可用原生模組 fs(教學文章可參考「Node.js 檔案系統」),操作方式如下: var fs = require("fs"); fs.writeFile("檔案路徑及檔名", "檔案內容"); // 寫入檔案 fs.appendFile("檔案路徑及檔名", "新增內容"); // 新增內容至檔案2. 寫入 Google 試算表將資料寫入資料庫可以有更多的應用方式及情境,例如寫入 Google 試算表,可以隨時從網路存取非常方便,這部分的操作可參考「用 Google Apps Script 操作 Google 試算表」系列文章。

四、Windows 自動執行程式

以前使用 GAS 可以設定自動排程,Google 會自動在雲端幫我們執行,不會有忘記的時候,但缺點如前一篇所提,每次最多只能執行 6 分鐘。 如果 Node.js 爬蟲任務需要每天定時撈資料並自動處理後續,有兩種作法: 1. Node.js 排程模組可參考「node-schedule模塊的使用」,安裝 node-schedule 這個第三方模組來進行設定。 這個方法適合已經執行 Node.js 以後,再呼叫模組來進行排程,也等於是半手動排程,不適合機械化執行。 2. Windows 排程如果想要電腦開機後,每天設定的時段一到自動執行,可利用 Windows 內建的排程工具,參考「如何設定工作排程」,以 Win7 為例:
  • Win+R→ taskschd.msc → 可開啟工作排程器
  • 建立基本工作 → 填入名稱 → 設定執行頻率 → 設定開始時間 → 啟動程式
  • 「瀏覽」後找出、或填入 node.exe 完整路徑 →「新增引數」填入要執行的 js 檔名 →「開始位置」填入這個 js 檔的路徑
  • 之後「下一步」到完成即可
這樣的做法需要每天記得手動開機,跟 GAS 還是差了一點點。除非有閒置的主機,例如 24 小時不關機,或是想辦法自動開機、自動執行排程、自動關機,就看是否要花這樣的心思了。
更多「爬蟲」相關技巧:

Viewing all articles
Browse latest Browse all 571

Trending Articles