用node写爬虫系列二:纪念币预约提醒

在上一家公司的时候从同事那里了解到每年的某个时候可以到银行预约换取纪念币,以前一直以为纪念币是花钱买的,真的有些孤陋寡闻了。每年的某个时候国家会发行一篇纪念币,有生肖纪念币,还有一些重大事件的纪念币比如航天纪念币,而对于预约时间,我们一般都是主动的去看银行的公告信息,但是如果忘记看了,可能就漏掉了,那么我们如何被动的被告知纪念币的最新消息呢?本文的主题就是实现一个爬虫,并设置相关测策略,当纪念币有新的动态时主动的通过微信或者邮件等方式将新消息推送给我们。

需求已经明确了,那么如何实现这个爬虫呢?

我们都知道爬虫就是利用程序去代替手工去访问网页获取信息,既然要获取信息我们总得找一个能获取我们期望信息的网页,接触过纪念币的不难知道,中国人民银行官方网站下有一个栏目是专门发表纪念币相关动态的,

网址:http://www.pbc.gov.cn/huobijinyinju/147948/147964/index.html

知道了目标站点,剩下的就是开始实现我们的爬虫了,老规矩,我们先新建一个目录Souvenir,用于放我们的项目源文件,然后在该目录初始化我们的项目并安装相关依赖:

初始化项目:

npm init -y

安装依赖:

npm i request cheerio fs-estra --save

然后新建文件app.js作为程序的入口文件,我们还得放一个readed.json并初始内容"{}", 用于存储爬取过的url,避免重复爬取,最终的目录结构如下:

- Souvenir
  - app.js
  - readed.json
  - package.json

然后开始app.js的代码编写:

const path = require('path');
const fs = require('fs-extra');
const request = require('request');
const cheerio = require('cheerio');

const DOMAIN = 'http://www.pbc.gov.cn'
const URL = `${DOMAIN}/huobijinyinju/147948/147964/index.html`;

const READED_PATH = path.join(__dirname, './readed.json');
const readedData = fs.readJSONSync(READED_PATH);

grab();

function grab() {
  request({
    url: URL,
    method: 'POST'
  }, (err, response, body) => {
    if (!err) {
      const $ = cheerio.load(body);
      const $lists = $('.newslist_style');
      let abstract = '';
      $lists.each((index, item) => {
        const _this = $(item);
        const $link = _this.find('a');
        const url = `${DOMAIN}${$link.attr('href')}`;
        if (!readedData[url]) {
          const title = $link.attr('title');
          abstract += `${title}\r\n\r\n${url}\r\n\r\n`;
          readedData[url] = 1;
        }
      });
      if (abstract) {
        sendMessage('纪念币有新动态!', abstract);
        fs.writeJsonSync(READED_PATH, readedData);
      } else {
        console.log('无新动态!');
      }
    }
  });
}

function sendMessage(title, content) {
  request({
    url: `https://sc.ftqq.com/SCU43320Tb8f1c7232560d9aa45f9b3c60b3d99ad5c4bf326b4df0.send?text=${encodeURIComponent(title)}&desp=${encodeURIComponent(content)}`
  })
}

这里需要主要的时候请求的时候需要使用POST方式,用GET方式请求的东西是不对的,不知道做了什么限制。对于通知还是使用了server酱来做微信消息的推送。

爬虫实现好了之后,剩下的只需要在我们的机器部署我们的爬虫,然后设置cronjob定时运行(比如晚上12点)我们的脚本就好了,如果有新动态会通过微信通知给我们。记住一定不要把设置的太频繁,每天一次就好了。

系列文章导航:

第1节: 用node写爬虫系列一:小说下载器

第3节: 用node写爬虫系列三:代理IP池

  • 支付宝二维码 支付宝
  • 微信二维码 微信
相关文章