专栏名称: Python爱好者社区
人生苦短,我用Python。分享Python相关的技术文章、工具资源、精选课程、视频教程、热点资讯、学习资料等。每天自动更新和推送。
51好读  ›  专栏  ›  Python爱好者社区

HTTP基本原理

Python爱好者社区  · 公众号  · Python  · 2017-09-19 17:06

正文

崔庆才 ,Python技术控,爬虫博文访问量已过百万。喜欢钻研,热爱生活,乐于分享。

个人博客: 静觅 | http://cuiqingcai.com/


HTTP基本原理


在本节我们会详细了解 HTTP 的基本原理,了解在浏览器中敲入一个 URL 到获取网页内容发生了一个怎样的过程,了解了这些内容,有助于去进一步了解爬虫的基本原理。


1. URI、URL


在了解 HTTP 之前我们先了解一下 URI 和 URL。我们经常会听到 URI 和 URL 两个术语,URI 全称为 Uniform Resource Identifier,即统一资源标志符,URL 全称为 Universal Resource Locator,即统一资源定位符。


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


URL 是 URI 的子集,也就是说每个 URL 都是 URI,但不是每个 URI 都是 URL。那么怎样的 URI 不是 URL 呢?URI 还包括一个子类叫做 URN,它的全称为 Universal Resource Name,即统一资源名称。URN 只命名资源而不指定如何定位资源,如 urn:isbn:0451450523,它指定了一本书的 ISBN,可以唯一标识这一本书,但是没有指定到哪里定位这本书,这就是 URN,URL、URN、URI 的关系可以用图表示如下:

URL、URN、URI 关系图


但是在目前的互联网,URN 的使用非常少,所以几乎所有的 URI 都是 URL,所以一般的网页链接我们可以称之为 URL,也可以称之为 URI,我个人习惯称之为 URL。


2. 超文本


接下来我们再了解一个概念,超文本。超文本英文名称叫做 Hypertext,我们在浏览器里面看到的网页就是超文本解析而成的,其网页源代码是一系列 HTML 代码,里面包含了一系列标签,如 img 显示图片,p 指定显示段落等,浏览器解析这些标签后便形成了我们平常看到的网页,而这网页的源代码 HTML 就可以称作超文本。


例如我们在 Chrome 浏览器里面打开任意一个页面,如淘宝首页,右键点击检查,或按下快捷键 F12 即可打开浏览器的开发者工具,这时我们在 Elements 选项卡即可看到当前网页的源代码,这些源代码都是超文本,如图所示:


源代码


3. HTTP、HTTPS


我们在前面了解了 URI 和 URL,例如淘宝的首页:https://www.taobao.com/,在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 Layer,是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版,即 HTTP 下加入 SSL 层,简称为 HTTPS。


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


  • 是建立一个信息安全通道,来保证数据传输的安全。

  • 确认网站的真实性,凡是使用了 https 的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过 CA 机构颁发的安全签章来查询。

现在越来越多的网站和 APP 都已经向 HTTPS 方向发展。例如:


  • 苹果公司强制所有 iOS App 在 2017 年 1 月 1 日 前全部改为使用 HTTPS 加密,否则 APP 就无法在应用商店上架。

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

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


而某些网站虽然使用了 HTTPS 协议还是会被浏览器提示不安全,例如我们在 Chrome 浏览器里面打开 12306,链接为:https://www.12306.cn/,这时浏览器就会提示“您的连接不是私密连接”这样的话,如图所示:

12306 页面


这是因为 12306 的 CA 证书是中国铁道部自己颁发给自己的,而这个证书是不被官方机构认可的,所以这里证书验证就不会通过而提示这样的话,但是实际上它的数据传输依然是经过 SSL 加密的。我们如果要爬取这样的站点就需要设置忽略证书的选项,否则会提示 SSL 链接错误,在后文会进行详细说明。


4. HTTP请求过程


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


模型图


此处客户端即代表我们自己的 PC 或手机浏览器,服务器即要访问的网站所在的服务器。


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


打开 Chrome 浏览器,右键点击检查,或按下快捷键 F12 即可打开浏览器的开发者工具,我们在这里访问百度:http://www.baidu.com/,输入该 URL,敲击回车访问这个页面,观察一下在这个过程中发生了怎样的网络请求,这时我们可以看到在 Network 页面的下方出现了一个个的条目,那么这一个条目就代表一次发送 Request 和接收 Response 的过程,如图所示:


Network 面板


我们 观察第一个网络 请求, www.baidu.com,如图所示:


网络请求记录


这一个条目的各列分别代表:


  • 第一列 Name,即 Request 的名称。一般会用URL的最后一部分内容当做名称。

  • 第二列 Status,即 Response 的状态码。这里显示为 200,代表 Response 是正常的,通过状态码我们可以判断发送了 Request 之后是否得到了正常的 Response。

  • 第三列 Type,即 Request 请求的文档类型。这里为 document,代表我们这次请求的是一个 HTML 文档,内容就是一些 HTML 代码。

  • 第四列 Initiator,即请求源。用来标记 Request 是由哪个对象或进程发起的。

  • 第五列 Size,即从服务器下载的文件和请求的资源大小。如果是从缓存中取得的资源则该列会显示 from cache。

  • 第六列 Time,即发起 Request 到获取到 Response 所用的总时间。

  • 第七列 Timeline,即网络请求的可视化瀑布流。


我们点击这个条目即可看到其更详细的信息,如图所示:


详细信息


首先是General 部分,Request URL 为 Request 的 URL,Request Method 为请求的方法,Status Code 为响应状态码,Remote Address 为远程服务器的地址和端口,Referrer Policy 为 Referrer 判别策略。


再继续往下看可以看到有一个 Response Headers 和一个 Request Headers,这分别代表响应头和请求头,请求头里面带有许多请求信息,例如浏览器标识、Cookies、Host 等信息,这是 Request 的一部分,服务器会根据请求头内的信息判断请求是否合法,进而作出对应的响应,返回 Response,那么在图中看到的 Response Headers 就是 Response 的一部分,例如其中包含了服务器的类型、文档类型、日期等信息,浏览器接受到 Response 后,会解析响应内容,进而呈现网页内容。


下面我们分别来介绍一下请求 Request 和响应 Response 都包含了哪些内容,在这里进行对其组成进行总结:


5. Request

Request,即请求,由客户端向服务端发出。可以将 Request 划分为四部分内容:Request Method、Request URL、Request Headers、Request Body,即请求方式、请求链接、请求头、请求体。


Request Method


请求方式,请求方式常见的有两种类型,GET 和 POST。


我们在浏览器中直接输入一个 URL 并回车,这便发起了一个 GET 请求,请求的参数会直接包含到 URL 里,例如百度搜索 Python,这就是一个 GET 请求,链接为:https://www.baidu.com/s?wd=Python,URL中包含了请求的参数信息,这里参数 wd 就是要搜寻的关键字。POST 请求大多为表单提交发起,如一个登录表单,输入用户名密码,点击登录按钮,这通常会发起一个 POST 请求,其数据通常以 Form Data 即表单的形式传输,不会体现在 URL 中。


GET 和 POST 请求方法有如下区别:


  • GET 方式请求中参数是包含在 URL 里面的,数据可以在 URL 中看到,而 POST 请求的 URL 不会包含这些数据,数据都是通过表单的形式传输,会包含在 Request Body 中。

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



所以一般来说,网站登录验证的时候,需要提交用户名密码,这里包含了敏感信息,使用GET方式请求的话密码就会暴露在URL里面,造成密码泄露,所以这里最好以POST方式发送。


文件的上传时,由于文件内容比较大,也会选用POST方式。


我们平常遇到的绝大部分请求都是 GET 或 POST 请求,另外还有一些请求方式,如 HEAD、PUT、DELETE、OPTIONS、CONNECT、TRACE,我们简单将其总结如下:


方法描述
GET请求指定的页面信息,并返回实体主体。
HEAD类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。
POST向指定资源提交数据进行处理请求,数据被包含在请求体中。
PUT从客户端向服务器传送的数据取代指定的文档的内容。
DELETE请求服务器删除指定的页面。
CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS允许客户端查看服务器的性能。
TRACE回显服务器收到的请求,主要用于测试或诊断。


本表参考:http://www.runoob.com/http/http-methods.html。


Request URL


顾名思义,就是请求的网址,即统一资源定位符,用 URL 可以唯一确定我们想请求的资源。


Request Headers


请求头,用来说明服务器要使用的附加信息,比较重要的信息有 Cookie、Referer、User-Agent 等,下面将一些常用的头信息说明如下:







请到「今天看啥」查看全文