<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Script｜林鼎淵 Dean Lin</title>
    <link>https://deanlin.net/tags/script/</link>
    <image><url>https://deanlin.net/images/author_hu_aa256fc934e9a932.jpg</url><title>Script｜林鼎淵 Dean Lin</title><link>https://deanlin.net/tags/script/</link><width>144</width><height>144</height></image>
    <description>林鼎淵（Dean Lin）的部落格：生成式 AI 企業內訓講師、外商資安公司軟體專家、7 本書作者。400 多篇文章用白話分享生成式 AI 實戰、Claude Code 與 Vibe Coding 教學、團隊合作與職場成長。</description>
    <generator>Hugo</generator>
    <language>zh-tw</language>
    <copyright>© 2020–2026 林鼎淵 Dean Lin</copyright>
    <lastBuildDate>Fri, 09 Oct 2020 10:33:01 +0800</lastBuildDate>
    <atom:link href="https://deanlin.net/tags/script/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>【Day24】排程 - Cron套件超詳解，讓爬蟲自己動起來</title>
      <link>https://deanlin.net/blog/202010/fb-ig-crawler-day-24/</link>
      <pubDate>Fri, 09 Oct 2020 10:33:01 +0800</pubDate>
      <guid>https://deanlin.net/blog/202010/fb-ig-crawler-day-24/</guid>
      <dc:creator>林鼎淵</dc:creator>
      <category>技術教學</category>
      <description>在客戶要求這個功能前其實我就把他的雛型完成了，因為我是一個懶人，同時也不是一個記性很好的人，如果每天都要在某個時間打開專案執行 yarn start 然後等數據跑完，這對我來說實在是一件很容易忘記且沒有效率的事情，我認為電腦可以做到事情那就交給電腦去做，所以接下來幾天就來跟大家分…</description>
      <media:content url="https://deanlin.net/blog/202010/fb-ig-crawler-day-24/images/cover_hu_b6a0d4828cd4dd66.jpg" medium="image" type="image/jpeg" width="1200" height="675" />
      <content:encoded><![CDATA[<blockquote>
<p>電腦能夠記住的任務就讓電腦來做吧，把腦容量留給更重要的任務</p>
</blockquote>
<h2 id="為什麼要學習排程">為什麼要學習排程？<a class="h-anchor" href="#%e7%82%ba%e4%bb%80%e9%ba%bc%e8%a6%81%e5%ad%b8%e7%bf%92%e6%8e%92%e7%a8%8b" aria-label="這個段落的連結"></a></h2>
<p>在客戶要求這個功能前其實我就把他的雛型完成了，<mark>因為我是一個懶人，同時也不是一個記性很好的人</mark>，如果每天都要在某個時間打開專案執行 <strong>yarn start</strong> 然後等數據跑完，這對我來說實在是一件很容易忘記且沒有效率的事情，我認為<mark>電腦可以做到事情那就交給電腦去做</mark>，所以接下來幾天就來跟大家分享我是如何<del>偷懶</del>使用排程的</p>
<hr>
<h2 id="今日目標">今日目標<a class="h-anchor" href="#%e4%bb%8a%e6%97%a5%e7%9b%ae%e6%a8%99" aria-label="這個段落的連結"></a></h2>
<h3 class="h-nomark" id="1-排程套件---cron">1. 排程套件 - Cron<a class="h-anchor" href="#1-%e6%8e%92%e7%a8%8b%e5%a5%97%e4%bb%b6---cron" aria-label="這個段落的連結"></a></h3>
<p>1.1 測試官方程式</p>
<p>1.2 分析 api 架構</p>
<p>1.3 了解 cronTime 語法</p>
<p>1.4 範例</p>
<h3 class="h-nomark" id="2-把排程加入爬蟲">2. 把排程加入爬蟲<a class="h-anchor" href="#2-%e6%8a%8a%e6%8e%92%e7%a8%8b%e5%8a%a0%e5%85%a5%e7%88%ac%e8%9f%b2" aria-label="這個段落的連結"></a></h3>
<p>2.1 將主程式的函式<code>crawler</code>設定成外部函式，供排程呼叫</p>
<p>2.2 建立專門管控排程的程式：<code>cron.js</code></p>
<p>2.3 調整<code>package.json</code>，建立專門跑排程的 scripts</p>
<hr>
<h2 class="h-nomark" id="1-排程套件---cron-1">1. 排程套件 - Cron<a class="h-anchor" href="#1-%e6%8e%92%e7%a8%8b%e5%a5%97%e4%bb%b6---cron-1" aria-label="這個段落的連結"></a></h2>
<hr>
<p>這裡我們需要安裝一個套件 <strong>cron</strong> ，他可以在你指定的時間執行你希望他幫你做的事情，這是他的<a href="https://www.npmjs.com/package/cron">官方文檔</a>，下面我會詳細介紹他的功能(因為我自己也很常使用XD)</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>yarn add cron
</span></span></code></pre></div><h3 class="h-nomark" id="11-測試官方程式">1.1 測試官方程式<a class="h-anchor" href="#11-%e6%b8%ac%e8%a9%a6%e5%ae%98%e6%96%b9%e7%a8%8b%e5%bc%8f" aria-label="這個段落的連結"></a></h3>
<ol>
<li>
<p>先在 tools 的資料夾裡面新增一個 cron.js 的檔案</p>
</li>
<li>
<p>複製下方的官方範例</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#ff7b72">var</span> CronJob <span style="color:#ff7b72;font-weight:bold">=</span> require(<span style="color:#a5d6ff">&#39;cron&#39;</span>).CronJob;
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">var</span> job <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#ff7b72">new</span> CronJob(<span style="color:#a5d6ff">&#39;* * * * * *&#39;</span>, <span style="color:#ff7b72">function</span>() {
</span></span><span style="display:flex;"><span>    console.log(<span style="color:#a5d6ff">&#39;You will see this message every second&#39;</span>);
</span></span><span style="display:flex;"><span>}, <span style="color:#79c0ff">null</span>, <span style="color:#79c0ff">true</span>, <span style="color:#a5d6ff">&#39;America/Los_Angeles&#39;</span>);
</span></span><span style="display:flex;"><span>job.start();
</span></span></code></pre></div></li>
<li>
<p>在專案資料夾執行 <strong>node tools/cron.js</strong></p>
<ul>
<li>如果終端機(Terminal)每秒鐘都印出 <strong>You will see this message every second</strong> 就代表套件運行成功</li>
</ul>
</li>
</ol>
<hr>
<h3 class="h-nomark" id="12-分析-api-架構">1.2 分析 api 架構<a class="h-anchor" href="#12-%e5%88%86%e6%9e%90-api-%e6%9e%b6%e6%a7%8b" aria-label="這個段落的連結"></a></h3>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span>constructor(cronTime, onTick, onComplete, start, timezone, context, runOnInit, unrefTimeout)
</span></span></code></pre></div><ul>
<li>cronTime [必填] 設定定時任務時間</li>
<li>onTick [必填] 定時任務要執行的函式</li>
<li>onComplete [選填] 完成定時任務後要執行的函式</li>
<li>Start [選填] 是否自動啟動job，默認為false</li>
<li>timeZone [選填] - 指定執行的時區，莫認為當前時區，關於時區代碼可參考<a href="https://www.zeitverschiebung.net/en/">網站</a></li>
</ul>
<hr>
<h3 class="h-nomark" id="13-了解-crontime-語法">1.3 了解 cronTime 語法<a class="h-anchor" href="#13-%e4%ba%86%e8%a7%a3-crontime-%e8%aa%9e%e6%b3%95" aria-label="這個段落的連結"></a></h3>
<ul>
<li>
<p>總共分為六個區塊：秒 分鐘 小時 天 月份 星期幾</p>
<pre tabindex="0"><code>秒：0-59
分鐘：0-59
小時：0-23
天：1-31
月份：0-11（1~12月，特別注意月份是從0開始）
星期幾：0-6（星期日~星期六，Sun~Sat）
</code></pre></li>
<li>
<p>語法範例</p>
<ul>
<li><code>*</code> 全部
<ul>
<li>
<p>每秒都執行(官方範例)</p>
<pre tabindex="0"><code>* * * * * *
</code></pre></li>
<li>
<p>每分鐘的第 10 秒執行</p>
<pre tabindex="0"><code>10 * * * * *
</code></pre></li>
<li>
<p>每天晚上 10點30分10秒時執行</p>
<pre tabindex="0"><code>10 30 22 * * *
</code></pre></li>
</ul>
</li>
<li><code>-</code> 時間區間
<ul>
<li>
<p>每天早上 9點到12點的整點執行</p>
<pre tabindex="0"><code>0 0 9-12 * * *
</code></pre></li>
</ul>
</li>
<li><code>,</code> 分隔符號，可以輸入多個數值
<ul>
<li>
<p>每分鐘的第 5,20,30 秒執行</p>
<pre tabindex="0"><code>5,20,30 * * * * *
</code></pre></li>
</ul>
</li>
<li><code>/</code> 間隔多少時間執行
<ul>
<li>
<p>每 3 分鐘執行一次</p>
<pre tabindex="0"><code>* */3 * * * *
</code></pre></li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h3 class="h-nomark" id="14-範例">1.4 範例<a class="h-anchor" href="#14-%e7%af%84%e4%be%8b" aria-label="這個段落的連結"></a></h3>
<ul>
<li>
<p>每分鐘的第 10 秒執行</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#ff7b72">var</span> CronJob <span style="color:#ff7b72;font-weight:bold">=</span> require(<span style="color:#a5d6ff">&#39;cron&#39;</span>).CronJob;
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">new</span> CronJob(<span style="color:#a5d6ff">&#39;10 * * * * *&#39;</span>, <span style="color:#ff7b72">function</span> () {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">const</span> datetime <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#ff7b72">new</span> Date();
</span></span><span style="display:flex;"><span>    console.log(datetime);
</span></span><span style="display:flex;"><span>}, <span style="color:#79c0ff">null</span>, <span style="color:#79c0ff">true</span>);
</span></span></code></pre></div><blockquote>
<p><img src="https://deanlin.net/blog/202010/fb-ig-crawler-day-24/images/fb-ig-crawler-day-24-01.webp" width="1024" height="125" alt="1.4 範例（圖 1）" fetchpriority="high" decoding="async"></p>
</blockquote>
</li>
<li>
<p>每分鐘的第 5,20,30 秒執行</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#ff7b72">var</span> CronJob <span style="color:#ff7b72;font-weight:bold">=</span> require(<span style="color:#a5d6ff">&#39;cron&#39;</span>).CronJob;
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">new</span> CronJob(<span style="color:#a5d6ff">&#39;5,20,30 * * * * *&#39;</span>, <span style="color:#ff7b72">function</span> () {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">const</span> datetime <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#ff7b72">new</span> Date();
</span></span><span style="display:flex;"><span>    console.log(datetime);
</span></span><span style="display:flex;"><span>}, <span style="color:#79c0ff">null</span>, <span style="color:#79c0ff">true</span>);
</span></span></code></pre></div><blockquote>
<p><img src="https://deanlin.net/blog/202010/fb-ig-crawler-day-24/images/fb-ig-crawler-day-24-02.webp" width="1024" height="197" alt="1.4 範例（圖 2）" loading="lazy" decoding="async"></p>
</blockquote>
</li>
</ul>
<hr>
<h2 class="h-nomark" id="2-把排程加入爬蟲-1">2. 把排程加入爬蟲<a class="h-anchor" href="#2-%e6%8a%8a%e6%8e%92%e7%a8%8b%e5%8a%a0%e5%85%a5%e7%88%ac%e8%9f%b2-1" aria-label="這個段落的連結"></a></h2>
<p>我們要調整三個檔案讓排程可以順利觸發爬蟲</p>
<h3 class="h-nomark" id="21-將主程式的函式crawler設定成外部函式供排程呼叫">2.1 將主程式的函式<code>crawler</code>設定成外部函式，供排程呼叫<a class="h-anchor" href="#21-%e5%b0%87%e4%b8%bb%e7%a8%8b%e5%bc%8f%e7%9a%84%e5%87%bd%e5%bc%8fcrawler%e8%a8%ad%e5%ae%9a%e6%88%90%e5%a4%96%e9%83%a8%e5%87%bd%e5%bc%8f%e4%be%9b%e6%8e%92%e7%a8%8b%e5%91%bc%e5%8f%ab" aria-label="這個段落的連結"></a></h3>
<ul>
<li>因避免被引用時自動觸發 <strong>crawler</strong> 函式，故將下方觸發用的 crawler() 移除</li>
</ul>
<h4 id="indexjs">index.js<a class="h-anchor" href="#indexjs" aria-label="這個段落的連結"></a></h4>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span>require(<span style="color:#a5d6ff">&#39;dotenv&#39;</span>).config(); 
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">const</span> { initDrive } <span style="color:#ff7b72;font-weight:bold">=</span> require(<span style="color:#a5d6ff">&#34;./tools/initDrive.js&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">const</span> { crawlerFB } <span style="color:#ff7b72;font-weight:bold">=</span> require(<span style="color:#a5d6ff">&#34;./tools/crawlerFB.js&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">const</span> { crawlerIG } <span style="color:#ff7b72;font-weight:bold">=</span> require(<span style="color:#a5d6ff">&#34;./tools/crawlerIG.js&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">const</span> { updateGoogleSheets } <span style="color:#ff7b72;font-weight:bold">=</span> require(<span style="color:#a5d6ff">&#34;./tools/google_sheets&#34;</span>);
</span></span><span style="display:flex;"><span>exports.crawler <span style="color:#ff7b72;font-weight:bold">=</span> crawler; <span style="color:#8b949e;font-style:italic">//讓其他程式在引入時可以使用這個函式
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">async</span> <span style="color:#ff7b72">function</span> crawler () {
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">const</span> driver <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#ff7b72">await</span> initDrive();
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">if</span> (<span style="color:#ff7b72;font-weight:bold">!</span>driver) {
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">return</span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">const</span> ig_result_array <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#ff7b72">await</span> crawlerIG(driver)
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">const</span> fb_result_array <span style="color:#ff7b72;font-weight:bold">=</span> <span style="color:#ff7b72">await</span> crawlerFB(driver)
</span></span><span style="display:flex;"><span>    driver.quit();
</span></span><span style="display:flex;"><span>    <span style="color:#ff7b72">await</span> updateGoogleSheets(ig_result_array, fb_result_array)
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><hr>
<h3 class="h-nomark" id="22-建立專門管控排程的程式cronjs">2.2 建立專門管控排程的程式：<code>cron.js</code><a class="h-anchor" href="#22-%e5%bb%ba%e7%ab%8b%e5%b0%88%e9%96%80%e7%ae%a1%e6%8e%a7%e6%8e%92%e7%a8%8b%e7%9a%84%e7%a8%8b%e5%bc%8fcronjs" aria-label="這個段落的連結"></a></h3>
<ul>
<li>我將 CronJob 的參數都帶出來，這樣在<mark>日後維護時比較了解每個參數的意義</mark></li>
<li>請編輯 .env檔填上排程觸發爬蟲的時間點(CRONJOB_TIME)</li>
</ul>
<h4 id="cronjs">cron.js<a class="h-anchor" href="#cronjs" aria-label="這個段落的連結"></a></h4>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#ff7b72">const</span> CronJob <span style="color:#ff7b72;font-weight:bold">=</span> require(<span style="color:#a5d6ff">&#39;cron&#39;</span>).CronJob;
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">const</span> { crawler } <span style="color:#ff7b72;font-weight:bold">=</span> require(<span style="color:#a5d6ff">&#34;../index.js&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#ff7b72">new</span> CronJob({
</span></span><span style="display:flex;"><span>    cronTime<span style="color:#ff7b72;font-weight:bold">:</span> process.env.CRONJOB_TIME,<span style="color:#8b949e;font-style:italic">//請編輯.env檔填上自己的爬蟲時段喔
</span></span></span><span style="display:flex;"><span>    onTick<span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#ff7b72">async</span> <span style="color:#ff7b72">function</span> () {
</span></span><span style="display:flex;"><span>        console.log(<span style="color:#a5d6ff">`開始執行爬蟲排程作業： </span><span style="color:#a5d6ff">${</span><span style="color:#ff7b72">new</span> Date()<span style="color:#a5d6ff">}</span><span style="color:#a5d6ff">`</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#ff7b72">await</span> crawler()
</span></span><span style="display:flex;"><span>        console.log(<span style="color:#a5d6ff">&#39;排程作業執行完畢！&#39;</span>);
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>    start<span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#79c0ff">true</span>,
</span></span><span style="display:flex;"><span>    timeZone<span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#a5d6ff">&#39;Asia/Taipei&#39;</span>
</span></span><span style="display:flex;"><span>});
</span></span></code></pre></div><hr>
<h3 class="h-nomark" id="23-調整-packagejson建立專門跑排程的-scripts">2.3 調整 <code>package.json</code>，建立專門跑排程的 scripts<a class="h-anchor" href="#23-%e8%aa%bf%e6%95%b4-packagejson%e5%bb%ba%e7%ab%8b%e5%b0%88%e9%96%80%e8%b7%91%e6%8e%92%e7%a8%8b%e7%9a%84-scripts" aria-label="這個段落的連結"></a></h3>
<p>針對 node 如何執行 js 指定 function 的指令寫法可以參考這篇<a href="https://stackoverflow.com/questions/30782693/run-function-in-script-from-command-line-node-js">文章</a></p>
<ul>
<li><strong>start</strong> : mac 執行單次爬蟲時使用的</li>
<li><strong>win_start</strong> : windows 執行單次爬蟲時使用的(需要將單引號與雙引號反過來，因為 windows 只會將單引號內的資訊印除來而不會去執行)</li>
<li><strong>cron</strong> : mac、windows 排程執行爬蟲時使用的</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#a5d6ff">&#34;name&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#a5d6ff">&#34;crawler&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a5d6ff">&#34;version&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#a5d6ff">&#34;0.0.1&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a5d6ff">&#34;description&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#a5d6ff">&#34;FB &amp; IG 爬蟲30天鐵人文章&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a5d6ff">&#34;author&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#a5d6ff">&#34;dean lin&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a5d6ff">&#34;dependencies&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#a5d6ff">&#34;cron&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#a5d6ff">&#34;^1.8.2&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a5d6ff">&#34;dateformat&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#a5d6ff">&#34;^3.0.3&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a5d6ff">&#34;dotenv&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#a5d6ff">&#34;^8.2.0&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a5d6ff">&#34;googleapis&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#a5d6ff">&#34;59&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a5d6ff">&#34;selenium-webdriver&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#a5d6ff">&#34;^4.0.0-alpha.7&#34;</span>
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>    <span style="color:#a5d6ff">&#34;devDependencies&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> {},
</span></span><span style="display:flex;"><span>    <span style="color:#a5d6ff">&#34;scripts&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#a5d6ff">&#34;start&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#a5d6ff">&#34;node  -e &#39;require(\&#34;./index\&#34;).crawler()&#39;&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a5d6ff">&#34;win_start&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#a5d6ff">&#34;node  -e \&#34;require(&#39;./index&#39;).crawler()\&#34;&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a5d6ff">&#34;cron&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span><span style="color:#a5d6ff">&#34;node tools/cron.js&#34;</span>
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>    <span style="color:#a5d6ff">&#34;main&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#a5d6ff">&#34;index.js&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a5d6ff">&#34;license&#34;</span><span style="color:#ff7b72;font-weight:bold">:</span> <span style="color:#a5d6ff">&#34;MIT&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><hr>
<h3 id="執行程式">執行程式<a class="h-anchor" href="#%e5%9f%b7%e8%a1%8c%e7%a8%8b%e5%bc%8f" aria-label="這個段落的連結"></a></h3>
<ol>
<li>
<p>建議將 .env 檔中 CRONJOB_TIME 的時間調整成 3 分鐘後的時間比較好測試</p>
</li>
<li>
<p>在專案資料夾的終端機(Terminal)執行指令</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>yarn start
</span></span></code></pre></div></li>
<li>
<p>確認爬蟲程式是否依照你設定的時間開始執行</p>
<p><img src="https://deanlin.net/blog/202010/fb-ig-crawler-day-24/images/fb-ig-crawler-day-24-03.webp" width="1024" height="634" alt="執行程式（圖 3）" loading="lazy" decoding="async"></p>
</li>
<li>
<p>因為<mark>排程的程式會一直執行，所以你不會看到以往 Done in xxs 的訊息</mark>，如果想要中斷終端機(Terminal)執行的程式，可以用下面按鍵組合:</p>
<ul>
<li>Windows: Ctrl + c</li>
<li>Mac: control + c</li>
</ul>
</li>
</ol>
<h3 id="ℹ-專案原始碼">ℹ️ 專案原始碼<a class="h-anchor" href="#%e2%84%b9-%e5%b0%88%e6%a1%88%e5%8e%9f%e5%a7%8b%e7%a2%bc" aria-label="這個段落的連結"></a></h3>
<ul>
<li>今天的完整程式碼可以在<a href="https://github.com/dean9703111/ithelp_30days/tree/master/day24">這裡</a>找到喔</li>
<li>我也貼心地把昨天的把昨天的程式碼打包成<a href="https://github.com/dean9703111/ithelp_30days/raw/master/sampleCode/day23_sample_code.zip">壓縮檔</a>，你可以用裡面乾淨的環境來加入今天排程的功能喔
<ul>
<li>請記得在終端機下指令 <strong>yarn</strong> 才會把之前的套件安裝</li>
<li>windows需下載與你chrome版本相同的<a href="http://chromedriver.storage.googleapis.com/index.html">chrome driver</a>放在專案根目錄</li>
<li>要在tools/google_sheets資料夾放上自己的憑證，申請流程請參考<a href="https://deanlin.net/blog/202010/fb-ig-crawler-day-17/">Day17</a></li>
<li>調整fanspages資料夾內目標爬蟲的粉專網址</li>
<li>調整.env檔
<ul>
<li>填上FB登入資訊</li>
<li>填上FB版本(classic/new)</li>
<li>填上IG登入資訊</li>
<li>填上SPREADSHEET_ID</li>
<li>填上爬蟲執行時間(CRONJOB_TIME)</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="參考資源">參考資源<a class="h-anchor" href="#%e5%8f%83%e8%80%83%e8%b3%87%e6%ba%90" aria-label="這個段落的連結"></a></h3>
<ol>
<li><a href="https://stackoverflow.com/questions/30782693/run-function-in-script-from-command-line-node-js">Run function in script from command line (Node JS)</a></li>
</ol>
<hr>
<blockquote>
<p><img src="https://deanlin.net/blog/202010/fb-ig-crawler-day-24/images/fb-ig-crawler-day-24-04.webp" width="1024" height="233" alt="參考資源（圖 4）" loading="lazy" decoding="async"></p>
<p><strong>在許多人的幫助下，本系列文章已出版成書，並添加了新的篇章與細節補充：</strong></p>
<ul>
<li>加入更多實務經驗，用完整的開發流程讓讀者了解專案每個階段要注意的事項</li>
<li>將爬蟲的步驟與技巧做更詳細的說明，讓讀者可以輕鬆入門</li>
<li>調整專案架構
<ul>
<li>優化爬蟲程式，以更廣的視角來擷取網頁資訊</li>
<li>增加資料驗證、錯誤通知等功能，讓爬蟲執行遇到問題時可以第一時間通知使用者</li>
<li>排程部分改用 node-schedule &amp; pm2 的組合，讓讀者可以輕鬆管理專案程序並獲得更精確的 log 資訊</li>
</ul>
</li>
</ul>
<p><strong>有興趣的朋友可以到天瓏書局選購，感謝大家的支持。</strong></p>
<p><strong>購書連結</strong>：<a href="https://www.tenlong.com.tw/products/9789864348008">https://www.tenlong.com.tw/products/9789864348008</a></p>
</blockquote>
]]></content:encoded>
    </item>
  </channel>
</rss>
