在学习爬虫的过程中,相信大家对HTTP这个词已经不陌生了,它好像从未离开过我们的视线。被迫所需,我们每次都要使用开发者工具去查看请求头,响应头,以及头中的各个字段,使用别人封装好的模块填入信息,敲几行代码就解决了。面对简单的爬取任务,我们也许根本不用管它是什么,但可能等我们真正遇到问题的时候,却无从下手。
认识并深刻理解HTTP对于爬虫的实现过程是非常有帮助的。为了更好的让大家理解爬虫中的HTTP,博主将分为两篇对HTTP进行讲述,<基础篇>和<高阶篇>。本篇为基础篇,将从以下几个部分进行阐述。
引自百度百科的权威回答:
HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
HTTP采用了浏览器/服务器这种请求/响应模型,浏览器永远是HTTP请求的发起者,服务器为响应者。
这样在浏览器客户端没有发起请求的情况下,服务器是不能主动推送消息给客户端的。
HTTP是一个应用层协议,是我们想从服务器端获取信息的最直观的请求。比如,在爬虫中使用的
但是HTTP也不是直接就可以用的,它的请求是建立在一些底层协议的基础上完成的。如TCP/IP协议栈中,HTTP需要TCP的三次握手连接成功后才能向服务器发起请求。当然,如果是HTTPS的话,还需要TSL和SSL安全层。
既然HTTP协议需要建立在其它底层协议基础上,我们来看看一个完整的HTTP请求是什么样的。
当我们点击一个链接或者输入一个链接的时候,整个HTTP的请求过程就开始了,然后经过以下步骤得到最后的信息,我们这里简单介绍一下前四个步骤,旨在了解HTTP。
上面的步骤<3>和<4>可以简单的示意如下,更方便大家理解。其中,请求和响应都包含特定格式的信息,具体我们接下来会继续解读。
响应HTTP请求会返回响应状态码,根据状态码可以知道返回信息的状态。状态码规定如下:
相信你已经对HTTP的请求过程有了大致的了解了,下面我们来详细介绍HTTP请求的报文信息。报文内容包含请求行、请求头部、请求主体。
我们发现请求报文的格式与上面基本一致,正式我们想要的。那么,接下来我们将要逐个的介绍以上各个信息。
GET请求方法后URL(这里是/)和版本1.1,别忘了空格。
HTTP的头域包括通用头、请求头、响应头和实体头四部分。因为在爬虫过程中,我们经常会提交headers请求头信息用于伪装,所以我们这里对请求头着重讲解一下。
请求头是请求报文特有的,它向服务器提交了一些额外的信息,例如通过Accept字段信息,我们客户端可以告诉服务器我们接受一些什么类型的数据。而我们其实可以把这些字段信息就当成<键值对>对待。
下面我们看看这些字段都代表了什么意思?
内容:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8含义:告诉浏览器我们接受MIME的类型
内容:zh-CN,zh;q=0.9含义:告诉服务器能够接受的语言,没有则代表任何语言
内容:keep-alive含义:告诉服务器需要持久有效的连接状态(HTTP1.1默认会进行持久连接)
内容:www.baidu.com含义:客户端指定自己想访问的web服务器域名/IP地址和端口号
内容:max-age=0含义:(引自百度百科)
网页的缓存是由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临时文件中。
内容::1含义:表示浏览器/爬虫可以处理HTTPS协议,并能自动升级请求从HTTP到HTTPS。
内容:Mozilla/5.0(WindowsNT6.1;WOW64)..Safari/537.36含义:(这个是爬虫中最常用了)用于伪装成浏览器身份请求网页。它的意思自然就是表示浏览器的身份,说明是用的哪种浏览器进行的操作。
以上就是本例中出现的所有字段信息内容。当然,还有其它一些常用字段信息,这里也一起说明一下。
含义:(这个也是爬虫常用到的,防盗链)客户端通过当前URL代表的页面出发访问我们请求的页面。爬虫中,一般我们只要把它设置成请求的网页链接就好了。
含义:(这个也是爬虫常用到的)表示浏览器可接受的字符集,可以是utf-8,gbk等
内容:Thu,10Apr200809:14:42GMT含义:请求的内容在指定日期以后一旦被修改就被返回对象内容,否则返回“NotModified”
含义:
含义:告诉浏览器自己想取对象的哪个部分。例如,Range:bytes=1173546