HTTP状态码429的含义

简介: HTTP状态码429的含义

今天我写了一个很简单的nodejs应用,使用module request同时向jianshu网站发起数个异步请求,通过分页的方式向简书请求我所有的文章列表。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 = 100;

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 testing

for(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);

     });  

    });

}我观察到一个很奇怪的现象:

当我把下图变量MAX的值设成很小,比如10以下,意思是一次只发送10个以下的并发请求,此时这个nodejs应用工作完全正常。

image.png然而当我把MAX改成100后,发现很多请求的数据并没有从jianshu网站上返回。经过调试发现,这些出问题的请求,接到的statusCode为429.image.pngimage.png百度学习了一下429的含义:


当你需要限制客户端请求某个服务的数量,也就是限制请求速度时,该状态码就会非常有用。在此之前,有一些类似的状态码。例如“509 Bandwidth Limit Exceeded”。

因此我这个应用要么降低并发请求的发送频率,要么把异步并发请求改成同步。


相关文章
|
1月前
|
缓存 UED 开发者
HTTP常用状态码详解
HTTP常用状态码详解
|
2月前
|
XML 存储 缓存
四、《图解HTTP》- 状态码
四、《图解HTTP》- 状态码
45 0
|
3月前
|
缓存 网络协议 数据库连接
C/S架构中HTTP错误状态码原因分析及解决办法
HTTP(Hypertext Transfer Protocol)是用于在客户端和服务器之间传输数据的协议。当在浏览器或其他HTTP客户端中访问网页时,可能会发生各种访问报错。我们需要根据网页提供的错误状态码分析错误原因,以找到相对应的解决办法。
41 0
|
3月前
什么是http状态码?
什么是http状态码?
20 0
|
3天前
|
Java
Servlet 教程 之 Servlet HTTP 状态码 3
该Servlet教程聚焦于HTTP状态码,示例展示如何向客户端发送407错误,提示&quot;Need authentication!!!&quot;. 类名为`showError`的Servlet扩展自`HttpServlet`,重写`doGet`和`doPost`方法。当遇到GET或POST请求时,它会设置HTTP状态码为407并附带错误信息。
11 2
|
2月前
|
缓存
什么是http状态码?常见的有哪些?分别代表什么含义?哪些场景会出现?
什么是http状态码?常见的有哪些?分别代表什么含义?哪些场景会出现?
|
3月前
|
网络协议
HTTP的状态码有哪些?
HTTP的状态码有哪些?
|
3月前
|
存储 缓存 网络协议
HTTP状态码II
HTTP状态码II
|
3月前
|
XML 缓存 安全
HTTP状态码I
HTTP状态码I