本篇文章說明如何使用Node.js爬蟲,用來取得台灣彩券的開獎號碼

網路上目前查閱到的資料,關於爬蟲,大部份都是使用Python + Beautifulsoup,並且可能會因為網頁的特性,加入一些亂數,或是實際使用瀏覽器核心(即真的去啟動瀏覽器),去取得網頁的資訊,有些比較熱門的資訊,為了避免太多Request要求,造成網頁伺服器的負擔(太多request要求就類似ddos攻擊),所以會加上一些防護措施,不過本篇說明的台彩頁面目前並沒有這些防護措施,所以也不需要特別加入應對的方式。

此次爬蟲需求套件如下:

  • request
  • cheerio

套件安裝的方式,相信使用過node的人應該都知道使用npm套件管理程式下載,套件安裝之後,還不急著去使用套件去取得想要的資料,首先可以先觀察一下自己需要的資料位於HTML中的哪一個DOM,html程式碼結構為何,是不是有一定的架構規則,釐清自己想要的資料,並且理解結構之後,就可以開始著手程式碼的設計了。

台灣彩券主要固定開獎的項目為:威力彩、大樂透、今彩539、雙贏彩、3星彩、4星彩、38樂合彩、39樂合彩、49樂合彩。如果是剛入門爬蟲取資料,建議可以先由最簡單的3星彩入手。

不過首要的任務是先取得網頁的html程式碼,相關程式如下:

/**取得頁面html */
const doRequest = (url)=>{
    return new Promise((resolve, reject)=>{
        request({
            url: url,
            method: "GET"
        }, (error, res, body) => {
            // 如果有錯誤訊息,或沒有 body(內容),就 return
            if (error || !body) {
                reject(error);
            }
            else{
                resolve(body);
            }    
        });
    });
}

/**取得所有樂透彩資訊 */
const crawlerAll = async () => {
    //台灣彩券-最新開獎結果
    url = "https://www.taiwanlottery.com.tw/result_all.htm";
    
    let getBody = async ()=>{
        return await doRequest(url);
    };

    let body = await getBody();
    let $ = cheerio.load(body);
}

簡單說明上述程式碼:

  • 行2,函式「doRequest」,是為使用套件「request」,以取得指定網址(頁)的html。
  • 行20,函式「crawlerAll」,是為呼叫doRequest方法,取得html後,後續再使用cheerio來分析,以取得想要的資訊。 ※注意,此函式使用async-await的方式來取得資料。
  • 行29,利用套件「cheerio」分析html,並且取得指定的資料。

以下為取得3星彩資訊的方法:

台灣彩券3星彩開獎頁HTML

台彩最新開獎結果頁面HTML碼(參考來源:https://www.taiwanlottery.com.tw/result_all.htm

/**取得三星彩資訊 */
function get3D($){  
    var result = $.find("table.tableWin tbody tr:eq(4) td:eq(1)");
    return result.text().replace(/[\s]/g, "");
}

下述程式碼「$」代表上圖中的「intx01」這個項目,所以經由上述程式碼行3的find,就可以取到text()為「846」這三個數字。

這邊的find方法其實很像jQuery的find,也像CSS的Selector,所以對於前端工程師來說,取得指定資料不算問題,重點在於理解HTML結構,後續取得資料就不成問題了。

目前此程式也有放上github:https://github.com/chihpindu/lottoCrawler

有興趣的人可以下載研究。

使用方式與執行結果如下: 爬蟲專案執行結果

目前github專案-lottoCrawler,於2022/06/12可正確爬蟲取得獎號資訊,日後台彩更新頁面可能會導致無法正確取得獎號資訊。