一、需求

在看《nodejs包教不包会》的时候,里面有 《使用 superagent 与 cheerio 完成简单爬虫》 这一节,对 superagent 不是很熟悉,因此就使用了 axios。(axios可以用于nodejs端发起http请求)

关键点在于 cheerio

这是一个在 nodejs 端类 jquery 语法的 DOM 解析库,能够非常方便的从获取到的 DOM 中获取需要的节点内容。

只能说异常强大

二、实现

其中使用了 express 作为接口内容的输出,最终是输出json数据列表。

使用 axios 进行 http 请求不是什么问题,关键的点在于获取到 html 之后,通过 const $ = cheerio.load(html) 实例化 cheerio。

const express = require('express');
const axios = require('axios');
const cheerio = require('cheerio');

const app = express();

const cnodeUrl = 'https://cnodejs.org';

app.get('/',(req,res,next)=>{
  axios.get(cnodeUrl).then((response)=>{
    const html = response.data;
    // 加载 html 内容
    const $ = cheerio.load(html);
    let list = [];
    // 进行首页帖子遍历
    $("#topic_list .cell").each((index,item)=>{
      const tmpData = {
        avatar:$(item).find('.user_avatar img').attr('src'),
        replies:$(item).find('.reply_count .count_of_replies').text().trim(),
        visits:$(item).find('.reply_count .count_of_visits').text().trim(),
        link:cnodeUrl + $(item).find('.topic_title_wrapper .topic_title').attr('href'),
        text:$(item).find('.topic_title_wrapper .topic_title').attr('title')
      };
      list.push(tmpData);
    });
    // 输出列表
    res.send(list);
  }).catch((err)=>{
    console.log(err);
    res.send(err);
  })
});

app.listen(3000,()=>{
  console.log('[Server at] : http://127.0.0.1:3000');
});

三、效果

1.jpg