老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

批量導出某個簡書用戶的所有文章列表和文章超鏈接

簡書改版后,根據文章標題搜索文章的功能就不見了。

創新互聯公司服務項目包括閩清網站建設、閩清網站制作、閩清網頁制作以及閩清網絡營銷策劃等。多年來,我們專注于互聯網行業,利用自身積累的技術優勢、行業經驗、深度合作伙伴關系等,向廣大中小型企業、政府機構等提供互聯網行業的解決方案,閩清網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到閩清省份的部分城市,未來相信會繼續擴大服務區域并繼續獲得客戶的支持與信任!

批量導出某個簡書用戶的所有文章列表和文章超鏈接

雖然簡書提供了批量下載文章的功能,但是下載到本地的文章都是markdown格式的,不包含文章的鏈接,這不滿足我的需求。

既然我是程序員,沒有這個功能我就自己實現一個。

打開簡書首頁,發現默認只顯示8篇文章,用鼠標滑動到屏幕底部后,會觸發一個懶加載事件,到后臺讀取更多的文章列表,所以文章讀取在服務器端是采取的分頁實現。

批量導出某個簡書用戶的所有文章列表和文章超鏈接

打開Chrome開發者工具,觀察網絡請求,請求url中99b8712e8850是我簡書用戶id,page=2,3,4這些是分頁代碼。

批量導出某個簡書用戶的所有文章列表和文章超鏈接

每頁的文章內容以html格式包含在響應結構里:

批量導出某個簡書用戶的所有文章列表和文章超鏈接

我關心的只是文章標題和文章鏈接,如上圖高亮字段所示。

最開始我寫了一個nodejs應用,代碼如下:

var request = require('request');var jsdom = require("jsdom");var JSDOM = jsdom.JSDOM;const PREFIX = "https://www.jianshu.com";const PAGE = "https://www.jianshu.com/u/99b8712e8850?order_by=shared_at&page=";const MAX = 2;var mArticleResult = new Map();var pageNumber;/* a given article: https://www.jianshu.com/p/963cd23fb092
  value got from API: /p/5c1d0319dc42
*/var lastPageReached = false;var url = "";var aHandlers = [];// use limited for loop to ease testingfor(var i = 0; i < MAX; i++){
  pageNumber = i + 1;  var url = PAGE + pageNumber;  // console.log("current page: " + url);
  var pageOptions = {        url: url,        method: "GET",        headers: {            "Accept": "text/html"
        }
  };
  aHandlers.push(getArticles(pageOptions, pageNumber));  if( lastPageReached)    break;
}console.log("promise handler size: " + aHandlers.length);Promise.all(aHandlers).then(function(){  var articleIndex = 0;  for (var [key, value] of mArticleResult) {    console.log("Article[" + articleIndex++ + "]: " + key + " = " + value);
  }  console.log("done");
}
  );function getArticles(pageOptions, pageNumber) {  return new Promise(function(resolve,reject){      var requestC = request.defaults({jar: true});
      requestC(pageOptions,function(error,response,body){        if( error){          console.log("error: " + error);
          resolve(error);
        }        var document = new JSDOM(body).window.document;        var content = document.getElementsByTagName("li");        for( var i =0; i < content.length; i++){          var li = content[i];          var children = li.childNodes;          for( var j = 0; j < children.length; j++){              var eachChild = children[j];              if( eachChild.nodeName == "DIV"){                var grandChild = eachChild.childNodes;                for( var k = 0; k < grandChild.length; k++){                  var grand = grandChild[k];                  if( grand.nodeName == "A"){                    var fragment = grand.getAttribute("href");                    if( fragment.indexOf("/p") < 0)                      continue;                    console.log("title: " + grand.text);                    var wholeURL = PREFIX + fragment;                    console.log("url: " + wholeURL);                    if( mArticleResult.has(grand.text)){
                      lastPageReached = true;                      console.log("article size: " + mArticleResult.size);
                      resolve(pageNumber);
                    }
                    mArticleResult.set(grand.text, wholeURL);
                  }
                }
              }
          }
        }// end of outer loop
        resolve(pageNumber);
      }); 
     });
}

原理就是使用nodejs的request module,向簡書網站同時發起多個請求,每個請求讀取一頁的簡書文章。

后來發現這種方法在并發請求數大于10個的時候就無法工作,簡書網站會拒絕該類請求,返回HTTP 429狀態碼。

所以最后我采用了最簡單的同步請求實現,使用了nodejs提供的sync-request在循環里發起請求。

var request = require("sync-request");var jsdom = require("jsdom");var JSDOM = jsdom.JSDOM;var textEncoding = require('text-encoding'); 
var textDecoder = textEncoding.TextDecoder;const PREFIX = "https://www.jianshu.com";const PAGE = "https://www.jianshu.com/u/99b8712e8850?order_by=shared_at&page=";const MAX = 100;var mArticleResult = new Map();var lastPageReached = false;var pageNumber;/* a given article: https://www.jianshu.com/p/963cd23fb092
  value got from API: /p/5c1d0319dc42
*/try {    // use limited for loop to ease testing
    for (var i = 0; i < MAX; i++) {        if( lastPageReached)          break;
        pageNumber = i + 1;        var url = PAGE + pageNumber;        console.log("current page: " + url);        var response = request('GET', url);        var html = new textDecoder("utf-8").decode(response.body);
        handleResponseHTML(html);
    }
} 
catch (e) {
}var articleIndex = 0;var resultHTML = "";const fs = require('fs');/*

eee

22

33

*/var index = 1;for (var [key, value] of mArticleResult) {    var article = "

" +      index++ + ". " + value + "

" + "\n";     resultHTML = resultHTML + article;    console.log("Article[" + articleIndex++ + "]: " + value + " = " + key); } resultHTML = resultHTML + "";var pwd = process.cwd() + "/jianshu.html"; fs.appendFileSync(pwd, resultHTML);console.log("done");function handleResponseHTML(html) {    var document = new JSDOM(html).window.document;    var content = document.getElementsByTagName("li");    for (var i = 0; i < content.length; i++) {        var li = content[i];        var children = li.childNodes;        for (var j = 0; j < children.length; j++) {            var eachChild = children[j];            if (eachChild.nodeName == "DIV") {                var grandChild = eachChild.childNodes;                for (var k = 0; k < grandChild.length; k++) {                    var grand = grandChild[k];                    if (grand.nodeName == "A") {                        var fragment = grand.getAttribute("href");                        if (fragment.indexOf("/p") < 0)                            continue;                        // console.log("title: " + grand.text);                         var wholeURL = PREFIX + fragment;                        // console.log("url: " + wholeURL);                         if (mArticleResult.has(wholeURL)) {                             lastPageReached = true;                            console.log("article size: " + mArticleResult.size);                            return;                         }                         mArticleResult.set(wholeURL, grand.text);                     }                 }             }         }     } }

這個nodejs應用執行后,會在本地生成一個html文件,包含每篇文章的標題和超鏈接。

批量導出某個簡書用戶的所有文章列表和文章超鏈接

要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":

批量導出某個簡書用戶的所有文章列表和文章超鏈接

本文標題:批量導出某個簡書用戶的所有文章列表和文章超鏈接
當前路徑:http://www.xueling.net.cn/article/ppeoic.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 韩国精品在线 | 国产熟妇搡BBBB搡BBBB | 亚洲人成伊人成综合网76 | 亚洲最大的av在线 | 最新国产精品毛片在线 | 粗大猛烈进出呻吟声视频 | 国产成人午夜福利在线播放 | 国产美女91呻吟求 | 夜夜操人人 | 毛片免费视频播放 | 国产成人精品久久一区二区三区 | 东北丰满老熟女 | 伊人久久大线影院首页 | 国产成人亚洲中文字幕视频 | 2021国产在线观看不卡视频 | 国产精品第3页 | 亚洲色啦啦狠狠网站 | 人人爱天天爱天天摸天天做天天爽 | 免费午夜无码视频在线观看 | 99爱中文字幕高清视频 | 久久精品久久久久久 | 国产欧美日韩在线观看视频 | 久久久亚洲欧洲日产国码αv | 性a欧美片 | 精品入口麻豆88视频 | 色老板美国在线观看 | 欧美一区二区网站 | 欧美高清视频看片在线观看 | 精品人妻无码一区二区三区打不开 | 国产精品成人观看视频免费 | 99三级视频 | 国产成人AV在线影院 | 欧美韩一级片 | av软件大全 | 中文字幕视频精品一区二区三区 | 欧美日韩在线不卡 | 欧美日韩一区二区三区自拍 | 久久9国产偷伦 | 国产第一二区 | 国产精品久久精品三级 | 国产短视频在线观看 |