注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

snoopyxdy的博客

https://github.com/DoubleSpout

 
 
 

日志

 
 

http请求头的顺序  

2012-09-24 22:39:55|  分类: node |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http协议请求头我们再熟悉不过了,一些诸如content-type,etag等等的协议头规定了我们如何使用http协议,以及反映着一些资源的状态。但是我们有注意过http请求头的顺序吗?
最近在做爬虫程序时发现了这个问题,在爬到某某网站时,发现之前的爬虫程序一直被爆40X错误,很是纳闷,我都是按照浏览器的请求头来伪造的,加上了referr还是如此。怀疑是因为利用算法禁止了ip地址,于是单独请求,发现还是有部分请求被挡住了,爬虫程序无法正常工作了。
但是浏览器端刷新一直很正常,于是将浏览器的请求头按照原封不动的顺序拷入爬虫程序,发现其可以正常使用了。
http请求头真的有顺序吗?下面我们看一下各个浏览器的http请求头情况。

准备投稿cnode,使用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下的截屏:
http请求头的顺序 - snoopyxdy - snoopyxdy的博客


http请求头的顺序 - snoopyxdy - snoopyxdy的博客

http请求头的顺序 - snoopyxdy - snoopyxdy的博客
 




然后我们利用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)
});


第一次请求头顺序如下:
http请求头的顺序 - snoopyxdy - snoopyxdy的博客
 
我们变化了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',}


第二次顺序如下:
http请求头的顺序 - snoopyxdy - snoopyxdy的博客
 
 我们看到,请求头的顺序根据我们发送headers的顺序改变了,所以http请求头是有顺序的。原因么因为http协议是基于TCP的,而tcp协议有一个重要的准则,它会严格的根据你发送的数据顺序传输数据,这也就保证了http请求头的顺序。
所以我们也可以利用这一点来对付爬虫程序,因为一般的浏览器都有一定的http请求头顺序,比如accept 必须在accpet-language和accpet-encoding之前。
  评论这张
 
阅读(1475)| 评论(4)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016