【0爬虫基础】基于爬虫的HTTP协议基本原理介绍对于网页爬虫的技术,K爬虫哥之前发表过很多高级爬虫和逆向工程相关的文章。为了做到从易到难全面覆盖,特开设【0基础爬虫】专栏,帮助小白快速上手爬虫。本期是对HTTP协议基本原理的介绍。计算机网络模型计算机网络是指通过通信线路连接的许多自治计算机的集合。各个组件之间用什么规则进行通信是网络模型研究的问题。除了标准的OSI七层模型外,Common网络层的划分还有TCP/IP四层协议和TCP/IP五层协议。介质(如铜线、光纤、无线信道)和传输设备(如集线器、交换机、路由器),根据电气特性,发送高低电压(电信号)来传输比特流(Bits),高压对应数字1,低电压对应数字0,定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等;数据链路层(DataLink):负责在物理层的传输介质上传输数据帧,并在源主机和目的主机之间建立一条逻辑链路,它定义了电信号的分组方式,规定了一组电信号有多少位,每组代表什么。该层还提供传输数据的检测和传输数据错误的纠正,以保证数据的可靠传输,如:Wi-Fi(IEEE802.11)、以太网(Ethernet)、FDDI(FiberDistributedDataInterface,光纤分布式数据接口),ETC。;网络层(Network):负责多台主机之间的通信,传输数据包,并为数据包交换提供路由功能。基本数据单元是IP数据报。主要的协议有:IP协议(InternetProtocol,互联网网际协议)、ICMP(InternetControlMessageProtocol,互联网控制消息协议)、IGMP(InternetGroupManagementProtocol,互联网组管理协议)、ARP(AddressResolutionProtocol,地址解析)协议)等;传输层(Transport):负责源主机和目的主机之间端到端的数据传输,并为上层协议提供可靠的数据传输服务,主要协议:TCP协议(TransmissionControlProtocol,传输控制Protocol),UDP协议(UserDatagramProtocol,用户数据报协议);会话层(Session):负责封装和调用TCP,会话层建立与管理应用程序的通信封装,通过调用TCP进行封装,然后调用IP协议寻找路由等。手术;表示层(presentation):负责解决不同系统之间的通信语法问题(数据格式化、代码转换、数据加密);应用层(Application):负责为用户提供网络服务,包括文件传输、电子邮件、远程登录等。主要协议:FTP(文件传输协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传输协议)、POP3协议(邮局协议)、HTTP协议(超文本传输??协议)HTTP发展历史HTTP协议和HTTPS协议HTTP(超文本传输??协议)中文称为超文本传输??协议,其作用是将超文本数据从网络传输到本地浏览器,可以高效、准确地传输超文本文档。HTTP是由万维网联盟(WorldWideWebConsortium)和互联网工作组IETF(InternerEngineeringTaskForce)共同制定的规范。目前广泛使用的是HTTP1.1版本,现在很多网站都支持HTTP2.0版本。HTTP协议的特点:应用层协议,由请求和响应组成,是标准的客户端-服务器模型;无状态协议,客户端没有状态存储,也没有事务处理的“记忆”能力,比如访问网站。重复登录操作;通常承载在TCP协议之上;由请求和响应组成,是标准的客户端-服务器模型(B/S);总是客户端发起请求,服务器发回响应;通信采用明文,请求和响应不会确认通信方,不能保护数据的完整性;双向协议,比如上网时,浏览器是请求者A,百度网站是响应者B,双方约定使用HTTP协议进行通信,于是浏览器将请求数据发送给网站,网站返回一些数据给浏览器,最后浏览器渲染到屏幕上,就可以看到图片和视频了。HTTPS(HypertextTransferProtocoloverSecureSocketLayer)是一种通过计算机网络进行安全通信的传输协议。它通过HTTP进行通信,使用SSL/TLS建立完整的通道,并对数据包进行加密。HTTPS的主要目的是为Web服务器提供身份认证,同时保护交换数据的私密性和完整性,相当于HTTP协议的安全版本。HTTPS协议的特点:内容加密:建立信息安全通道,保证数据传输的安全;身份验证:确认网站的真实性。任何使用HTTPS协议的网站都可以通过单机浏览器地址栏中的锁定符号。要查看网站认证后的真实信息,另外还可以通过CA机构签发的安全印章进行查询;保护数据完整性:防止传输的内容被中间人冒充或篡改。时代发展:苹果在2017年1月1日之前强制所有iOS应用使用HTTPS加密,否则应用将无法在应用商店下载;谷歌从2017年1月推出的Chrome56开始,对没有HTTPS加密的网址显示风险警告,即在地址栏显着位置提示用户“此网页不安全”;腾讯微信小程序官方需求文档要求后台使用HTTPS请求进行网络通信,不符合要求的域名和协议无法正常请求。HTTP和HTTPS的主要区别如下:HTTPS协议需要向CA申请证书,一般免费证书很少,需要一定的费用;HTTP是超文本传输??协议,信息以明文传输,而HTTPS是安全的SSL加密传输协议;HTTP和HTTPS使用完全不同的连接方式和不同的端口,前者是80,后者是443;HTTP连接非常简单且无状态;HTTPS协议是由SSL+HTTP协议构建的一种能够进行加密传输和身份认证的网络协议,比HTTP协议更安全。上面说的HTTPS好像是HTTP的增强版,很了不起,但也并不完美:HTTPS协议的加密范围也比较有限,对黑客攻击、拒绝服务攻击、服务器劫持影响不大,ETC。;SSL证书的信用链体系并不安全,特别是在一些国家可以控制CA根证书的情况下,中间人攻击也是可行的;SSL证书需要购买和申请,证书越强大,费用越高;SSL证书通常需要捆绑无法在同一个IP上绑定多个域名,IPv4资源无法支持这种消耗(SSL有扩展可以部分解决这个问题,但是比较麻烦,需要浏览器和操作系统支持);据ACMCoNEXT数据显示,使用HTTPS协议会延长页面加载时间近50%,耗电量增加10%到20%。需要更多的成本;HTTPS协议的握手阶段比较耗时,影响网站的响应速度,影响用户体验。更好的方法是使用分而治之。例如首页使用HTTP,用户信息相关页面使用HTTPS。HTTP请求过程HTTP由请求和响应组成。它是一个标准的客户端-服务器模型(B/S)。HTTP协议总是从客户端发起请求,并从服务器发回响应。HTTP是一种无状态协议。无状态是指客户端(网络浏览器)和服务器之间不需要建立持久连接,意思是当客户端向服务器发送请求,然后服务器返回响应(response)时,连接就关闭了并且服务器上不保留有关连接的信息,HTTP遵循请求(Request)/响应(Response)模型,客户端(浏览器)向服务器发送请求,服务器处理请求并返回适当的响应,以及所有HTTP连接都被构造为一组请求和响应。HTTP请求/响应的步骤:客户端连接Web服务器:HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认80)建立TCP套接字连接;发送HTTP请求:通过TCP套接字客户端向Web服务器发送文本请求消息。一条请求报文由四部分组成:请求行、请求头、空行、请求数据;服务器接受请求并返回HTTP响应:Web服务器解析请求,为了定位请求的资源,服务器将资源的副本写入TCP套接字,由客户端读取。一个响应由四部分组成:状态行、响应头、空行和响应数据;releaseconnectionTCP连接:如果连接方式为close,则服务端主动关闭TCP连接,客户端被动关闭连接释放TCP连接;如果连接方式是keepalive的话,连接会保持一段时间,在这段时间内可以继续接收到请求;客户端浏览器解析HTML内容:客户端浏览器首先解析状态行,检查请求是否成功的状态码,然后解析每个Response头,response头告知后面的HTML文档几个字节和字符集客户端浏览器读取响应数据HTML,按照HTML的语法格式化,显示在浏览器窗口中。步骤简述:浏览器请求DNS服务器解析URL中域名对应的IP地址;解析IP地址后,根据IP地址和默认端口80与服务器建立TCP连接;浏览器发送读取文件(URL中域名后面部分对应的文件)HTTP请求,该请求报文作为TCP三次握手的第三条报文数据发送给服务器;服务器响应浏览器请求,将相应的HTML文本发送给浏览器浏览器;释放TCP连接;浏览器获取HTML文本并显示内容。HTTP请求/响应模型:通俗地说,就是在浏览器地址栏输入一个URL,回车,观察对应的页面内容。这个过程其实就是浏览器先向网站所在的服务器发送请求,网站服务器收到请求后进行处理和解析,然后返回相应的响应,再发送回浏览器。由于响应中包含页面的源代码等内容,浏览器对其进行解析,将网页呈现出来。HTTP请求方法HTTP/1.1协议定义了八种方法(有时称为“动作”)来表示对Request-URL指定资源的不同操作方式。HTTP1.0定义了三种请求方法:GET、POST和HEAD方法,HTTP1.1中新增了五种请求方法:OPTIONS、PUT、DELETE、TRACE和CONNECT方法:OPTIONS:返回服务器对特定资源支持的HTTP请求方法,或向网络服务器发送'*'请求来测试服务器的功能;HEAD:向服务器请求一个与GET请求一致的响应,但不会返回响应体。该方法可以获取响应中包含的内容,而无需传输整个响应内容。标头中的元信息;GET:向特定资源发送请求并返回实体主体;POST:向指定资源提交数据以处理请求(如提交表单或上传文件),数据包含在请求体中,POST请求可能会导致新资源的建立和/或修改现有资源;PUT:将最新的内容上传到指定的资源位置;DELETE:请求服务器删除Request-URL标识的资源;TRACE:回显服务器收到的请求,主要用于测试或诊断;CONNECT:服务器作为跳板,允许服务器代替客户端访问其他网页。最常见的请求方法是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请求可以在浏览器中主动缓存(缓存),而POST请求则不能,可以手动设置;GET请求生成的URL地址可以添加书签(添加书签),但是POST请求不能;GET请求只允许ASCII码,POST请求没有限制,允许二进制数据;GET请求的执行效率优于POST请求;对于GET请求,浏览器会将http头和数据一起发送,服务器响应200,请求成功;对于POST请求,浏览器先发送header,服务器响应100(请求的第一部分已经收到,等待剩下的),浏览器再次发送数据,服务器返回200,请求成功了;简而言之:GET生成一个TCP数据包,POST生成两个TCP数据包,但并不是所有的浏览器都会在POST中发送两个数据包,火狐(Firefox)只会发送一次;HTTP请求头HTTP请求头(HTTPRequestHeader)提供有关请求、响应或其他发送实体的信息。HTTP头信息包括通用头、请求头、响应头和实体头四部分:通用头:既可用于请求,也可用于响应,与交易整体关联,而不是与具体资源关联;请求标头:允许客户端传递有关自身的信息和所需的响应形式;响应头:server和in传输自身信息的响应;entityheader:定义正在传输的资源的信息,可用于请求和响应每个标头字段由一个域名、一个冒号(:)和一个域值组成。常用的HTTP请求头如下:Accept:请求头字段,用于指定客户端可以接受哪些类型的信息;Accept:application/jsonbrowser能接受服务器回发的类型是application/json;accept:*/*表示浏览器可以处理所有类型,(一般是浏览器把这个发给服务器);Accept-Encoding:用于指定客户端可接受的Content编码,通常指定压缩方式,是否支持压缩,支持什么压缩方式(gzip,deflate);Accept-Language:用于指定客户端可接受的语言类型(zh-cn,zh;q=0.5:支持的语言分别为简体中文和中文,首选简体中文);Content-type:也叫互联网媒体类型(InternetMediaType)或MIME类型,用在HTTP协议报文头中,表示具体请求中的媒体类型信息(text/html:HTML格式,image/gif:GIF图片,application/json:JSON类型,application/x-www-form-urlencoded:表单数据,multipart/form-data:表单文件上传等);Host:请求头字段,主要用于指定请求资源的Internet主机和端口号,其内容为请求URL的原始服务器或网关的位置。从HTTP1.1开始,请求中必须包含这个内容;Referer:用来标识请求是从哪个页面过来的,如果过来了,服务器就可以拿到这个信息,做相应的处理,比如来源统计,防盗链处理等;User-Agent:简称UA,这是一个特殊的字符串头,可以让服务器识别操作系统和版本、浏览器和版本等信息;Connection:表示是否需要持久连接(HTTP1.1默认为持久连接);日期:发送请求的日期和时间;expect:请求的具体服务器行为;Warning:关于消息实体的警告信息;Max-Forwards:限制信息通过代理和网关传输的时间;Cookie:主要作用是维护当前的访问会话,用来存储一些用户信息,以便服务器识别用户身份(大部分需要登录的网站上面会比较常见),比如Cookie会存储一些用户的用户名和密码,当用户登录时,它会在客户端生成cookie,用于存储相关信息,以便浏览器读取cookie信息后,向服务器端验证通过后,确定您是合法用户,让您查看相应的网页;HTTP响应头HTTP响应头(HTTPResponsesHeader)包含了服务器对请求的响应信息,HTTP响应也由四部分组成,分别是:状态行、消息头、空行和响应文本:状态行:由以下部分组成HTTP协议版本号、状态码、状态信息3部分组成;messageheader:用来说明一些附加信息,供client使用;空行:报文头后的空行为必填项;响应文本:服务器返回给客户端的文本信息。常用的HTTP响应头如下:Accept-Ranges:表示服务器是否支持指定范围的请求,以及什么类型的分段请求;允许:对某个网络资源的有效请求行为,如果不允许,返回405;Cache-Control:告诉是否可以缓存所有的缓存机制,以及缓存在哪里Content-Language:响应体的语言;Content-Length:响应体的长度;Content-Location:另一个可以被请求资源替换的地址;Content-Range:整个返回体Location中这部分的字节数;Content-Type:返回内容的MIME类型;日期:发送原始服务器消息的时间;expires:响应过期的日期和时间,可以让代理服务器或浏览器将加载的内容更新到缓存中,当再次访问相同的内容时,可以直接从缓存中加载,减少服务器负载并缩短加载时间;location:用于将接收者重定向到一个非请求的URL位置,以完成请求或标识一个新的资源;Proxy-Authenticate:表示代理的URL可以应用的认证方案和参数;refresh:应用于重定向或创建新资源,5秒后重定向(由Netscape提出,大多数浏览器支持);Server:包含服务器信息,如名称、版本号等;Set-Cookie:设置HttpCookie,响应头中的Set-Cookie用于告诉浏览器这个内容需要放在Cookie中,在上面的下一个请求中会携带这个Cookie;警告:警告实体可能存在的问题;WWW-Authenticate:表示客户端请求实体使用的授权方案。HTTPResponseStatusCode1xx:该状态码表示临时响应,要求请求者继续操作100(Continue):请求者应继续发出请求。服务器已收到请求的第一部分,正在等待其余部分;101(Switchprotocol):请求者请求服务器切换协议,服务器已经确认切换协议;2xx:此状态码表示成功200(Success):服务器已成功处理请求。一般来说,这意味着服务器正常处理请求并正常返回相应的页面;201(已创建):请求成功,服务器成功创建新资源;202(已接受):服务器已收到请求,但尚未处理;203(Unauthorizedinformation):服务器成功处理了请求,但返回的信息可能来自其他来源;204(无内容):服务器成功处理了请求,但没有返回任何内容;205(重置内容):服务器成功处理了请求,但没有返回内容;206(部分内容):服务器成功处理了部分GET请求;3xx:此状态代码表示需要进一步操作才能完成请求。通常这些状态码用于重定向300(多选):对于请求,服务器可以进行各种操作。服务器可以根据请求者(user-agent)选择一个操作,或者提供一个操作列表供请求者选择;301(PermanentMove):请求的网页已永久移动到新位置。当服务器返回此状态码时,会自动将请求者转移到新的位置;302(临时移动):服务器当前正在响应来自不同位置的网页的请求,但请求者应继续使用原来的位置进行后续请求;303(查看其他位置):当请求者应该对不同的位置使用单独的GET请求来检索响应时,服务器返回此状态代码;304(NotModified):请求的网页自上次请求后未被修改,服务器返回此状态305(UsingProxy):请求者只能使用代理访问请求的网页;307(TemporaryRedirection):服务器当前响应了来自不同位置的网页的请求,但是请求者应该继续使用原来的地方进行后续请求;4xx:表示请求可能有误,阻碍了服务器的处理。400(BadRequest):表示客户端请求的语法错误,服务端无法理解;401(未授权):请求需要身份验证。一般对于需要登录的网站,服务器可能会返回这个状态码;402:保留;403(禁止):服务器理解客户端的请求,拒绝请求;404(未找到):服务器无法根据客户端的请求找到资源;405(MethodDisabled):禁用请求中指定的方法;406(NotAccepted):无法响应具有请求内容特征的请求网页;407(ProxyAuthorizationRequired):此状态码与401类似,但指定请求者应授权使用代理;408(RequestTimeout):服务器在等待请求时超时;409(冲突):服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息;410(已删除):请求的资源已被永久删除;411(Requiresavalidlength):服务器不接受没有有效内容长度头字段的请求;412(PrerequisitenotmetCondition):服务器不满足请求者在请求中设置的前提条件之一;413(请求实体太大):对应的实体太大。服务器拒绝处理当前请求,请求超过服务器可以处理和允许处理的最大值;414(请求的url太长):请求的url太长,服务器无法处理;415(Unsupportedmediatype):请求的格式不被请求的页面支持;416(请求范围不符合要求):如果页面不能提供请求范围,服务器将返回该状态码;417(Theexpectedvalueisnotmet):服务器无法获取到请求头Expect中指定的期望内容Satisfied;422(UnprocessableEntity):请求格式正确,但由于语义错误无法响应;5xx:表示服务器在尝试处理请求时出现内部错误。这些错误可能是服务器本身的错误,而不是请求错误。当然,也有可能是请求者故意造成服务器本身出现错误500(internalservererror):服务器遇到意外情况,无法完成请求的处理;501(尚未实现):服务器没有完成请求的功能;502(BadGateway):服务器作为网关或代理,收到来自上游服务器的无效响应;503(ServiceUnavailable):服务器当前不可用;504(GatewayTimeout):服务器作为网关或者代理,但是没有及时收到上游服务器的响应;505(不支持HTTP版本):服务器不支持请求中使用的HTTP版本。
