egg學習筆記第十六天:eggjs爬取數據並監控網站是否被篡改

1、爬取百度新聞數據。javascript

①首先看下咱們要爬取的網站數據:news.baidu.comhtml

 

②首先在service>spider.js下寫入以下方法,寫一個requestUrl方法 傳入url並獲取數據。java

"use strict";

const Controller = require("egg").Controller;

class SpiderController extends Controller {
  async requestUrl(url) {
    var result = await this.ctx.curl(url);
    return result;
  }
}
module.exports = SpiderController;

③schedule下新建一個定時任務watchdomin,寫入以下方法,每5s調用一次數據:node

module.exports = app => {
  return {
    schedule: {
      interval: "5s",
      type: "all"
    },
    async task(ctx) {
      var url = "https://news.baidu.com/";
      var result = await ctx.service.spider.requestUrl(url);
      console.log(result);
    }
  };
};

④由控制檯可知,爬取到了數據:jquery

⑤對spider.js稍做改動,則可知打印出來的數據是一堆頁面信息。npm

 

2、檢測網站是否掛掉。服務器

首先介紹cheerio模塊:app

cheerio是nodejs的抓取頁面模塊,爲服務器特別定製的,快速、靈活、實施的jQuery核心實現,適合各類Web爬蟲程序。dom

通俗地講:cheerio模塊能夠讓咱們用jquery語法來解析爬取的網頁數據。curl

https://www.npmjs.com/package/cheerio

cheerio的用法:

①安裝cnpm i cheerio --save

②加載要解析的內容 const $  = cheerio.load('<h2 class="title">Hello World</h2>')

③$('title').html()  獲取要匹配的標題內容。

將watchdomin.js作一些修改:

var cheerio = require("cheerio");
module.exports = app => {
  return {
    schedule: {
      interval: "5s",
      type: "all"
    },
    async task(ctx) {
      var url = "https://news.baidu.com/";
      var result = await ctx.service.spider.requestUrl(url);
      var htmlData = result.data.toString();
      // 檢測網站是否被篡改,檢測網站是否會掛掉

      const $ = cheerio.load(htmlData);
      console.log($("title").html());
    }
  };
};

可得打印出來的title是一堆亂碼,那麼,如何解決呢?load方法裏面穿入一個配置參數{ decodeEntities: false },則打印出正常中文。

實現相似網站監控,看title的值有無被篡改:

var cheerio = require("cheerio");
module.exports = app => {
  return {
    schedule: {
      interval: "5s",
      type: "all"
    },
    async task(ctx) {
      var url = "https://news.baidu.com/";
      var result = await ctx.service.spider.requestUrl(url);
      var htmlData = result.data.toString();
      // 檢測網站是否被篡改,檢測網站是否會掛掉

      const $ = cheerio.load(htmlData, { decodeEntities: false });
      var title = $("title").html();
      if (title != "百度新聞——海量中文資訊平臺") {
        console.log("網站掛掉了,或者被篡改了");
      } else {
        console.log("正常");
      }
    }
  };
};

爬取其餘數據的基本寫法,與jquery基本相似。

打完收工。

相關文章
相關標籤/搜索