【0基础学爬虫】爬虫基础之HTTP协议的基本原理介绍_请求_服务器_协议

大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫,本期为 HTTP 协议的基本原理介绍。

计算机网络模型

计算机网络是指由通信线路互相连接的许多自主工作的计算机构成的集合体,各个部件之间以何种规则进行通信,就是网络模型研究的问题,除了标准的 OSI 七层模型以外,常见的网络层次划分还有 TCP/IP 四层协议以及 TCP/IP 五层协议,它们之间的对应关系如下图所示:

物理层(Physical):负责传输比特流的硬件部分,包括各种传输介质(如铜线、光纤、无线信道)和传输设备(如集线器、交换机、路由器),基于电器特性发送高低电压(电信号)传输比特流(Bits),高电压对应数字 1,低电压对应数字 0,定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等;

数据链路层(Data Link):负责在物理层的传输介质上传送数据帧,并在源主机和目的主机之间建立逻辑链路,定义了电信号的分组方式,规定电信号多少位一组,每组代表什么,这一层还提供了对传输数据的检测和传输数据错误的纠正以确保数据的可靠传输,例如:Wi-Fi(IEEE 802.11)、ethernet(以太网)、FDDI(Fiber Distributed Data Interface,光纤分布式数据接口)等;

网络层(Network):负责在多个主机之间传送数据包,并为分组交换提供路由选择功能,基本数据单位为 IP 数据报,主要协议:IP协议(Internet Protocol,因特网互联协议)、 ICMP(Internet Control Message Protocol,因特网控制报文协议)、IGMP(Internet Group Management Protocol,Internet 组管理协议)、ARP(Address Resolution Protocol,地址解析协议)等;

传输层(Transport):负责在源主机和目的主机之间的端到端的数据传输,并为上层协议提供可靠的数据传输服务,主要协议:TCP 协议(Transmission Control Protocol,传输控制协议)、UDP 协议(User Datagram Protocol,用户数据报协议);

会话层(Session):负责封装调用 TCP,会话层建立和管理应用程序之间的通信,封装了调用 TCP 去打包,然后调用 IP 协议去找路由等操作;

表示层(presentation):负责解决不同系统之间的通信语法问题(数据格式化,代码转换,数据加密);

应用层(Application):负责向用户提供网络服务,包括文件传输、电子邮件、远程登录等,主要协议:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),)。

展开全文

HTTP 发展史

协议

版本。

HTTP 协议的特点:

应用层协议,由请求和响应构成,是一个标准的客户端服务器模型;

无状态的协议,对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作;

通常承载于 TCP 协议之上;

由请求和响应构成,是一个标准的客户端服务器模型(B/S);

永远都是客户端发起请求,服务器回送响应;

通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性;

双向协议,例如在上网冲浪时,浏览器是请求方 A,百度网站就是应答方 B,双方约定用 HTTP 协议来通信,于是浏览器把请求数据发送给网站,网站再把一些数据返回给浏览器,最后由浏览器渲染在屏幕,就可以看到图片、视频了。

协议的安全版。

协议的特点:

内容加密:建立了一个信息安全通道,保证数据传输的安全性;

身份验证:确认网站的真实性,凡是使用 机构颁发的安全签章来查询;

保护数据完整性:防止传输的内容被中间人冒充或者篡改。

时势发展:

苹果公司强制所有 iOS APP 在2017年1月1日前全部改为使用 无法在应用商店上架;

谷歌从2017年1月推出的 Chrome 56 开始,对未进行 加密的网址亮出风险提示,即在地址栏的显著位置提示用户”此网页不安全“;

腾讯微信小程序的官方需求文档要求后台使用 请求进行网络通信,不满足条件的域名和协议无法正常请求。

的区别主要如下:

申请证书,一般免费证书较少,因而需要一定费用;

加密传输协议;

协议安全。

上述 ,可圈可点,但并不是完美无缺的:

协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用;

SSL 证书的信用链体系并不安全,特别是在某些国家可以控制 CA 根证书的情况下,中间人攻击一样可行;

SSL 证书需要购买申请,功能越强大的证书费用越高;

SSL 证书通常需要绑定 IP,不能在同一 IP 上绑定多个域名,IPv4 资源不可能支撑这个消耗(SSL 有扩展可以部分解决这个问题,但是比较麻烦,而且要求浏览器、操作系统支持,Windows XP 就不支持这个扩展,考虑到 XP 的装机量,这个特性几乎没用);

根据 ACM CoNEXT 数据显示,使用%的耗电;

高效,流量成本高;

连接服务器端资源占用高很多,支持访客多的网站需要投入更大的成本;

HTTP 请求过程

连接都被构造成一套请求和应答。

HTTP 请求/响应的步骤:

步骤简述:

HTTP 请求/响应模型:

通俗点讲就是在浏览器地址栏输入一个 URL,按下回车之后便可观察到对应的页面内容,实际上,这个过程是浏览器先向网站所在的服务器发送一个请求,网站服务器接收到请求后对其进行处理和解析,然后返回对应的响应,接着传回浏览器,由于响应里包含页面的源代码等内容,所以浏览器在对其进行解析,便将网页呈现出来。

HTTP 请求方法

方法:

最为常见的请求方法是 GET 和 POST,在浏览器地址栏输入一个 URL,按下回车,即发起了一个 GET 请求,请求的参数会直接包含到 URL 里;POST 请求大多在提交表单时发起,例如登录,输入用户名和密码,点击登录即发起一个 POST 请求,其数据通常以表单的形式传输,而不会体现在 URL 中,GET 和 POST 请求方法区别如下:

GET 请求中的参数包含在 URL 里,数据可以在 URL 中看到;而 POST 请求的 URL 不会包含这些数据,数据都是通过表单形式传输的,会包含在函数体中;

GET 请求提交的数据最多只有 1024 字节,POST 方式则没有限制;

GET 请求是不安全的,因为在传输过程中,参数数据直接暴露在 URL 上,所以不能用来传递敏感信息;

GET 请求参数会完整的保留在浏览器的历史记录中,POST 请求的参数不会保留;

GET 请求在浏览器回退的时候是无害的,POST 请求会再次提交数据;

GET 请求在浏览器中可以被主动 cache(缓存),而 POST 请求不会,可以手动设置;

GET 请求产生的 URL 地址是可以被 bookmark(添加书签)的,POST 请求不可以;

GET 请求只允许 ASCII 码,POST 请求没有限制,允许二进制数据;

GET 请求的执行效率比 POST 请求好;

对于 GET 请求,浏览器会把 ,请求成功;

对于POST请求,浏览器先发送 header,服务器会响应100(已经收到请求的第一部分,正在等待其余部分),浏览器再次发送 data,服务器返回200,请求成功;

简而言之:GET 产生一个 TCP 数据包,POST 产生两个 TCP 数据包,不过并不是所有浏览器都会在 POST 中发送两次包,Firefox(火狐)就只发送一次;

HTTP 请求头

的头信息包括通用头、请求头、响应头和实体头四个部分:

每个头域由一个域名,冒号(:)和域值三部分组成,常用的 HTTP 请求头如下:

Accept:请求报头域,用于指定客户端可接受那些类型的信息;

Accept: application/json 浏览器可以接受服务器回发的类型为 application/json;

Accept: */* 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个);

Accept-Encoding:用于指定客户端可接受的内容编码,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate);

Accept-Language:用于指定客户端可接受的语言类型(zh-cn,zh;q=0.5:支持的语言分别是简体中文和中文,优先支持简体中文);

Content-type:也叫互联网媒体类型(Internet Media Type)或者 MIME 类型,在 :表单文件上传等);

Host:请求报头域主要用于指定被请求资源的 Internet 主机和端口号,其内容为请求 URL 的原始服务器或网关的位置,从 版本开始,请求必须包含此内容;

Referer:用于标识请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如做来源统计、防盗链处理等;

User-Agent:简称 UA,这是一个特殊的字符串头,可以使服务器识别客户端使用的操作系统及版本、浏览器及版本等信息;

Connection:表示是否需要持久连接(默认进行持久连接);

Date:请求发送的日期和时间;

Expect:请求的特定的服务器行为;

Warning:关于消息实体的警告信息;

Max-Forwards:限制信息通过代理和网关传送的时间;

Cookie:主要功能更是维持当前访问会话,用来存储一些用户信息以便让服务器辨别用户身份的(大多数需要登录的网站上面会比较常见),比如 Cookie 会存储一些用户的用户名和密码,当用户登录后就会在客户端产生一个 Cookie 来存储相关信息,这样浏览器通过读取 Cookie 的信息去服务器上验证并通过后会判定你是合法用户,从而允许查看相应网页;

HTTP 响应头

响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文:

常用的 HTTP 响应头如下:

Accept-Ranges:表明服务器是否支持指定范围请求及哪种类型的分段请求;

Allow:对某网络资源的有效的请求行为,不允许则返回405;

Cache-Control:告诉所有的缓存机制是否可以缓存及哪种类型;

Content-Language:响应体的语言;

Content-Length:响应体的长度;

Content-Location:请求资源可替代的备用的另一地址;

Content-Range:在整个返回体中本部分的字节位置;

Content-Type:返回内容的 MIME 类型;

Date:原始服务器消息发出的时间;

Expires:响应过期的日期和时间,可以让代理服务器或浏览器将加载的内容更新到缓存中,当再次访问相同的内容时,就可以直接从缓存中加载,达到降低服务器负载、缩短加载时间的目的;

Location:用来重定向接收方到非请求 URL 的位置来完成请求或标识新的资源;

Proxy-Authenticate:它指出认证方案和可应用到代理的该 URL 上的参数;

refresh:应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持);

Server:包含服务器的信息,例如名称、版本号等;

Set-Cookie:设置 携带上;

Warning:警告实体可能存在的问题;

:表明客户端请求实体应该使用的授权方案。

HTTP 响应状态码

1xx:该状态码表示临时响应并需要请求者继续执行操作

100(继续):请求者应当继续提出请求。服务器已收到请求的第一部分,正在等待剩余部分;

101(切换协议):请求者要求服务器切换协议,服务器也已确认切换协议;

2xx:该状态码表示成功

200(成功):服务器已成功处理请求。一般这表示服务器正常处理了请求,并且正常返回了相应的页面;

201(已创建):请求成功并且服务器成功创建新资源;

202(已接受):服务器已接收请求,但仍未处理;

203(非授权信息):服务器成功处理请求,但是返回的信息可能来自另外一来源;

204(无内容):服务器成功处理请求,但是没有返回任何内容;

205(重置内容):服务器成功处理请求,但没有返回任何内容;

206(部分内容):服务器成功处理了部分GET请求;

3xx:该状态码表示要完成请求,需要进一步操作,通常这些状态码用来重定向

300(多钟选择):针对请求,服务器可以执行多种操作。服务器可以根据请求者的(user-agent)选择一项操作,或者提供操作列表供请求者选择;

301(永久移动):请求的网页已永久移动到新的位置。服务器返回该状态码时,会自动将请求者转到新位置;

302(临时移动):服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置进行后续的请求;

303(查看其它位置):请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此状态码;

304(未修改):自从上次请求后,请求的网页未修改过,服务器返回此状态码时,不会返回网页内容;

305(使用代理):请求者只能使用代理访问请求的网页;

307(临时重定向):服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行后续请求;

4xx:表示请求可能出错,妨碍了服务器的处理

400(错误请求):表示客户端请求的语法错误,服务器无法理解;

401(未授权):请求要求身份验证。一般需要登录的网站,服务器可能会返回此状态码;

402:保留;

403(禁止):服务器理解请求客户端的请求,拒绝请求;

404(未找到):服务器无法根据客户端请求找到资源;

405(方法禁用):禁用请求中指定的方法;

406(不接受):无法使用请求的内容特性响应请求的网页;

407(需要代理授权):此状态码与401类似,但指定请求者应当授权使用代理;

408(请求超时):服务器等候请求时超时;

409(冲突):服务器在完成请求是发生冲突。服务器必须在响应中包含有关冲突的信息;

410(已删除):请求的资源已永久删除;

411(需要有效长度):服务器不接受不含有效内容长度标头字段的请求;

412(未满足前提条件):服务器未满足请求者在请求中设置的其中一个前提条件;

413(请求实体过大):相应实体过大。服务器拒绝处理当前请求,请求超过服务器所能处理和允许处理的最大值;

414(请求的url过长):请求的url过长,服务器无法处理;

415(不支持的媒体类型):请求的格式不受请求页面的支持;

416(请求范围不符合要求):如果页面无法提供请求的范围,服务器则会返回此状态码;

417(未满足期望值):在请求头 Expect 指定的预期内容无法被服务器满足;

422(不可处理的实体):请求格式正确,但由于含有语义错误,无法响应;

5xx:表示服务器在尝试处理请求时发生内部错误,这些错误可能是服务器本身的错误,并不是请求出错,当然也有可能是请求者的故意为之,使服务器本身出现错误

500(服务器内部错误):服务器遇到一个未预料到的状况,导致无法完成对请求的处理;

501(尚未实施):服务器不具备完成请求的功能;

502(错误网关):服务器作为网关或者代理,从上游服务器收到无效响应;

503(服务不可用):服务器目前无法使用;

504(网关超时):服务器作为网关或代理,但未及时收到上游服务器的响应;

505( 版本。

特别声明

本文仅代表作者观点,不代表本站立场,本站仅提供信息存储服务。

分享:

扫一扫在手机阅读、分享本文