- 本章使用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对象返回

解析后结果