爬虫系列学习之HTTP基本原理

URI和URN

首先,我们来了解一下URI和URL,URI的全称为Uniform Resource Identifier,即统一资源标识符,URL的全称为Universal Resource Locator,即统一资源定位符。

举例来说,https://github.com/favicon.ico,它是一个URL,也是一个URI。我们用URL/URI来指定了它的访问方式,这其中包括了访问协议HTTPS、访问路径和资源名称。通过这样一个链接,我们便可以从互联网上找到这个资源,这就是URL/URI。

URL是URI的子集,也就是说每一个URL都是URI,但不是每一个URI都是URL。因为URI中还包含着一个子集叫做URN,它的全称为Universal Resource Name,即统一资源名称。

URN只命名资源而不指定如何定位资源,比如urn:isbn:0451450523指定了一本书的ISBN,可以唯一标识这本书,但是没有指定到哪里定位这本书,这就是URN。但是目前互联网上,URN使用的非常少,几乎所有的URI都是URL,所以一般的网页链接我们可以称为URL,也可以称为URI。

超文本

超文本,其英文名称为Hypertext,我们在浏览器里看到的网页就是超文本解析而成的,其网页源代码是一系列的HTML代码,里面包含了一系列标签,比如ima显示图片,p指定显示段落等等。浏览器解析这些标签后,便形成了我们平时看到的网页,而在网页的源代码HTML就可以称为超文本。

HTTP和HTTPS

在百度、淘宝等大型网站的首页中,URL的开头都会由http或https,这个就是访问资源需要的协议类型,有时候我们还会看到ftp、sftp、smb开头的URL,这里的ftp、sftp、smb也都是指协议类型。在爬虫中,我们抓取的页面通常就是http或https协议的,下面就为大家介绍这两个协议的含义。

HTTP的全称是Hyper Text Transfer Protocol,中文名称是超文本传输协议,HTTP协议是用于从网络传输超文本数据到本地浏览器的传送协议,它能保证高效而准确地传送超文本文档。HTTP由万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)共同合作指定的规范,目前广泛使用的是HTTP 1.1版本。

HTTPS的全称是Hyper Text Transfer Protocol over Secure Socket Layout,是以安全为目标的HTTP通道,简单讲就是HTTP的安全版,即HTTP下加入SSL层,简称为HTTPS。

HTTPS的安全基础是SSL,因此通过它传输的内容都是经过SSL加密的,它的主要作用可以分为两种:

  • 建立一个信息安全通道,来保证数据传输的安全。
  • 确认网站的真实性,凡是使用了HTTPS的网站,都可以通过点击浏览器地址栏的锁头标识来查看网站认证之后的真实信息,也可以通过CA机构颁发的安全签章来查询。

HTTP请求过程

我们在浏览器中输入一个URL,回车之后便可以在浏览器中观察到页面内容。实际上,这个过程是浏览器向网站所在的服务器发送了一个请求,网站服务器收到这个请求后进行处理和解析,然后返回对应的响应,接着传回给浏览器。响应里包含了页面的源代码等内容,浏览器再对其进行解析,便将网页呈现了出来。

为了更加的直观地说明这个过程,这里用Firefox浏览器的开发者模式下的Network监听组件来做下演示,它可以显示访问当前请求网页时发生的所有网络请求和响应。

打开Firefox浏览器按下键盘中的F12即可打开浏览器的开发者模式。这里访问百度https://www.baidu.com/,输入该URL后回车,观察这个过程中发生了怎样的网络请求。可以看到,在Network页面下方出现了一个个的条目,其中一个条目就代表着一次发送请求和接收响应的过程,如图所示。

爬虫系列学习之HTTP基本原理

我们先观察第一个网络请求,即www.baidu.com,其中常见的几列的含义如下。

  • 第一列 Status:响应状态码,这里显示为200,代表响应是正常的。通过状态码,我们可以判断发送了请求之后是否得到了正常的响应。
  • 第二列 Method:请求的方法。
  • 第六列 Type:请求的文档类型。这里为document,代表我们这次请求的是一个HTML文档,内容就是一些HTML代码。
  • 第八列 Size:从服务器下载的文件和请求的资源大小。

我们点击www.baidu.com这个条目可以看到其更详细的信息,如图所示。

爬虫系列学习之HTTP基本原理

首先是General部分,Request URL为请求的URL,Request method为请求的方法,Status code为响应状态码,Referrer Policy为Referrer判断策略。

接着往下,可以看到,由Response Headers和Request Headers,这分别代表响应头和请求头。请求头里带着许多请求信息,例如浏览器标识、Cookies、Host等信息,这是请求的一部分,服务器会根据请求头内的信息判断请求是否合法,进而做出对应的响应。途中可以看出Response Headers就是响应的一部分,例如其中包括了服务器的类型、文档类型、日期等信息,浏览器接收到响应后,会解析响应内容,进而呈现网页内容。

请求和响应的组成

请求

请求是由客户端向服务器端发出,可以分为4部分内容:请求方法(Request Method)、请求的网址(Request URL)、请求头(Request Headers)、请求体(Request Body)。

常见的请求方法有两种:GET和POST。这两种请求方法有如下区别:

  • GET请求中的参数包含在URL里面,数据可以在URL中看到,而POST请求的URL不会包含这些数据,数据都是通过表单形式传输的,会包含在请求体中。
  • GET请求提交的数据最多只有1024字节,而POST请求没有限制。

更多的请求方法可以参考http://www.runoob.com/http/http-methods.html

请求的网址,即统一资源定位符,它可以唯一确定我们想请求的资源。

请求头,用来说明服务器要使用的附加信息,比较重要的信息有Cookie、Referer、User-Agent等。

请求体一般承载的内容是POST请求中的表单数据,而对于GET请求,请求体则为空。

响应

响应,由服务器返回客户端,可以分为三部分:响应状态码(Response Status Code)、响应头(Response Headers)和响应体(Response Body)。

响应状态码表示服务器的响应状态,如200代表服务器正常响应,404代表页面未找到,500代表服务器内部发生错误。在爬虫中,我们可以根据状态码来判断服务器的响应状态,如状态码200,则证明成功返回数据,在进一步的处理,否则直接忽略。更多响应状态码的说明点我跳转

响应头包含了服务器对请求的应答信息,如Content-Type、Server、Set-Cookie等。下面简要说明一些常用的头信息。

  • Date:标识响应产生的时间。
  • Last-Modified:指定资源的最后修改时间。
  • Content-Encoding:指定响应内容的编码。
  • Server:包含服务器的信息,比如名称、版本号等。
  • Content-Type:文档类型,指定返回的数据类型是什么,如text/html代表返回HTML文档,application/x-javascript则代表返回JavaScript文件,image/jpeg则代表返回图片。
  • Set-Cookie:设置Cookies。响应头中的Set-Cookie告诉浏览器需要将此内容放在Cookie中,下次请求携带Cookie请求。
  • Expires:指定响应的过期时间,可以使代理服务器或浏览器加载的内容更新到缓存中。如果再次访问时,就可以直接从缓存中加载,降低服务器负载,缩短加载时间。

响应体中包含响应的正文数据,比如请求网页时,它的响应体就是网页的HTML代码;请求一张图片时,它的响应体就是图片的二进制数据。在爬虫中,获取网页后,要解析的内容就是响应体,如图所示。

爬虫系列学习之HTTP基本原理

参考文档

崔庆才老师的《Python3 网络爬虫开发实战》