HTTP基本原理
1. URI 和 URL
URI = URL(统一资源定位符,需要有路径) + URN(统一资源名称,只需要独一无二,例如ID card)
URL 统一格式:scheme://[username:password@]hostname[:port][/path][;parameters][?query][#fragment]
解释:
scheme: 协议 也称protocol
[username:password@]:用户名和密码
hostname:主机地址
port:端口
path:路径,网络资源在服务器中的指定地址,类比操作系统中目录
parameters:参数,访问资源的附加信息
query:查询,查询某类资源,比如地址https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd=%E4%BD%A0%E5%A5%BD%E6%9D%8E%E7%84%95%E8%8B%B1
问号后面限制了搜索引擎关键词
fragment:片段,对资源描述的部分补充.应用之一作为现代前端框架做路由管理,其二是HTML锚点(href = “#top”)
2. HTTP 和 HTTPS
HTTP只是单纯把超文本数据从网络传输到本地浏览器,HTTPS增加了SSL层,传输内容经过SSL加密.
这两个协议都是应用层协议,只负责信息传输的规范,其传输层还是TCP/IP(三次握手,四次挥手)协议,负责服务器和本地主机建立联系.
3.HTTP/HTTPS请求过程:
客户端发送Request(请求),服务器收到请求进行解析,然后服务器返回Response(响应).浏览器得到响应之后进行响应解析渲染呈现.
4.请求
请求 = 请求方法 + 请求网址 + 请求头 + 请求体
请求方法
常用get
和post
GET方法:
当输入网址按下回车的时候就已经输入了GET方法到服务器,请求参数(query)会和URL一起发给服务器.一个Get请求一次最多发送1024Byte大小数据
POST方法:
当输入账号密码等需要提交表单的时候就是发送了
post
方法,参数不会包含在URL中,而是包含在请求体里面发给服务器.发送的数据没有大小要求.
不常用方法有HEAD
,PUT
,DELETE
,CONNECT
,OPTIONS
,TRACE
.
- HEAD:类似于GET请求,但是Response中没有具体内容,用于获取响应头.
- PUT: 用客户端发送给服务器的数据取代指定文档中的内容(修改操作,共享文档
或许是) - DELET: 请求服务器删除指定页面(类似于不使用
blank
) - CONNECT: 通过服务器代替客户端访问其他网页(
VPN
) - OPTIONS: 允许客户端查看服务器性能
- TRACE: 回显服务器收到的请求,主要用于测试和诊断
请求网址
URL,不再赘述.请求头(headers)
服务器要使用的附加信息,常用来判断是否请求合法.常用请求头信息
- Accept: 请求报头域,用于指定客户端可接受哪些类型的信息
(神画了一条线,说你只能在此地,不能逾越) - Accept-Language: 用于指定客户端的语言类型
- Accept-Encoding:用于指定客户端可接受的编码(常用UTF-8,也有GBK)
- Host:用于指定请求资源的主机IP和端口号
- Cookie/Cookies: 网站用于辨别用户,进行会话跟踪而存储在 用户本地 的数据.功能是 维持当前访问会话.
例如:登录网站之后,客户端本地会保存服务器发来的Cookies,这样之后在网站内跳转,凭借Cookies就能保持登录状态,如果Cookies被删掉就要重新获得Cookies.(为了保证个人信息安全,请及时删除Cookies,以免病毒获得了你的Cookies,登入网站) - Referer:用于标识请求是从那个页面发过来,判断访问是否合法(你不能在不进入浏览器的情况直接进入某宝的付款页面,但是正常登录就行,因为Referer不合法),以及来源统计(网站统计访问人数和来源).
- User-Agent/UA:帮助服务器识别客户端使用的操作系统以及版本、浏览器和版本信息.爬虫加上此头用于模仿浏览器的正常访问,如果不加,该UA就是Python.
- Content-Type: 也叫互联网媒体类型或者MIME类型,在HTTP中用来表示具体请求中的媒体类型信息,例如
text/html
表示HTML
格式,image/gif
表示GIF
图片,application/json
代表json
类型请求体(body)
在GET中为空,POSI为提交的表单信息
Content-Type | Post提交数据方式 |
---|---|
application/x-www-form-urlencoded | 表单数据 |
multipart/form-data | 表单文件上传 |
application/json | 序列化json数据(一种数据交换格式,本质是js对象的字符串表示方法) |
text/xml | xml数据(一种可拓展标签语言,用来传递数据) |
5.响应
响应状态码
- 状态码分类:
分类 | 分类描述 |
---|---|
1xx | 信息,服务器收到请求,需要请求者继续执行操作 |
2xx | 成功,操作被成功接收并处理 |
3xx | 重定向,需要进一步的操作以完成请求 |
4xx | 客户端错误,请求包含语法错误或无法完成请求 |
5xx | 服务器错误,服务器在处理请求的过程中发生了错误 |
- 详解:
- 状态码
响应头
响应头包含服务器对请求的应答
- Date:日期
- Last_Modified:指定资源的最后修改时间
- Content_Encoding:指定响应内容的编码
- Server:服务器信息
- Content_Type:文档类型,见请求头Content_Type对应数据类型
- Set_Cookie:服务器传给客户端的Cookies,需要在下次访问网站时携带此Cookie
- Expires:用于指定响应的过期时间,在此时间内浏览器可把内容写入缓存,下次直接从缓存中获得.
响应体
客户端对于请求返回的响应数据皆在此部分.是爬虫的爬取目标.
6.HTTP2.0
二进制分帧层
- 帧是HTTP2.0中的概念.代表数据通信最小单位.比如请求头帧,请求体帧.
- 数据流:一个虚拟的双向通道,有唯一整数ID标识.
- 信息:与逻辑请求或响应信息对应的完整的一系列帧.
HTTP2.0 将HTTP协议通信分解为二进制编码帧的交换,帧对应特定数据流中的信息,在一个TCP中复用,从而提高效率.
多路复用
HTTP2.0通过讲HTTP消息分解为互不依赖的帧,交错发送,从而达到多路并行的效果(类似Pipeline),客户端再把这些帧拼接起来.
流控制
流控制是为了防止服务器向客户端发送过量数据,客户端来不及处理.因为HTTP2.0只在一个TCP内复用,无法使用TCP自带流控制API.
为了解决这一问题,HTTP2.0提供了简单构建块.