在本节中,咱们会详细了解HTTP的基本原理,了解在浏览器中敲入URL到获取网页内容之间发生了什么。了解了这些内容,有助于咱们进一步了解爬虫的基本原理。javascript
这里咱们先了解一下URI和URL,URI的全称为Uniform Resource Identifier,即统一资源标志符,URL的全称为Universal Resource Locator,即统一资源定位符。html
举例来讲,https://github.com/favicon.ico是GitHub的网站图标连接,它是一个URL,也是一个URI。即有这样的一个图标资源,咱们用URL/URI来惟一指定了它的访问方式,这其中包括了访问协议https、访问路径(/即根目录)和资源名称favicon.ico。经过这样一个连接,咱们即可以从互联网上找到这个资源,这就是URL/URI。java
URL是URI的子集,也就是说每一个URL都是URI,但不是每一个URI都是URL。那么,怎样的URI不是URL呢?URI还包括一个子类叫做URN,它的全称为Universal Resource Name,即统一资源名称。URN只命名资源而不指定如何定位资源,好比urn:isbn:0451450523指定了一本书的ISBN,能够惟一标识这本书,可是没有指定到哪里定位这本书,这就是URN。URL、URN和URI的关系能够用图2-1表示。git
图2-1 URL、URN和URI关系图github
可是在目前的互联网中,URN用得很是少,因此几乎全部的URI都是URL,通常的网页连接咱们既能够称为URL,也能够称为URI,我我的习惯称为URL。json
接下来,咱们再了解一个概念——超文本,其英文名称叫做hypertext,咱们在浏览器里看到的网页就是超文本解析而成的,其网页源代码是一系列HTML代码,里面包含了一系列标签,好比img
显示图片,p
指定显示段落等。浏览器解析这些标签后,便造成了咱们日常看到的网页,而网页的源代码HTML就能够称做超文本。小程序
例如,咱们在Chrome浏览器里面打开任意一个页面,如淘宝首页,右击任一地方并选择“检查”项(或者直接按快捷键F12),便可打开浏览器的开发者工具,这时在Elements选项卡便可看到当前网页的源代码,这些源代码都是超文本,如图2-2所示。微信小程序
图2-2 源代码浏览器
在淘宝的首页https://www.taobao.com/中,URL的开头会有http或https,这就是访问资源须要的协议类型。有时,咱们还会看到ftp、sftp、smb开头的URL,它们都是协议类型。在爬虫中,咱们抓取的页面一般就是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加密的,它的主要做用能够分为两种。
如今愈来愈多的网站和App都已经向HTTPS方向发展,例如:
而某些网站虽然使用了HTTPS协议,但仍是会被浏览器提示不安全,例如咱们在Chrome浏览器里面打开12306,连接为:https://www.12306.cn/,这时浏览器就会提示“您的链接不是私密链接”这样的话,如图2-3所示。
图2-3 12306页面
这是由于12306的CA证书是中国铁道部自行签发的,而这个证书是不被CA机构信任的,因此这里证书验证就不会经过而提示这样的话,可是实际上它的数据传输依然是通过SSL加密的。若是要爬取这样的站点,就须要设置忽略证书的选项,不然会提示SSL连接错误。
咱们在浏览器中输入一个URL,回车以后便会在浏览器中观察到页面内容。实际上,这个过程是浏览器向网站所在的服务器发送了一个请求,网站服务器接收到这个请求后进行处理和解析,而后返回对应的响应,接着传回给浏览器。响应里包含了页面的源代码等内容,浏览器再对其进行解析,便将网页呈现了出来,模型如图2-4所示。
图2-4 模型图
此处客户端即表明咱们本身的PC或手机浏览器,服务器即要访问的网站所在的服务器。
为了更直观地地说明这个过程,这里用Chrome浏览器的开发者模式下的Network监听组件来作下演示,它能够显示访问当前请求网页时发生的全部网络请求和响应。
打开Chrome浏览器,右击并选择“检查”项,便可打开浏览器的开发者工具。这里访问百度http://www.baidu.com/,输入该URL后回车,观察这个过程当中发生了怎样的网络请求。能够看到,在Network页面下方出现了一个个的条目,其中一个条目就表明一次发送请求和接收响应的过程,如图2-5所示。
图2-5 Network面板
咱们先观察第一个网络请求,即www.baidu.com。
其中各列的含义以下。
点击这个条目,便可看到更详细的信息,如图2-6所示。
图2-6 详细信息
首先是General部分,Request URL为请求的URL,Request Method为请求的方法,Status Code为响应状态码,Remote Address为远程服务器的地址和端口,Referrer Policy为Referrer判别策略。
再继续往下看,能够看到,有Response Headers和Request Headers,这分别表明响应头和请求头。请求头里带有许多请求信息,例如浏览器标识、Cookies、Host等信息,这是请求的一部分,服务器会根据请求头内的信息判断请求是否合法,进而做出对应的响应。图中看到的Response Headers就是响应的一部分,例如其中包含了服务器的类型、文档类型、日期等信息,浏览器接受到响应后,会解析响应内容,进而呈现网页内容。
下面咱们分别来介绍一下请求和响应都包含哪些内容。
请求,由客户端向服务端发出,能够分为4部份内容:请求方法(Request Method)、请求的网址(Request URL)、请求头(Request Headers)、请求体(Request Body)。
常见的请求方法有两种:GET和POST。
在浏览器中直接输入URL并回车,这便发起了一个GET请求,请求的参数会直接包含到URL里。例如,在百度中搜索Python,这就是一个GET请求,连接为https://www.baidu.com/s?wd=Python,其中URL中包含了请求的参数信息,这里参数wd
表示要搜寻的关键字。POST请求大多在表单提交时发起。好比,对于一个登陆表单,输入用户名和密码后,点击“登陆”按钮,这一般会发起一个POST请求,其数据一般以表单的形式传输,而不会体如今URL中。
GET和POST请求方法有以下区别。
通常来讲,登陆时,须要提交用户名和密码,其中包含了敏感信息,使用GET方式请求的话,密码就会暴露在URL里面,形成密码泄露,因此这里最好以POST方式发送。上传文件时,因为文件内容比较大,也会选用POST方式。
咱们日常遇到的绝大部分请求都是GET或POST请求,另外还有一些请求方法,如GET、HEAD、POST、PUT、DELETE、OPTIONS、CONNECT、TRACE等,咱们简单将其总结为表2-1。
表2-1 其余请求方法
方法 |
描述 |
---|---|
GET |
请求页面,并返回页面内容 |
HEAD |
相似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST |
大多用于提交表单或上传文件,数据包含在请求体中 |
PUT |
从客户端向服务器传送的数据取代指定文档中的内容 |
DELETE |
请求服务器删除指定的页面 |
CONNECT |
把服务器看成跳板,让服务器代替客户端访问其余网页 |
OPTIONS |
容许客户端查看服务器的性能 |
TRACE |
回显服务器收到的请求,主要用于测试或诊断 |
本表参考:http://www.runoob.com/http/http-methods.html。
请求的网址,即统一资源定位符URL,它能够惟一肯定咱们想请求的资源。
请求头,用来讲明服务器要使用的附加信息,比较重要的信息有Cookie、Referer、User-Agent等。下面简要说明一些经常使用的头信息。
所以,请求头是请求的重要组成部分,在写爬虫时,大部分状况下都须要设定请求头。
请求体通常承载的内容是POST请求中的表单数据,而对于GET请求,请求体则为空。
例如,这里我登陆GitHub时捕获到的请求和响应如图2-7所示。
图2-7 详细信息
登陆以前,咱们填写了用户名和密码信息,提交时这些内容就会以表单数据的形式提交给服务器,此时须要注意Request Headers中指定Content-Type为application/x-www-form-urlencoded。只有设置Content-Type为application/x-www-form-urlencoded,才会以表单数据的形式提交。另外,咱们也能够将Content-Type设置为application/json来提交JSON数据,或者设置为multipart/form-data来上传文件。
表2-2列出了Content-Type和POST提交数据方式的关系。
表2-2 Content-Type和POST提交数据方式的关系
Content-Type |
提交数据的方式 |
---|---|
application/x-www-form-urlencoded |
表单数据 |
multipart/form-data |
表单文件上传 |
application/json |
序列化JSON数据 |
text/xml |
XML数据 |
在爬虫中,若是要构造POST请求,须要使用正确的Content-Type,并了解各类请求库的各个参数设置时使用的是哪一种Content-Type,否则可能会致使POST提交后没法正常响应。
响应,由服务端返回给客户端,能够分为三部分:响应状态码(Response Status Code)、响应头(Response Headers)和响应体(Response Body)。
响应状态码表示服务器的响应状态,如200表明服务器正常响应,404表明页面未找到,500表明服务器内部发生错误。在爬虫中,咱们能够根据状态码来判断服务器响应状态,如状态码为200,则证实成功返回数据,再进行进一步的处理,不然直接忽略。表2-3列出了常见的错误代码及错误缘由。
表2-3 常见的错误代码及错误缘由
状态码 |
说明 |
详情 |
---|---|---|
100 |
继续 |
请求者应当继续提出请求。服务器已收到请求的一部分,正在等待其他部分 |
101 |
切换协议 |
请求者已要求服务器切换协议,服务器已确认并准备切换 |
200 |
成功 |
服务器已成功处理了请求 |
201 |
已建立 |
请求成功而且服务器建立了新的资源 |
202 |
已接受 |
服务器已接受请求,但还没有处理 |
203 |
非受权信息 |
服务器已成功处理了请求,但返回的信息可能来自另外一个源 |
204 |
无内容 |
服务器成功处理了请求,但没有返回任何内容 |
205 |
重置内容 |
服务器成功处理了请求,内容被重置 |
206 |
部份内容 |
服务器成功处理了部分请求 |
300 |
多种选择 |
针对请求,服务器可执行多种操做 |
301 |
永久移动 |
请求的网页已永久移动到新位置,即永久重定向 |
302 |
临时移动 |
请求的网页暂时跳转到其余页面,即暂时重定向 |
303 |
查看其余位置 |
若是原来的请求是POST,重定向目标文档应该经过GET提取 |
304 |
未修改 |
这次请求返回的网页未修改,继续使用上次的资源 |
305 |
使用代理 |
请求者应该使用代理访问该网页 |
307 |
临时重定向 |
请求的资源临时从其余位置响应 |
400 |
错误请求 |
服务器没法解析该请求 |
401 |
未受权 |
请求没有进行身份验证或验证未经过 |
403 |
禁止访问 |
服务器拒绝此请求 |
404 |
未找到 |
服务器找不到请求的网页 |
405 |
方法禁用 |
服务器禁用了请求中指定的方法 |
406 |
不接受 |
没法使用请求的内容响应请求的网页 |
407 |
须要代理受权 |
请求者须要使用代理受权 |
408 |
请求超时 |
服务器请求超时 |
409 |
冲突 |
服务器在完成请求时发生冲突 |
410 |
已删除 |
请求的资源已永久删除 |
411 |
须要有效长度 |
服务器不接受不含有效内容长度标头字段的请求 |
412 |
未知足前提条件 |
服务器未知足请求者在请求中设置的其中一个前提条件 |
413 |
请求实体过大 |
请求实体过大,超出服务器的处理能力 |
414 |
请求URI过长 |
请求网址过长,服务器没法处理 |
415 |
不支持类型 |
请求格式不被请求页面支持 |
416 |
请求范围不符 |
页面没法提供请求的范围 |
417 |
未知足指望值 |
服务器未知足指望请求标头字段的要求 |
500 |
服务器内部错误 |
服务器遇到错误,没法完成请求 |
501 |
未实现 |
服务器不具有完成请求的功能 |
502 |
错误网关 |
服务器做为网关或代理,从上游服务器收到无效响应 |
503 |
服务不可用 |
服务器目前没法使用 |
504 |
网关超时 |
服务器做为网关或代理,可是没有及时从上游服务器收到请求 |
505 |
HTTP版本不支持 |
服务器不支持请求中所用的HTTP协议版本 |
响应头包含了服务器对请求的应答信息,如Content-Type、Server、Set-Cookie等。下面简要说明一些经常使用的头信息。
最重要的当属响应体的内容了。响应的正文数据都在响应体中,好比请求网页时,它的响应体就是网页的HTML代码;请求一张图片时,它的响应体就是图片的二进制数据。咱们作爬虫请求网页后,要解析的内容就是响应体,如图2-8所示。
图2-8 响应体内容
在浏览器开发者工具中点击Preview,就能够看到网页的源代码,也就是响应体的内容,它是解析的目标。
在作爬虫时,咱们主要经过响应体获得网页的源代码、JSON数据等,而后从中作相应内容的提取。
本节中,咱们了解了HTTP的基本原理,大概了解了访问网页时背后的请求和响应过程。本节涉及的知识点须要好好掌握,后面分析网页请求时会常常用到。