sf笔记支持Markdown语法和常用编程语法,而且简约,个人感觉很好用,唯一缺少就是笔记分类归档。
sf提供了编辑时笔记,访问路径:笔记url+/raw
实现思路:
1.使用爬虫获取全部笔记列表,获取title和href。
2.通过https://segmentfault.com+href+/raw
获得全部笔记编辑时内容。(通过https://segmentfault.com+href+/raw
获得全部笔记编辑时内容)
使用:
需要提供个人登录当前cookie
修改js文件中cook
变量
const cook =`PHPSESSID=web2~a……
自行安装依赖 express,superagent,cheerio
js:
const express = require('express');
const app = express();
const superagent= require('superagent');
const cheerio = require('cheerio');
const cook =`xxx`;
//笔记列表
var page = 1;
var nots = []; //最终返回数据
var errorStop = 0;
//笔记详情
var nindex = 0; //当前笔记页
var notsArr = [];
let getHotNews = (res) => {
let $ = cheerio.load(res.text);
let dom = $('.drafts-stream .title a');
//翻页数据停止
errorStop = dom && dom.length ? 0 : 1;
// 找到目标数据所在的页面元素,获取数据
$('.drafts-stream .title a').each((idx, ele) => {
let url = $(ele).attr('href').indexOf('?')!=-1 ? $(ele).attr('href').split('?')[0]:$(ele).attr('href');
let news = {
title: $(ele).text(), // 获取标题
href:'https://segmentfault.com'+ url + '/raw' // 获取链接
};
nots.push(news) // 存入最终结果数组
});
page++;
};
//获取笔记详情
function getNoteContent(endData){
if( nindex+1 <= nots.length){
console.log(nindex,nots[nindex].href)
superagent.get(nots[nindex].href).set('Cookie',cook).end((err, res) => {
if(!err){
let $ = cheerio.load(res.text);
notsArr.push({title:nots[nindex].title,content:res.text});// endData.send(notsArr)
nindex++;
getNoteContent(endData)
}else{
endData.send({data:notsArr});
}
});
}else{
endData.send({data:notsArr})
}
}
//获取笔记列表
function getNotes(req,res){
superagent.get('https://segmentfault.com/user/note?page=' + page).set('Cookie',cook).end((err1, res1) => {
if (!err1) {
getHotNews(res1);
if(!errorStop){
getNotes(req,res)
}else{
//如果无笔记则返回前端
getNoteContent(res)
}
} else {
errorStop = 1;
console.log(`抓取失败 - ${err1}`)
}
});
}
app.get('/', function (req, res) {
res.header("Access-Control-Allow-Origin", "*");
//允许的header类型
res.header("Access-Control-Allow-Headers", "content-type");
//跨域允许的请求方式
res.header("Access-Control-Allow-Methods", "DELETE,PUT,POST,GET,OPTIONS");
page = 1;
nots = []; //最终返回数据
errorStop = 0;
//笔记详情
nindex = 0; //当前笔记页
notsArr = [];
getNotes(req, res);
});
let server = app.listen(5100, function () {
let host = server.address().address;
let port = server.address().port;
console.log('Your App is running at http://%s:%s', host, port);
});
html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="https://cdn.bootcss.com/axios/0.19.0/axios.js"></script>
</head>
<body>
<div id="app">
<ul id="ul"></ul>
</div>
<script type="text/javascript">
function escape2Html(str) {
var arrEntities={'lt':'<','gt':'>','nbsp':' ','amp':'&','quot':'"'};
return str.replace(/&(lt|gt|nbsp|amp|quot);/ig,function(all,t){return arrEntities[t];});
}
axios('http://127.0.0.1:5100').then((res)=>{
let data ='';
res.data.data.forEach((item,i)=>{
data+="<li><h4>"+(i+1)+". "+ item.title +"</h4><div><pre><xmp>"+escape2Html(item.content)+"</xmp></pre></div></li>"
})
document.getElementById('ul').innerHTML = data;
});
</script>
</body>
</html>
htm暂时展示全部笔记内容,可根据接口备份到别的网站进行发布文章
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。