什么是HTTP Headers? 它包含了哪些内容? 利用requests.get()函数对豆瓣读书进行请求, 返回的r.headers如下所示:

>>> import requests
>>> r = requests.get('https://book.douban.com/')
>>> r.headers
{'X-Powered-By-ADS': 'chn-shads-4-12', 'X-Xss-Protection': '1; mode=block', 'X-DAE-App': 'book', 'X-Content-Type-Options': 'nosniff', 'Content-Encoding': 'gzip', 'Transfer-Encoding': 'chunked', 'Set-Cookie': 'bid=ZT-mRsxMMX0; Expires=Mon, 23-Oct-17 03:11:40 GMT; Domain=.douban.com; Path=/, __ads_session=2Yy49z4EzghqOiuo9gA=; domain=.douban.com; path=/', 'Expires': 'Sun, 1 Jan 2006 01:00:00 GMT', 'Vary': 'Accept-Encoding', 'X-DAE-Node': 'nain3', 'Server': 'ADSSERVER/44619', 'X-Douban-Mobileapp': '', 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'must-revalidate, no-cache, private', 'Date': 'Sun, 23 Oct 2016 03:11:40 GMT', 'Strict-Transport-Security': 'max-age=15552000;', 'X-DOUBAN-NEWBID': 'ZT-mRsxMMX0', 'Content-Type': 'text/html; charset=utf-8'}

'Content-Type': 'text/html; charset=utf-8'

这个是文档的mime-type, 浏览器根据此参数来决定如何对文档进行解析. 例如一个html页面返回值就是:

'text/html; charset=utf-8';

/前的'text'表示文档类型, /后面的'html'表示文档的子类型;

如果是图片,则返回: 'image/jpeg', 表示目标是一个图像(image), 具体是一个jpeg图像.

>>> p = requests.get('http://pic33.nipic.com/20130916/3420027_192919547000_2.jpg')
>>> p.headers['content-type']
'image/jpeg'

如果是pdf文档, 则返回'application/pdf'

>>> import requests
>>> s = requests.get('http://www.em-consulte.com/showarticlefile/738819/main.pdf')
>>> s.headers['Content-Type']
'application/pdf'

mime-type类型不止这三个, 还有其他的mime-type类型在这里可以看到.

'Cache-Control': 'must-revalidate, no-cache, private'

缓存控制字段用于指定所有缓存机制在整个请求/响应中必须服从的指令. 常见的取值有: private(默认), no-cache, max-age, must-revalidate

Cache指令 说明
public 所有的内容都将被缓存(客户端和代理服务器都可缓存)
private 内容只缓存到私有缓存中(客户端可缓存,代理服务器不可)
no-cache 必须先与服务器确认返回的相应是否被更改,然后才能使用该响应来满足对同一个网址的请求
must-revalidate 若缓存内容失效,请求必须发送到服务器/代理以进行重新验证
max-age=*** 缓存内容将在***s之后失效

缓存技术可以减轻服务器负载, 降低网络阻塞, 其基本思想是利用了客户访问的时间局部性(temporary location)原理, 将客户访问的内容在Cache里面放一个副本, 这样, 如果该内容再次被访问, 则不用再次发送请求, 而且直接将次网页从Cache里面拿出. 这个机制很好, 但是也可能造成问题: 1) 用户可能再次请求获取到的内容是过期的内容; 2) 如果缓存失效, 客户的访问延迟反而会比直接请求要增加;

'Expires': 'Sun, 1 Jan 2006 01:00:00 GMT'

Expires(期限)提供一个日期和时间, 响应在该日期和时间后被认为失效. 在过期时间前可以从缓存中取得数据, 而不需要再次请求.

它有一个缺点是它返回的是服务器端的时间, 如果客户端时间和服务器端时间不相同或者差别很大, 那么误差比较大. 有了Cache-control的max-age, 这个expires功能被替代.

Cache-control的优先级高于Expires, 都是用来指明当前资源的有效期. 但是Cache-control的设置更加细致.

第一次请求的过程:

第二次请求的过程:

'Content-Encoding': 'gzip'

1. 客户端向服务器发送HTTP request, request里面有Accept-Encoding: gzip, deflate (告诉服务器浏览器支持gzip压缩)

2. 服务器收到请求后, 生成原始的response, 其中有原始的Content-Type, Content-Length

3. 服务器通过gzip对response进行编码, 编码后的headers里面有Content-Type, Content-Length, 而且还有Content-Encoding: gzip, 然后把此response发送给客户端

4. 客户端收到response后, 根据Content-Encoding: gzip对response进行解码, 获取未压缩的response.

'Set-Cookie': 'bid=ZT-mRsxMMX0; Expires=Mon, 23-Oct-17 03:11:40 GMT; Domain=.douban.com; Path=/, __ads_session=2Yy49z4EzghqOiuo9gA=; domain=.douban.com; path=/'

cookie是web服务器向客户端发送的一段ASCII码文本, 一旦收到了cookie, 浏览器会把cookie的信息片段以"名/值"对(name-value pairs)的形式存储在本地. 这以后, 每当向同一个web服务器请求一个新文档时, web服务器变回发送之前存储在本地的cookie. 创建cookie最初的目的是想让web 服务器能够通过多个HTTP请求追踪客户.

参考:

[1] 浏览器 HTTP 协议缓存机制详解: https://my.oschina.net/leejun2005/blog/369148

[2] HTTP请求中的缓存(cache)机制: http://blog.chinaunix.net/uid-11639156-id-3214858.html

[3] http压缩 Content-Encoding: gzip: http://liuviphui.blog.163.com/blog/static/20227308420141843933379/

[4] 完整的Set-Cookie 头: http://blog.sina.com.cn/s/blog_70c4d9410100z3il.html

HTTP Headers解析的更多相关文章

  1. 请求头(request headers)和响应头(response headers)解析

    *****************请求头(request headers)***************** POST /user/signin HTTP/1.1    --请求方式 文件名 http ...

  2. 源码解析-Volley(转自codeKK)

    Volley 源码解析 本文为 Android 开源项目源码解析 中 Volley 部分项目地址:Volley,分析的版本:35ce778,Demo 地址:Volley Demo分析者:grumoon ...

  3. Volley 实现原理解析(转)

    Volley 实现原理解析 转自:http://blog.csdn.net/fengqiaoyebo2008/article/details/42963915 1. 功能介绍 1.1. Volley ...

  4. Volley 源码解析

    Volley 源码解析 1. 功能介绍 1.1. Volley Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架.在 Google I/O 2013 大会上发布. ...

  5. 05.Python网络爬虫之三种数据解析方式

    引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...

  6. python爬虫之数据的三种解析方式

    一.正则解析 单字符: . : 除换行以外所有字符 [] :[aoe] [a-w] 匹配集合中任意一个字符 \d :数字 [0-9] \D : 非数字 \w :数字.字母.下划线.中文 \W : 非\ ...

  7. Volley 源码解析(转)

    项目:Volley,分析者:grumoon,校对者:Trinea 本文为 Android 开源项目源码解析 中 Volley 部分项目地址:Volley,分析的版本:35ce778,Demo 地址:V ...

  8. 爬虫的三种解析方式(正则解析, xpath解析, bs4解析)

    一 : 正则解析 : 常用正则回顾: 单字符: . : 除换行符以外的所有字符 [] : [aoe] [a-w] 匹配集合中任意一个字符 \d : 数字 [0-9] \D : 非数字 \w : 非数字 ...

  9. Python爬虫之三种数据解析方式

    一.引入 二.回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需 ...

随机推荐

  1. Alpha 冲刺 —— 十分之十

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 测试整体软件 展示GitHub当 ...

  2. 《Linux内核设计与实现》学习总结 Chap18

    一.准备开始 1.一个确定的bug,但大部分bug通常都不是行为可靠且定义明确的. 2.一个藏匿bug的内核版本. 3.相关内核代码的知识和运气. 二.内核中的bug 1.bug的表象: 明白无误的错 ...

  3. 单点登录(四)-----遇到问题-----cas server 源码部署tomcat运行报错ClassNotFoundException: org.jasig.cas.CasEnvironmentCo

    情况 cas单点登录 cas server 源码部署tomcat运行报错 把cas server的代码下载下来后使用gradle插件或者maven插件以及转化成eclipse·后导入发现部署到tomc ...

  4. Java EE之JSTL(上)

    1.JSP标签和JSTL简介 JSP标签看起来就像普通的HTML或者XML标签一样.一个JSP标签将执行某些操作. 为了引用JSP标签必须使用正确的XML命名空间. <%@ taglib pre ...

  5. bzoj 4521: [Cqoi2016]手机号码

    感觉get到了一种数位dp的新姿势,加一位表示当前要填的数有没有限制(感觉以前的写法都太蠢了). 这么写有两个地方要注意: 1.每dp到一位时需要f[i][初始状态]++,相当于这位前都是前导零(这道 ...

  6. bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形

    USACO划水中... 题目中要求经过原点的三角形数目,但这种三角形没什么明显的特点并不好求,所以可以求不经过原点的三角形数量. 对于一个非法三角形,它离原点最近的那条边连接的两个点所连的两条边一定在 ...

  7. Git1:Git简介

    目录 什么是版本控制系统 集中式版本控制系统 分布式版本控制系统 Git起源 Git特性 什么是版本控制系统 版本控制系统是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.版本控制 ...

  8. GO_06:GO语言基础之struct

    结构struct 1. Go 中的struct与C中的struct非常相似,并且Go没有class 2. 使用 type <Name> struct{} 定义结构,名称遵循可见性规则(即首 ...

  9. Hadoop生态圈-使用MapReduce处理HBase数据

    Hadoop生态圈-使用MapReduce处理HBase数据 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对HBase表中数据进行单词统计(TableInputFormat) ...

  10. MySQL学习(二)——MySQL多表

    分页操作:使用limit(参数1,参数2) 起始位置(参数1))*每页显示的条数(参数2) .分类表 create table category( cid ) primary key, cname ) ...