《高阶前端指北》之Node爬虫脚手架(第五弹)

1,312 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

之前几个文章我们逐步学习了Node爬虫的AABBCC,这次为了一劳永逸,我们封装一个脚手架。方便大家低门槛上手,低成本起飞。

起步

定位很清晰,让所有了解JS的同学最终都能够通过JS操作JS能实现的一切。

实战中成长,实战中学习,一直以来都是院长信奉的真理。

仓库地址:github.com/tobe-fe-dal…

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等。你仍然可以添加一些自定义比如isAutoisAllIn等配置

接口请求配置

个人比较喜欢使用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等我之前文章中提到过的。

如果喜欢我的文章,麻烦点个赞评个论收个藏关个注

手绘图,手打字,纯原创,摘自未发布的书籍:《高阶前端指北》,转载请获得本人同意。