关于sf笔记备份及迁移

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:



    
        
        
        
    
    
        

    htm暂时展示全部笔记内容,可根据接口备份到别的网站进行发布文章

    你可能感兴趣的:(nodejs爬虫)