在学习爬虫的过程中,相信大家都对HTTP这个词不陌生,似乎从未离开过我们的视线。迫于需要,我们不得不每次使用开发者工具查看请求头、响应头以及头中的各个字段,用别人封装好的模块填写信息,敲几行代码就解决了。面对简单的爬取任务,我们可能不在乎它是什么,但真正遇到问题时,我们可能就不知道如何下手了。认识和深入理解HTTP对于爬虫的实现过程是非常有帮助的。为了更好的让大家理解爬虫中的HTTP,博主将分为<基础>和<高级>两篇关于HTTP的文章。本文为基础篇,将从以下几个部分进行阐述。什么是HTTP完整的HTTP请求流程HTTP请求报文什么是HTTP?引自百度百科的权威答案:超文本传输??协议(HTTP,HyperTextTransferProtocol)是互联网上使用最广泛的网络协议。所有WWW文档都必须符合此标准。HTTP最初旨在提供一种发布和接收HTML页面的方式。1960年,美国人泰德·尼尔森构想出一种用计算机处理文本信息的方法,并称之为超文本(hypertext),成为HTTP超文本传输??协议标准体系结构发展的基础。TedNelson组织协调万维网联盟(WorldWideWebConsortium)和互联网工程任务组(InternetEngineeringTaskForce)共同研究并最终发布了一系列RFC,其中著名的RFC2616定义了HTTP1.1。HTTP协议是一种从WWW服务器向本地浏览器传输超文本的传输协议。它可以使浏览器更高效并减少网络传输。它不仅保证了计算机正确快速地传输超文本文档,而且还决定了传输文档的哪一部分,先显示哪部分内容(如文本先于图形)等。HTTP采用浏览器/服务器请求/响应模型。浏览器永远是HTTP请求的发起者,服务器是响应者。这样,如果浏览器客户端没有发起请求,服务端就无法主动向客户端推送消息。HTTP是应用层协议,是我们向服务器获取信息最直观的请求。比如爬虫中使用的和都封装了HTTP协议,作为HTTP客户端,实现了博文、图片、视频等信息源的下载。但是HTTP并不能直接使用,它的请求是在一些底层协议的基础上完成的。例如在TCP/IP协议栈中,HTTP需要TCP三次握手连接成功,才能向服务器发起请求。当然,如果是HTTPS,还需要TSL和SSL安全层。一个完整的HTTP请求流程由于HTTP协议需要建立在其他底层协议的基础上,所以我们来看看一个完整的HTTP请求是什么样子的。当我们点击一??个链接或者输入一个链接的时候,整个HTTP请求过程就开始了,然后通过下面的步骤获取最新的信息。这里我们简单介绍一下理解HTTP的前四个步骤。<1>域名解析会先搜索本地的各种DNS缓存,如果没有,就会向DNS服务器(Internet提供商)发起域名解析,获取IP地址。<2>建立TCP连接获取IP后会创建一个socket套接字连接,为TCP3次握手连接,默认端口号为80。<3>HTTP请求一旦TCP连接成功,浏览器/爬虫可以向服务器发起HTTP请求报文,报文内容包括请求行、请求头和请求体。<4>服务器响应服务器响应,返回一个HTTP响应包(成功状态码200)和请求的HTML代码。上面的步骤<3>和<4>可以简单的表示如下,更方便大家理解。其中,request和response都包含了特定格式的信息,我们将继续详细解读。响应一个HTTP请求会返回一个响应状态码,根据状态码可以知道返回信息的状态。状态码规定如下:1xx:信息响应类,表示收到请求,继续处理100——必须继续发送请求101——要求服务器根据请求转换HTTP协议版本2xx:处理中success响应类,表示动作被成功接收和理解Andaccept200-交易成功201-提示知道新文件的URL202-接受并处理,但处理未完成203-返回信息不确定或不完整204-请求收到,但返回信息为空205--服务器已完成请求,用户代理必须重置当前浏览的文件206-服务器已完成部分用户的GET请求3xx:重定向响应类,为了完成指定action,必须接受进一步处理300-可以在多个地方获取请求的资源301-删除请求数据302-在其他地方找到请求数据addresses303—建议客户访问其他URL或访问方式304—客户端执行了GET,但文件没有改变305—请求的资源必须从服务器指定的地址获取。306——旧版HTTP中使用的代码。当前版本不再使用307——声明请求的资源被暂时删除。4xx:客户端错误,客户端请求包含语法错误或400-错误请求,如语法错误401-未授权402-保持有效的ChargeTo头响应403-禁止访问404-未找到文件、查询或URl405-在定义中Request-LinefieldMethodNotAllowed406-根据发送的Accept,请求的资源不可访问407-用户必须先在代理服务器上授权408-客户端没有在指定时间内完成请求409-对于当前资源状态,请求无法完成410—服务器不再拥有此资源,也没有进一步的地址411—服务器拒绝了用户定义的Content-Length412—当前请求中一个或多个请求头字段错误413—请求的资源大于大小服务器允许414-请求的资源URL比服务器允许的长度长415-请求的资源不支持请求的项目格式416-请求包含Range请求头字段,并且内部没有范围指示值当前请求资源的范围,且请求不包含If-RangeRequest头域417——服务器不满足请求Expect头域中指定的期望值。如果是代理服务器,可能是下一级服务器无法满足请求长度5xx:服务器错误,服务器无法正确执行正确的请求500——InternalServerError501——NotImplemented502——GatewayErrorHTTP请求message相信大家已经对HTTP请求流程有了一个大概的了解。下面详细介绍一下HTTP请求的消息信息。消息的内容包括请求行、请求头和请求体。接下来我们看一下通过开发者工具请求URL拦截到的HTTP请求报文内容,并与上面的标准格式进行对比。我们发现请求报文的格式和上面基本一样,正是我们想要的。那么,我们将对以上信息一一进行介绍。请求行是HTTP请求方法之一。HTTP/1.1协议定义了8种与服务器交互的方法,包括GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE和CONNECT,其中和方法。HEAD:从服务器获取相同的响应,只是请求体与GET请求相同GET:通过URL获取查询资源信息(爬虫特定的URL爬取)POST:提交表单(爬虫中模拟登录)PUT:上传文件(浏览器不支持)DELETE:删除OPTIONS:返回服务器对特定资源支持的HTTP请求方式TRACE:返回服务器收到的请求,用于测试或诊断CONNECT:为代理服务保留管道连接方式GET请求方式(这里是/)和1.1版本之后的URL,不要忘记空格。HTTP头字段包括四部分:通用头、请求头、响应头和实体头。因为在爬取的过程中,我们经常会提交headers请求头信息来进行伪装,所以这里重点讲解一下请求头。请求标头对于请求消息是唯一的。它向服务器提交一些附加信息。例如,通过Accept字段信息,我们的客户端可以告诉服务器我们接受什么类型的数据。而我们其实可以把这些字段信息当成。我们来看看这些字段代表什么?接受:text/html、application/xhtml+xml、application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8含义:告诉浏览器我们接受MIME的类型Accept-Encoding:gzip,deflate,br含义:如果有这个字段,说明客户端支持压缩编码内容。删除后,它将支持任何编码。注意:爬取的时候一般不要加。博主一开始不知道怎么全部复制过来,也正因如此,好不容易让它卡了半天。Accept-Lanague:zh-CN,zh;q=0.9含义:告诉服务器可以接受的语言,如果不能接受,则表示任何语言Connection)Host:www.baidu.com含义:客户端指定域自己要访问的web服务器的名称/IP地址和端口号Cache-control:max-age=0含义:(引自百度百科)Cache-Control是最重要的规则。该字段用于指定所有缓存机制在整个请求/响应链中必须遵守的指令。这些指令指定防止缓存不利地干扰请求或响应的行为。这些指令通常会覆盖默认的缓存算法。缓存指令是单向的,即请求中存在指令并不意味着响应中会出现相同的指令。网页的缓存由HTTP消息头中的“Cache-control”控制。常用值包括private、no-cache、max-age、must-revalidate等,默认为private。但是HTTP请求和响应的Cache-Control并不完全一样。常见的请求Cache-Control值包括、、、、、。对应的Cache-Control值为,,,,,,,。这里主要介绍请求时常用的Cache-Control取值。<1>max-age<=0本例中使用max-age=0,表示每次请求都会访问服务器,通过Last-Modified判断文件是否被修改过。如果修改了,返回状态码200,获取**文件,否则返回304状态码,读取缓存文件。<2>max-age>0表示会直接从浏览器中提取缓存。<3>no-cache是??指不会在浏览器缓存中提取,而是强制向服务器发送请求,可以保证客户端能够收到最权威的响应。<4>no-store所有的内容都不会被缓存在缓存或临时的Internet文件中。Upgrade-Insecure-Requests:1含义:表示浏览器/爬虫可以处理HTTPS协议,可以自动将请求从HTTP升级到HTTPS。User-Agent:Mozilla/5.0(WindowsNT6.1;WOW64)..Safari/537.36含义:(这个是爬虫中最常用的)用来伪装成浏览器请求网页。它的含义自然是表示浏览器的身份,表示使用哪个浏览器进行操作。Cookies:含义:(这个在爬虫中也很重要,通常用来模拟登录)Cookies用于维护服务器的会话状态,由服务器写入,然后在后续的请求中被服务器读取使用。以上就是本例中出现的所有字段信息内容。当然还有其他一些常用的字段信息,这里也说明一下。其他请求头字段信息Referer:含义:(这个也是爬虫常用的,防盗链)客户端通过当前URL代表的页面访问我们请求的页面。在爬虫中,一般我们只需要将其设置为请求的网页链接即可。Accept-Charset:含义:(这个也是爬虫常用的)表示浏览器可以接受的字符集,可以是utf-8,gbk等If-Modified-Since:Thu,10Apr200809:14:42GMT含义:一旦请求的内容在指定日期后被修改,则返回对象内容,否则返回“NotModified”Pragma:含义:Pragma头域用于包含具体实现的指令,最常用使用的是Pragma:no-cache。在HTTP/1.1协议中,其含义与Cache-Control相同:no-cache。Range:含义:告诉浏览器它要获取对象的哪一部分。例如Range:bytes=1173546,概括了本文的内容,介绍了HTTP的基本概念。主要包括以下几点:什么是HTTPHTTP模型、功能和定位一个完整的HTTP请求流程HTTP请求头信息HTTP请求头常用字段信息