zoukankan      html  css  js  c++  java
  • http请求头的顺序

    http协议请求头我们再熟悉不过了,一些诸如content-type,etag等等的协议头规定了我们如何使用http协议,以及反映着一些资源的状态。但是我们有注意过http请求头的顺序吗?

    最近在做爬虫程序时发现了这个问题,在爬到某某网站时,发现之前的爬虫程序一直被爆40X错误,很是纳闷,我都是按照浏览器的请求头来伪造的,加上了referr还是如此。怀疑是因为利用算法禁止了ip地址,于是单独请求,发现还是有部分请求被挡住了,爬虫程序无法正常工作了。
    但是浏览器端刷新一直很正常,于是将浏览器的请求头按照原封不动的顺序拷入爬虫程序,发现其可以正常使用了。
    http请求头真的有顺序吗?下面我们看一下各个浏览器的http请求头情况。
    使用nodejs代码:
    var http = require('http'),
        server = http.createServer(function (req, res){
      var body = JSON.stringify(req.headers) + '\n' + Object.keys(req.headers);
      res.end(body);
     }).listen(3000);
    我们分别看下chrome、ff还有IE下的截屏:

     
    后我们利用node构造一个请求,把请求头顺序打乱:
    var getfn = function(path, cb){
     var request  =  http.request({
       host:'192.168.1.220',
       port:3000,
       path:'/'+path,
       method:'GET',
       headers:{'Accept':'text/html',
          'Content-Type':'application/x-www-form-urlencoded', 
          'Content-Length':'19',
          'User-Agent':'node.js-v0.8.8', 
          'cookie':'userid=123456; mycookie2=abcdefg', 
          'X-Requested-With':'xmlhttprequest',
          'Connection':'keep-alive',
          'Referer':'http://www.cnodejs.org/'}
      }, function(res){
        var body = '';
        res.on('data', function(chunk) {
          // convert chunk to utf8 text:
           body += chunk;
          // process utf8 text chunk
         });
        res.on('end', function() {
          cb(res, body);
         });
      }).on('err', function(e){
       throw e;
      });
      request.end();
    }
    
    getfn('/', function(res, body){
     console.log(body)
    });

    第一次请求头顺序如下:

    我们变化了host,accept还有referer的位置:

    headers:{
      'host':'192.168.1.220',
      'Referer':'http://www.cnodejs.org/',
     'Content-Type':'application/x-www-form-urlencoded', 
      'Content-Length':'19',
      'User-Agent':'node.js-v0.8.8', 
     'cookie':'userid=123456; mycookie2=abcdefg', 
      'X-Requested-With':'xmlhttprequest',
     'Connection':'keep-alive',
      'Accept':'text/html',}

    第二次顺序如下:

    我们看到,请求头的顺序根据我们发送headers的顺序改变了,所以http请求头是有顺序的。原因么因为http协议是基于TCP的,而tcp协议有一个重要的准则,它会严格的根据你发送的数据顺序传输数据,这也就保证了http请求头的顺序。
    所以我们也可以利用这一点来对付爬虫程序,因为一般的浏览器都有一定的http请求头顺序,比如accept 必须在accpet-language和accpet-encoding之前。

     

     (转载)

  • 相关阅读:
    软件下载链接获取方法
    【转】Linux 查看端口占用情况
    [转]SpringBoot第十集:国际化与Webjars的应用(2020最新最易懂)
    【转】Vue生命周期理解(带图的哦)
    Visual Studio 2019&WebStorm&CMD 创建vue项目
    Qt-Button使用QSS变图片按钮
    Qt-滚动条QSS样式
    Qt-鼠标点击别处隐藏widget
    OSG-修改osg鼠标中轮放大缩小的操作键
    OSG-在使用单位的kit编译osgQOpenGL时提示“语法错误:"unit"的前面应有“:””
  • 原文地址:https://www.cnblogs.com/baiduomai/p/2730673.html
Copyright © 2011-2022 走看看