简单爬虫的 Node.js 实现

2022年07月12日

首先还是要先安装好爬虫需要的所有的依赖,这个小爬虫中我们主要使用的是 crawler 工具 node-schedule 定时任务工具以及 mysql 数据库

bash 复制代码
npm install crawler node-schedule mysql -s

因为项目逻辑比较简单,所以把全部代码都写在一个文件中,引入并配置好需要的库:

javascript 复制代码
const Crawler = require('crawler');
const schedule = require('node-schedule');
const mysql = require('mysql');

// 配置 mysql 连接池
const pool = mysql.createPool({
  user: '' // 用户名,
  password: '' // 密码,
  port: '' // 端口,
  database: '' // 数据库名,
  host: '' // 地址,
});

然后声明一个用于操作数据库的函数:

javascript 复制代码
/**
 *
 * @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 对象并书写主要逻辑:

javascript 复制代码
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 点获取一次文章信息:

javascript 复制代码
// 定时执行任务
schedule.scheduleJob('0 0 10 * * *', () => {
	console.log(`Today:${new Date()} ===> running...`);
	c && c.queue('https://www.yystv.cn/');
});

接下来为了使用 PM2 在服务器上跑起来这个小爬虫,需要添加一个 spider.json 文件:

json 复制代码
{
	"apps": [
		{
			"name": "spider",
			"script": "node"
		}
	]
}

上传到服务器上,执行我们的 node 爬虫:

bash 复制代码
pm2 start ./spider.json
相关文章

Vite项目配置本地HTTPS

React Native 开发环境安装踩坑

《JavaScript 高级程序设计》第10-16章