首先还是要先安装好爬虫需要的所有的依赖,这个小爬虫中我们主要使用的是 crawler 工具 node-schedule 定时任务工具以及 mysql 数据库
npm install crawler node-schedule mysql -s
因为项目逻辑比较简单,所以把全部代码都写在一个文件中,引入并配置好需要的库:
const Crawler = require('crawler');
const schedule = require('node-schedule');
const mysql = require('mysql');
// 配置 mysql 连接池
const pool = mysql.createPool({
user: '' // 用户名,
password: '' // 密码,
port: '' // 端口,
database: '' // 数据库名,
host: '' // 地址,
});
然后声明一个用于操作数据库的函数:
/**
*
* @param {*} sql sql语句
* @param {*} val 参数
*/
const query = (sql, val) =>
new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
if (err) {
reject(err);
}
connection.query(sql, val, (err, fields) => {
if (err) {
reject(err);
}
resolve(fields);
connection.release();
});
});
});
实例化一个 crawler 对象并书写主要逻辑:
const c = new Crawler({
callback: (err, res, done) => {
if (err) {
console.log(err);
} else {
const hotNews = [];
const $ = res.$;
// 使用方法与 cheerio 相同
$(
'#add-docs-block li div.list-info-box div.list-title-box a.list-title h3'
).each((idx, el) => {
if (idx > 5) return;
let news = {
id: idx + 1,
title: $(el).text(),
href: 'https://www.yystv.cn/' + $(el).attr('data-src'),
bg: '',
};
hotNews.push(news);
});
$('ul#add-docs-block li a.list-item div.item-bg').each((idx, el) => {
if (idx > 5) return;
hotNews[idx].bg = $(el)
.attr('style')
.split("'")[1]
.replace(/_w360/, '');
});
const sql = `UPDATE yysTV SET title=?,href=?,bg=? WHERE id=?`;
// 通过 Promise 实现所有异步函数结束后调用 done 方法
new Promise((resolve, reject) => {
resolve();
})
.then(() => {
for (let i = 0; i < hotNews.length; i++) {
let item = hotNews[i];
query(sql, [item.title, item.href, item.bg, item.id]);
}
})
.then(() => {
done();
console.log(`Today:${new Date()} ===> finished`);
});
}
},
});
最后通过 node-schedule 定时每天早上 10 点获取一次文章信息:
// 定时执行任务
schedule.scheduleJob('0 0 10 * * *', () => {
console.log(`Today:${new Date()} ===> running...`);
c && c.queue('https://www.yystv.cn/');
});
接下来为了使用 PM2 在服务器上跑起来这个小爬虫,需要添加一个 spider.json 文件:
{
"apps": [
{
"name": "spider",
"script": "node"
}
]
}
上传到服务器上,执行我们的 node 爬虫:
pm2 start ./spider.json