携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情
之前几个文章我们逐步学习了Node爬虫的AABBCC,这次为了一劳永逸,我们封装一个脚手架。方便大家低门槛上手,低成本起飞。
起步
定位很清晰,让所有了解JS的同学最终都能够通过JS操作JS能实现的一切。
实战中成长,实战中学习,一直以来都是院长信奉的真理。
2分钟搞定,不太喜欢拽英文,拼音有时候很顺眼,不要嫌弃母语。
开撸
配置文件
我们创建scr并在其目录下创建config/index.js,有的同学喜欢在外层创建,无所谓,看你心情。
module.exports = {
cookie: "", //请求cookie
// 邮箱配置-网易邮箱为例
email: {
provider: {
auth: {
user: process.env.EMAIL_USER || "", // 你的网易邮箱账号
pass: process.env.EMAIL_PASS || "", // 你的网易邮箱 smpt 授权码
},
host: "smtp.163.com",
secure: true,
port: 465,
secureConnection: true,
},
},
//请求头
headers: {
origin: "https://juejin.cn", //请求头以掘金为例
pragma: "no-cache",
referer: "https://juejin.cn/",
"sec-ch-ua":
'"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"',
"sec-ch-ua-mobile": "?0",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
"User-Agent":
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36",
},
//钉钉机器人通知
DINGTALK_WEBHOOK: "", // 你的钉钉机器人webhook
DINGTALK_SECRET: "", // 你的PushPlus推送token
//飞书机器人通知
FEISHU_WEBHOOK: "",
FEISHU_SECRET: "",
//企业微信机器人通知
WX_COMPANY_ID: "", // 企业 ID
WX_APP_ID: "", // 应用 ID
WX_APP_SECRET: "", //应用 secret
};
主要包含一些常用的环境变量,如果喜欢自己可以追加和修改,内置了邮件配置,机器人通知,请求头,cookie等。你仍然可以添加一些自定义比如isAuto,isAllIn等配置
接口请求配置
个人比较喜欢使用got作为请求,它的写法这样式的:
return got.post(GET_TOKEN_URL, {
hooks: {
beforeRequest: [
options => {
Object.assign(options.headers, {
...HEADER,
cookie
})
}
]
}
})
由于我们脚手架便于前端入手,所以使用低认知的axios。我们封装要给request.js,便于管理api接口,并且考虑会出现多账号动态cookie的情况。
const axios = require("axios");
const { mergeObject } = require("fastool");
const config = require("./config");
const defaultOptions = {
method: "GET",
data: {},
params: {},
headers: config.headers,
};
class Request {
constructor(cookie) {
this.cookie = cookie || "";
}
request(options) {
return new Promise((resolve, reject) => {
options = Object.assign({}, options, {
headers: {
cookie: this.cookie || "",
},
});
const opts = mergeObject(defaultOptions, options);
axios(opts)
.then((res) => {
let data = res.data || {};
resolve(data.data);
})
.catch((err) => {
reject(err);
});
});
}
// 举例 查询掘金用户信息
queryUserProfile() {
return this.request({
method: "GET",
url: "https://api.juejin.cn/user_api/v1/user/get",
});
}
}
module.exports = Request;
这里使用了一个fastool的库,这个库是自己写的一个效率库,里面有很多效率方法有兴趣的同学可以玩玩它。也有专门的文档介绍.
消息通知
为了方便爬虫通知事件,我们直接封装一套机器人通知的类message.js
const DingBot = require("./ding-bot");
const wxWorkBot = require("./wx-bot");
const FeishuBot = require("./feishu-bot");
const config = require("../../config");
const dingBot = new DingBot({
webhook: config.DINGTALK_WEBHOOK, // Webhook地址
secret: config.DINGTALK_SECRET, // 安全设置:加签的secret
});
const feishuBot = new FeishuBot({
webhook: config.FEISHU_WEBHOOK, // Webhook地址
secret: config.FEISHU_SECRET, // 安全设置:加签的secret
});
module.exports = async function message(msg) {
console.log(msg);
dingBot.sendMessage(msg);
wxWorkBot(msg);
feishuBot.sendMessage(msg);
};
总结
好了,今天先写道这里吧,慢慢消化一下,明天我们补全几个平台的机器人事件,留个问题还有哪些公共方法会在爬虫中使用呢?除了puppeteer/mysql等我之前文章中提到过的。
如果喜欢我的文章,麻烦点个赞,评个论,收个藏,关个注。
手绘图,手打字,纯原创,摘自未发布的书籍:《高阶前端指北》,转载请获得本人同意。