文章目录
HTTP基本原理
URL
URL是统一资源定位符。我们在浏览器中访问一个网页时,输入的链接就是URL。URL的格式是有一定的规范要求的,基本的组成格式如下:
scheme://[username:password@]hostname[:port][/path][;parameters][?query][#fragment]
其中,中括号里面的内容是非必要的。
scheme
协议,常用的有http,https,ftp等username、password
用户名和密码。有时URL需要提供用户名和密码才可以访问,例如https://ssr3.scrape.center/这个URL需要用户名和密码才可以访问。我认为把用户名和密码放在URL中,这种做法现在不常见。
hostname
主机地址。域名或者时ip。post
端口。时服务器端设定的端口path
路径。网路资源在服务器中的指定地址。parameters
参数 。现在用的不多。一般都是使用query,并且将query当成parameters。query
查询。https://www.baidu.com/s?wd=query&rsv_spt=1
这个链接中的wd=query&rsv_spt=1
就是query,也就是get请求时,链接后面带的参数(现在一般称之为参数,而不是query。)
fragment
片段。可以认为是资源内部的标签。主要是用作单页面路由或者HTML锚点。
HTTP、HTTPS
前文说,scheme
支持的协议有很多,爬虫时最常用的协议有两种:HTTP、HTTPS
HTTP
HTTP是超文本传输协议。作用是把超文本数据从网络传输到本地浏览器,可以保证高效而准确地传输超文本文档。目前广泛使用的是HTTP1.1,但是也有很多网站支持HTTP2.0。
HTTPS
HTTPS是HTTP的安全版。在HTTP下加入SSL层。HTTPS的安全基础是SSL。
SSL的作用主要有:
- 建立一个信息安全通道,保证数据传输的安全性
- 确认网站的真实性。
目前,网站使用HTTPS协议是大势所趋。
HTTP请求过程
我们在访问一个网页时,通常是在浏览器地址栏输入一个URL,按下回车键便可看到对应页面的内容。
实际上,这个过程是浏览器先向网站所在的服务器发送一个请求,网站服务器接收到请求后对其进行处理和解析,然后返回对应的响应,接着传回浏览器,浏览器再对其进行解析,将页面展示出来。
打开google浏览器,访问百度。按键F12
打开“开发者工具”,切换到network
面板,重新加载页面。可以看到很多的条目信息。如下图所示。
各列的含义如下:
name
请求的名称status
响应状态码protocol
请求的协议类型type
请求的文档类型Initiator
请求源size
请求得到的文件或者资源的大小time
从发起请求到接收到响应所花费的时间waterfall
网络请求的可视化瀑布流
单击www.baidu.com
这个条目,可以看到更详细的信息。如下图所示:
最上面是的General
,详细内容如下:
Request URL
请求的URLRequest Method
请求的方法Status Code
响应状态码Remote Address
远程服务器的地址和端口Referrer Policy
Referrer判断策略
后面还有Response Headers
和Request Headers
,分别是响应头和请求头
请求 request
请求(request)是指 客户端向服务器发送信息。分为四部分:
- 请求方法 request method
- 请求网址 request url
- 请求头 request headers
- 请求体 request body
请求方法 request method
请求方法是用于标识客户端向服务端请求信息的方式。常见的请求的方法有两种:GET和POST
- 在浏览器中直接输入URL并回车,就发起了一个GET请求。GET请求的参数会直接包含在URL中,即前文提到的
query
。GET请求提交的数据最多可以1024字节。 - POST请求大多是提交表单时发起。表单数据是通过表单形式传输,包含在请求体中,在URL中不会体现。并且对于提交的数据没有大小限制。例如登录时提交用户名和密码,如果采用GET方式,用户名和密码会直接暴露在URL中,可能会造成密码泄露,因此采用POST方式才是恰当的。还有传输文件时,文件比较大,也是采用POST比较合适。
常用的请求方式是GET和POST请求,但是还有一些其他的请求。下表参考菜鸟教程
方法 | 描述 |
---|---|
get | 请求页面,并返回页面内容 |
head | 与get类似,但是返回的响应中没有具体内容,用于获取报头 |
post | 用于提交表单或上传文件,数据包含在请求体中 |
put | 用客户端传向服务器的数据取代指定文档中的内容 |
delete | 请求服务器删除指定的页面 |
connect | 把服务器当做跳板,让服务器代替客户端访问其他页面 |
options | 允许客户端查看服务器的性能 |
trace | 回显服务器收到的请求。主要用于测试或诊断 |
请求网址 request url
请求的网址即URL,前文已述。
请求头request headers
请求头即说明服务器要使用的附加信息。比较重要的有:Cookie
、Referer
、User-Agent
等
常用的请求头信息如下:
Accept
请求报头域, 用于指定客户端可以接收哪些类型的信息Accept-Encoding
指定客户端可以接收的内容编码Accept-Language
指定客户端可以接收的语言类型Host
指定请求资源的主机IP和端口号。Cookie
网站为了辨别用户,进行会话跟踪而存储在用户本地的数据。主要的功能是维持当前访问会话。Referer
标识请求从哪个页面发过来,服务器可以拿到这个信息并做响应的处理,如来源统计、防盗链处理等User-Agent
可以使服务器识别客户端的操作系统及版本、浏览器及其版本等信息。在爬虫时,如果不加此信息,很可能被识别出来Content-Type
用来表示具体请求中的媒体类型信息。text/html表示HTML格式,
请求头是请求的重要组成部分,在写爬虫时,通常需要设定请求头。
请求体 request body
请求体一般是POST请求的表单信息。GET请求时,请求体为空。
在提交表单时,根据提交数据方式的不同,请求头中Content-Type
也不一样,具体如下表:
Content-Type | POST提交数据的方式 |
---|---|
application/x-www-form-urlencode | 表单数据 |
multipart/form-data | 表单文件长传 |
application/json | 序列化JSON数据 |
text | xml |
在爬虫时,构造POST请求需要使用正确的Content-Type
,否则可能会导致POST提交后无法得到正常响应。
响应 response
响应由服务器返回给客户端。包括三部分:响应状态码、响应头、响应体
响应状态码 response status code
响应状态码表示服务器的响应状态。在爬虫时可以根据状态码判断服务器的响应状态,如果状态码是200,就处理数据,否则就直接忽略。
常见的错误状态码及错误原因如下表所示:
状态码 | 说明 | 详情 |
---|---|---|
100 | 继续 | 请求者应当继续提出请求。服务器已接收到请求的一部分,正在等待其余部分 |
101 | 切换协议 | 请求者已要求服务器切换协议,服务器已确认并准备切换 |
200 | 成功 | 服务器已成功处理了请求 |
201 | 已创建 | 请求成功并且服务器创建了新的资源 |
202 | 已接收 | 服务器已接收请求,但尚未处理 |
203 | 非授权信息 | 服务器已成功处理了请求,但是返回的信息可能来自另一个源 |
204 | 无内容 | 服务器成功处理了请求,但是没有返回任何内容 |
205 | 重置内容 | 服务器成功处理了请求,内容被重置 |
206 | 部分内容 | 服务器成功处理了部分内容 |
300 | 多种选择 | 针对请求,服务器可执行多种操作 |
301 | 永久移动 | 请求的网页已永久移动到新位置,永久重定向 |
302 | 临时移动 | 请求的网页暂时移动到新位置,暂时重定向 |
303 | 查看其他位置 | 如果原来的请求时POST,重定向目标文档应当通过GET提取 |
304 | 未修改 | 此次请求返回的网页未经修改,继续使用上次的资源 |
305 | 使用代理 | 请求者应当使用代理访问该页面 |
307 | 临时重定向 | 临时从其他位置响应请求的资源 |
400 | 错误请求 | 服务器无法解析该请求 |
401 | 未授权 | 请求没有进行身份验证或者验证未通过 |
403 | 禁止访问 | 服务器拒绝此请求 |
404 | 未找到 | 服务器找不到请求的网页 |
405 | 方法禁用 | 服务器禁用了请求中指定的方法 |
406 | 不接收 | 无法使用请求的内容响应请求的网页 |
407 | 需要代理授权 | 请求者需要使用代理授权 |
408 | 请求超时 | 服务器请求超时 |
409 | 冲突 | 服务器在完成请求时发生冲突 |
410 | 已删除 | 请求的资源已永久删除 |
411 | 需要有效长度 | 服务器不接收不含有效内容长度标头字段的请求 |
412 | 未满足前提条件 | 服务器未满足请求者在请求中设置的某一个前提条件 |
413 | 请求实体过大 | 请求实体过大,超出服务器的处理能力 |
414 | 请求URI过长 | 请求网址过长,服务器无法处理 |
415 | 不支持类型 | 请求格式不被请求页面支持 |
416 | 请求范围不符 | 页面无法提供请求的范围 |
417 | 未满足期望值 | 服务器未满足期望请求头字段的要求 |
500 | 服务器内部错误 | 服务器遇到错误,无法完成请求 |
501 | 未实现 | 服务器不具备完成请求的能力 |
502 | 错误网关 | 服务器作为网关或代理,接收到上游服务器的无效响应 |
503 | 服务器不可用 | 服务器目前无法使用 |
504 | 网关超时 | 服务器作为网关或代理,没有及时从上游服务器接收到请求 |
505 | HTTP版本不支持 | 服务器不支持请求中使用的HTTP协议版本 |
响应头 response headers
响应头包含了服务器对请求的应答信息。常用的有:
Date
标识响应产生的时间Last-Modified
指定资源的最后修改时间Content-Encoding
指定响应内容的编码Server
服务器的信息Content-Type
指定返回的数据是什么类型Set-Cookie
设置Cookie。告诉浏览器下次请求时,把Cookie带上Expires
指定响应的过期时间,可以让代理服务器或浏览器将加载的内容更新到缓存中。
响应体 response body
响应体是爬虫最关键的部分,响应的正文数据都在响应体中。在做爬虫处理时,要解析的内容就是响应体
HTTP2.0
HTTP协议从2015年起就发布了2.0版本,相对于HTTP1.x,HTTP2.0更快、更简单、更稳定。HTTO2.0在传输层做了很多优化,它的主要目标是通过支持完整的请求与响应复用来减少延迟,并通过有效压缩HTTP请求头字段的方式将协议开销降至最低。同时增加对请求优先级和服务器推送的支持。(本人感觉稍稍有点抽象,看下面的就懂了)
HTTP2.0相对于HTTP1.x的优化有几个方面:二进制分帧层、多路复用、流控制、服务端推送
二进制分帧层
HTTP2.0所有性能增强的核心在于这个二进制分帧层。
在HTTP1.x中,请求和响应都是以文本格式传输,其headers和body之间也是用文本换行符进行分隔。
HTTP2.0将文本格式修改为了二进制格式,并将请求数据和响应数据分割为更小的帧,并采用二进制编码。
- 帧: 只存在于HTTP2.0中,是数据通信的最小单元。例如一个请求被分为了请求头帧(request headers frame)、请求体帧(request data frame)
- 数据流:一个虚拟通道,可以承载双向的消息,每个流都有
唯一
的整数ID进行标识。 - 消息:与逻辑请求或响应消息对应得完整的一系列帧
HTTP2.0将HTTP协议通信分解为二进制编码帧的交换,这些帧对应着特定数据流中的消息,所有这些都在一个TCP连接中复用。
多路复用
HTTP1.x中,如果客户端想要发起多个并行请求以提高性能,必须要使用多个TCP连接,而且浏览器为了控制资源,还会对单个域名有6-8个TCP连接请求的限制。
HTTP2.0中,有了二进制分帧技术的加持,客户端和服务器可以将HTTP消息分解为互不依赖的帧,然后交错发送,最后在另一端把它们重新组装起来。
流控制
流控制是一种阻止发送方向接收方发送大量数据的机制,以免超出后者的需求或处理能力。由于HTTP2.0数据流在一个TCP连接内复用,TCP流控制不够精细,无法提供比较的应用级API来调节各个数据流的传输。
为了解决这一个问题,HTTP2.0提供了一组简单的构建块
,这些构建块允许客户端和服务器实现它们自己的数据流和连接级流控制。
服务端推送
HTTP2.0另一个强大的功能是:服务器可以对一个客户端请求发送多个响应。也就是除了对最初请求的响应外,服务器可以主动向客户端推送额外资源(感觉就像是广告一样,不用客户端请求,服务器直接推送)
。
服务器可以主动推送,客户端也有权利选择是否接收,如果客户端不想要,可以通过发送RST_STREAM
帧来拒收。
此外主动推送也要遵守同源策略。即服务器不能随便将第三方资源推送给客户端。
写在最后
本系列博客是根据崔庆才老师的《python3网络爬虫开发实战 第二版》整理而成。每篇博客对应于每一节。主要是为了记录书中的重点,便于自己温习。如有错误或不足,请提出,大家一起学习,一起进步。
另:若转载,请附上本文链接。