91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

實現一個簡易爬蟲&啟動定時任務

發布時間:2020-02-29 19:18:58 來源:網絡 閱讀:175 作者:牧馬人77 欄目:開發技術

爬蟲

目前 node.js 爬蟲工具比較火的有 node-crawler puppeteer。不過我目前沒打算用這些,因為至少現在我們的項目還用不到。只要能發送請求、解析dom我們就能自己實現一個爬蟲。所以我選擇了axios + cheerio來自己寫爬蟲。

首先我們用 axios + cheerio 來獲取首頁編輯推薦文章,并解析出這篇文章的正文部分。


// controller/crawler.js 文件
const axios = require('axios');
const cheerio = require('cheerio');
// articleCtrl是一個寫好了的controller,里面有存儲數據到mongo的邏輯。
const articleCtrl = require('./article');

async function cnblogs () {
    const res = await axios.get('https://www.cnblogs.com/');
    // 把axios得到的數據用cheerio解析,解析后的$對象擁有jquery的能力,可以通過jquery api直接操作dom
    const $ = cheerio.load(res.data);
    const $href = $('#editor_pick_lnk');
    let name = $href.text();
    // 找到編輯推薦文章的url,繼續訪問該頁面
    let href = $href.attr('href');

    const subRes = await axios.get(href);
    const $$ = cheerio.load(subRes.data);
    // 獲得編輯推薦文章的正文部分的html
    const bodyStr = $$('#cnblogs_post_body').html();
    // 存入mongodb,具體articleCtrl.create方法的實現可以從項目源碼中看,位置express/controller/article.js
    const cRes = await articleCtrl.create({
        from: 'cnblogs',
        title: name,
        article: bodyStr,
        hot_level: 1,
        favor: 1,
        comment: 1
    });
};

module.exports = {
    cnblogs
};

通過上面簡單的代碼,我們就能把推薦文章正文部分存到數據庫。接下來要創建定時任務,把每天的推薦文章都存到自己的數據庫了。

定時任務
實例
定時任務工具我選擇 node-schedule ,先上實例,后面再詳細講下用法。

// schedule/index.js 文件
var schedule = require('node-schedule');

// 可以按照cron的格式設置
function runSchedule (cb) {
    // cron風格的配置:每天上午10點執行一次
    schedule.scheduleJob('0 0 10 * * *', function () {
        console.log('定時任務執行一次');
            cb && cb();
    });
    // object風格的配置:每天上午10點執行一次
    // 注意,這里需要加minute:0, 否則10點的每一分鐘都執行一次。
    schedule.scheduleJob({hour: 10, minute: 0}, function () {
        console.log('定時任務執行一次');
            cb && cb();
    });
}

module.exports = runSchedule;
接下來講講 cron 與 object 兩種配置風格的差異。

建議大家直接用 cron 風格的配置方式。當我第一次看到 object 配置風格的時候也覺得很人性化,可用過后會發現坑太多,越用成本越大。不信可以慢慢看

object風格

// 每天上午7點的每分鐘都執行一次 (本以為會每天7點執行一次)
let obj = { hour: 7};

// 同上
let obj = { hour: 7, minute: null};

// 上午7點整執行一次
let obj = { hour: 7, minute: 0};

// 每秒執行一次
let obj = { second: null }

// 每分鐘執行一次
let obj = { hour: null }; // 費解,這個不應該是每小時執行一次嗎

// 每分鐘執行一次
let obj = { minute: null };

// 每小時執行一次
let obj = { hour: null, minute: 0 }
cron風格定時器
* * * * * * 每秒執行一次
0 * * * * * 每分鐘的第0秒執行一次
0 0 * * * * 每小時的0分0秒執行一次
0 0 7 * * * 每天早上7點的0分0秒執行一次
0 0 7 1 * * 每月的1日早上7點0分0秒執行一次
0 0 7 * * 1 每周1的早上7點0分0秒執行一次
對比完了這兩種風格能明顯的看出:雖然 object 更人性化但個人覺的有點中看不中用的感覺。尤其是對于個性化的配置,object 顯的很蹩腳,而且你根本沒法查,沒那么多使用說明給到你。相比下 cron 本身就是linux的通用定時任務,各種玩法都被人用了多少遍了。

啟動定時任務
最后,在 app.js 補上下面的邏輯,node app.js 啟動服務,等待定時任務的執行吧。


const runSchedule = require('./schedule');
const crawlerCtrl = require('./controller/crawler');

function listen () {
    app.listen('3000', () => {
        console.log('listen: 3000');
        // 開啟自動腳本
        runSchedule(function() {
            crawlerCtrl.cnblogs();
        })
    });
}
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

自贡市| 文安县| 当阳市| 新郑市| 新安县| 天长市| 营口市| 会理县| 鹤岗市| 泾阳县| 泰顺县| 安西县| 祁门县| 陇川县| 互助| 镇江市| 云阳县| 浪卡子县| 宜兰市| 中超| 通渭县| 永胜县| 玉溪市| 榆林市| 咸宁市| 阜城县| 河北区| 道孚县| 枝江市| 舟曲县| 栾川县| 安平县| 团风县| 错那县| 肥西县| 合川市| 尚义县| 涡阳县| 会泽县| 西和县| 嘉义市|