シンプルな爬虫類&スタート・スケジュールされたタスクの実現
コースの説明はこちらをご覧ください:https://www.cnblogs.com/zhangran/p/11963616.html
プロジェクトのgithubの住所:https://github.com/hellozhangran/happy-egg-server
爬虫
現在のところ、クローラの手段より多くの火をNode.jsのnode-crawler
puppeteer
。少なくとも、今、我々はまた、アイテムを使用することはできませんので、しかし、私は現在、これらを使用するつもりはありません。限り、要求が送信されるように、我々は彼らの決意のDOM爬虫類を実現することができるようになります。自分のクローラを書くこと+チェリオaxiosを選んだ私はそう。
お勧めの記事は、公園をブログ取得します
まず、ブログホームパークEditor's_pickを取得し、この記事のボディを解析するためにaxios +チェリオを使用しています。
// 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;
そして、オブジェクトスタイルを持つ2つの構成のcronの違いについて話しています。
cronのスタイルの設定と直接ことを提案します。いつ最初ののこぎりのオブジェクトの構成スタイルの感触は非常に人間、そして唯一のあまりピットを見つけるには、より多くの我々は大きなコストを使用します。あなたはあなたの時間を取ることができると信じてはいけません
オブジェクトスタイル
// 每天上午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のスタイルタイマー
* * * * * *
1秒に1回実行します0 * * * * *
0番目の第二は、1分に1回行われます0 0 * * * *
00:00:00 1時間に1回行われ0 0 7 * * *
朝の午前7時0分0秒を実行するために、毎日0 0 7 1 * *
第一朝午前7時00分00秒に実行月に一度0 0 7 * * 1
一度実行モーニング午前七時00分00秒
オブジェクトがより人間的であるが、個人的に少し感じる:これらの2つのスタイルを超える比較が明確にそれを見ることができ、無駄な感じを。特に、パーソナライズされた構成のため、オブジェクトが非常に悪かった、とあなたはあまりないあなたに指示を与えるために、チェックしません。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();
})
});
}
コードをオンにプロジェクトを完了するためのロジック。