NodeJS服务端接口获取简书文章列表

  • 本章使用NodeJS服务端接口获取简书文章列表数据转换成JSON返回

查看简书网站发现请求文章接口:

https://www.jianshu.com/u/xxxxx?page=1 // xxxx换成自己的简书id

原始接口响应数据为HTML:

原始数据

目标

通过NodeJS发送请求获取文章列表响应数据,解析html成如下JSON数据返回:

[{
  {
    "title": "解决 vite build打包报错Top-level await is not available in the configured target",
    "abstract": "一、错误原因最高层中不让使用 await二、解决方案1.引入vite-plugin-top-level-await 2.在    vite.config...",
    "read": "6940",
    "time": "2023-03-30 09:55"
  },
....
}]

创建工程

项目根目录文件夹运行如下命令:

npm init   //初始化一个新包并生成 package.json 文件

安装插件

npm i express  // Express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架
npm i cheerio  // cheerio 是一个专为 Node.js 服务器环境设计的快速、灵活且优雅的 HTML 和 XML 解析库,其 API 设计借鉴了 jQuery,可以理解成服务端jQuery
npm i axios // Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中

启动命令

package.json的scripts中添加命令:

scripts: {
  "dev": "node index"
}

index.js

/**
 * @author: 圆梦
 * @desc: 抓取简述书文章列表信息
 */
// 导入 express 模块
const express = require('express');
// 导入 cheerio 模块
const cheerio = require('cheerio');
// 创建请求实例
const app = express();
// 导入 axios 模块
const axios = require('axios');
// 端口
const port = 3000;

/**
 * 格式化日期
 * @param {*} dateStr 
 * @returns 
 */
function formatDateTime(dateStr) {
  const date = new Date(dateStr);
  
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  const hours = String(date.getHours()).padStart(2, '0');
  const minutes = String(date.getMinutes()).padStart(2, '0');
  const seconds = String(date.getSeconds()).padStart(2, '0');
  
//   return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
  return `${year}-${month}-${day} ${hours}:${minutes}`;
}

/**
 * 默认请求
 */
app.get('/', (req, res) => {
    res.send('Hello!')
});

/**
 * 抓取简述书文章列表信息
 * 服务端接口: /getList?page=2
 */
app.get('/getList', async (req, res) => {
    //
    let params = req.query;
    // 查询页数
    let page = params.page || 1;
        // xxxx换成自己的简书id
    let url = `https://www.jianshu.com/u/xxxx?page=${page}`;
    // 发送请求
    const response = await axios.get(url, {
        headers: {}
    });
    //
    let data =  response.data;
    // 
    let result = [];
    // 解析html数据
    let $ = cheerio.load(data);
    let noteListEl = $('.note-list>li>.content');
    noteListEl.each(function(index, item) {
        let itemEl = $(item);
        // 标题
        let title = itemEl.find('.title').text().trim();
        // 摘要
        let abstract = itemEl.find('.abstract').text().trim();
        // 阅读数
        let read = itemEl.find('.meta a').eq(0).text().trim();
        // 时间
        let time = formatDateTime(itemEl.find('.meta .time').attr('data-shared-at'));
        //
        result.push({
            title,
            abstract,
            read,
            time,
        });
    });
    console.log('response.data:', result);
    // 响应json数据
    res.json(result);
    // 响应结束
    res.end();
});

/**
 * 监听端口
 */
app.listen(port, () => {
    console.log(`服务启动成功端口: ${port}`)
});

启动服务

使用npm run dev启动,浏览器访问:http://localhost:3000/getList?page=2

转换成JSON对象返回

解析后结果

相关文档

Cheerio服务端jQuery
Express Web框架
Axios 请求库

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容