1. 爬虫基础
1.1 HTTP基本原理
1.1.1 URI和URL
URI,全称Uniform Resource Identifier,即统一资源标志符;URL,全称Uniform Resource Locator,即统一资源定位符。
举例来说,https://github.com/favicon.ico既是一个URI,也是一个URL。即有favicon.ico这样一个图标资源,用这样一个URI/URL指定了访问它的唯一方式,其中包括访问协议https、访问路径(即根目录)和资源名称。通过一个链接,便可以从互联网中找到某个资源,这个链接就是URI/URL。
URL是URI的子集,也就是说每个URL都是URI,但并非每个URI都是URL。除了URL,URI还包括一个子类,叫做URN,全称Uniform Resource Name,即统一资源名称。URN只为资源命名而不指定如何定位资源。在目前的互联网中,URN使用非常少,所以几乎所有的URI都是URL。
URL遵循一定的格式规范,其基本组成格式如下:
scheme://[username:password@]hostname[:port][/path][;parameters][?query][#fragment]
其中,中括号包括的内容代表非必要部分。下面介绍几部分代表的含义和作用。
- **scheme:协议。**常用的协议有http、https、ftp等,另外也常被称作protocol。
- **username、password:用户名和密码。**在某些情况下URL需要提供用户名和密码才能访问。
- **hostname:主机地址。**可以是域名或IP地址。
- **port:端口。**服务器设定的服务端口,http协议的默认端口为80,https协议的默认端口为443。
- **path:路径。**指的是网络资源在服务器中的指定地址。
- **parameters:参数。**用来指定访问某个资源时的附加信息。
- **query:查询。**用来查询某类资源,如果有多个查询,则用&隔开。
- **fragment:片段。**对资源描述的部分补充,可以理解为资源内部的书签。现在主要用于单页面路由和HTML锚点。
1.1.2 HTTP和HTTPS
在爬虫中,我们抓取的页面主要是基于http或https协议的,因此应首先了解一下两个协议的含义。
HTTP的全称是Hypertext Transfer Protocol,即超文本传输协议,作用是把超文本数据从网络传输到本地浏览器,能够保证高效而准确地传输超文本文档。HTTPS的全称是Hypertext Transfer Protocol over Secure Socket Layer,是以安全为目标的HTTP通道,简单讲就是HTTP的安全版,即在HTTP下加入SSL层,简称HTTPS。HTTPS的安全基础是SSL,因此通过该协议传输的内容都是经过SSL加密的,SSL的作用主要有以下两种:
- 建立一个信息安全通道,保证数据传输的安全性。
- 确认网站的真实性。
1.1.3 HTTP请求过程
在浏览器地址栏中输入一个URL,按下回车之后可观察到对应的页面内容。实际上,这个过程是浏览器先向网站所在的服务器发送一个请求,网站服务器接收到请求后对其进行处理和解析,然后返回对应的响应,接着传回浏览器。由于响应里包含页面的源代码等内容,所以浏览器再对其进行解析,便将网页呈现出来。
打开浏览器,访问百度,此时单机鼠标右键并选择“检查”菜单即可打开浏览器的开发者工具,如图1-1-1所示。
切换到Network(网络)面板,然后刷新网页,可以看到在Network(网络)面板下方出现很多条目,其中一个条目就代表一次发送请求和接收响应的过程,如图1-1-2所示。
观察www.baidu.com,其中各列的含义如下:
- 第一列名称:请求的名称。一般用URL的最后一部分内容作为名称。
- 第二列状态:响应的状态码。这里显示为200,表示响应正常。通过状态码,可以判断发送请求之后是否得到了正常的响应。
- 第三列协议:请求的协议类型。
- 第四列类型:请求的文档类型。这里为document,代表这次请求的是一个HTML文档,内容是一些HTML代码。
- 第五列发起程序:请求源。用来标记请求是由哪个对象或进程发起的。
- 第六列大小:从服务器下载的文件或请求的资源大小。如果资源是从缓存中取得的,则该列会显示from cache。
- 第七列时间:从发起请求到获取响应所花的总时间。
- 第八列时间线:网络请求的可视化瀑布流。
单击这个条目,即可看到其更详细的信息,如图1-1-3所示。
首先是常规项,其中请求URL为主机请求的URL,请求方法为主机请求的方法,状态代码为响应状态码,远程地址为远程服务器的地址和端口,引用者策略为引用者判别策略。
继续往下可以看到相应标头和请求标头。请求头中包含许多请求信息,这些是请求的一部分,服务器会根据请求头里的信息判断请求是否合法,进而做出对应的响应。响应头是相应的一部分,其中包含服务器的类型、文档类型、日期等信息,浏览器在接收到响应后,会对其进行解析,进而呈现网页内容。
1.1.4 请求
请求,英文为Request,由客户端发往服务器,分为四部分内容:请求方法(Request Method)、请求的网址(Request URL)、请求头(Request Headers)、请求体(Request Body)。下面分别介绍:
1.请求方法
请求方法,用于标识请求客户端请求服务端的方式,常见的请求方法有两种:GET和POST。
在浏览器中直接输入URL并回车,便发起了一个GET请求,请求的参数会直接包含到URL里。POST请求大多在提交表单时发起,其数据通常以表单的形式传输,而不会体现在URL中。
GET请求和POST请求有如下区别:
- GET请求的参数包含在URL里,数据可以在URL中看到;而POST请求的URL不会包含这些数据,数据都是通过表单形式传输的,会包含在请求体中。
- GET请求提交的数据最多只有1024字节,POST方式则没有限制。
我们平常遇到的绝大多数请求是GET或POST请求。其实除了这两个,还有一些请求方法,如HEAD、PUT、DELETE、CONNECT、OPTIONS、TRACE等,我们简单将请求方法总结为表1-1-1。
方法 | 描述 |
---|---|
GET | 请求页面,并返回页面内容 |
HEAD | 类似于GET请求,不过返回的响应中没有具体内容。用于获取报头 |
POST | 大多用于提交表单或上传文件,数据包含在请求体中 |
PUT | 用客户端传向服务器的数据替代指定文档中的内容 |
DELETE | 请求服务器删除指定的页面 |
CONNECT | 把服务器当做跳板,让服务器代替客户端访问其他网页 |
OPTIONS | 允许客户端查看服务器的性能 |
TRACE | 回显服务器收到的请求。主要用于测试或诊断 |
2.请求的网址
请求的网址,它可以唯一确定客户端向请求的资源。
3.请求头
请求头,用来说明服务器要使用的附加信息,比较重要的信息有Cookie、Referer、User-Agent等。下面简单介绍一些常用的请求头信息:
- Accept:请求报头域,用于指定客户端可接受哪些类型的信息。
- Accept-Language:用于指定客户端可接受的语言类型。
- Accept-Encoding:用于指定客户端可接受的内容编码。
- Host:用于指定请求资源的主机IP和端口号,其内容为请求URL的原始服务器或网关的位置。
- Cookie:网站为了辨别用户,进行会话跟踪而存储在用户本地的数据。主要功能是维持当前访问会话。
- Referer:用于标识请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理。
- User-Agent:简称UA,这是一个特殊的字符串头,可以使服务器识别客户端使用的操作系统及版本、浏览器及版本等信息。做爬虫时如果加上此信息,可以伪装成浏览器。
- Content-Type:也叫做互联网媒体类型(Internet Media Type)或者MIME类型,在HTTP协议消息头中,它用来表示具体请求中的媒体类型信息。
4.请求体
请求体,一般承载的内容是POST请求中的表单数据,对于GET请求,请求体为空。
例如,登录百度时捕获到的请求和响应如图1-1-4所示。
登录之前,需要先填写用户名和密码信息,登录时这些内容会以表单数据的形式提交给服务器,此时需要注意Request Headers中指定Content-Type为application/x-www-form-urlencoded。只有这样设置Content-Type,内容才会以表单数据的形式提交。另外,也可以将Content-Type设置为application/json来提交json数据,或者设置为multipart/form-data来上传文件。
表1-1-2列出了Content-Type和POST提交数据方式的关系。
Content-Type | POST提交数据的方式 |
---|---|
application/x-www-form-urlencoded | 表单数据 |
multipart/form-data | 表单文件上传 |
application/json | 序列化JSON数据 |
text/xml | XML数据 |
在爬虫中,构造POST请求需要使用正确的Content-Type,并了解设置各种请求库的各个参数时使用的都是哪种Content-Type,否则可能会导致POST提交后无法得到正常响应。
5.响应
响应,即Response,由服务器返回给客户端,可以分为三部分:响应状态码(Response Status Code)、响应头(Response Headers)和响应体(Response Body)。
- 响应状态码
响应状态码,表示服务器的响应状态。在爬虫中,我们可以根据状态码判断服务器的响应状态,表1-1-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协议版本 |
- 响应头
响应头,包含了服务器对请求的应答信息,下面简要说明一些常用的响应头信息。
- Date:用于标识响应产生的时间。
- Last-Modified:用于指定资源的最后修改时间。
- Content-Encoding:用于指定响应内容的编码。
- Server:包含服务器的信息。
- Content-Type:文档类型,指定返回的数据是什么类型。
- Set-Cookie:设置Cookie,告诉浏览器需要将此内容放在Cookie中,下次请求时将Cookie携带上。
- Expires:用于指定响应的过期时间,可以让代理服务器或浏览器将加载的内容更新到缓存中。当再次访问相同的内容时,就可以直接从缓存中加载,达到降低服务器负载、缩短加载时间的目的。
- 响应体
响应体,可以说是最关键的部分,相应的正文都存在于响应体中。爬虫请求网页时,要解析的内容就是响应体,如图1-1-5所示。
文章来源:https://www.toymoban.com/news/detail-774321.html
在浏览器开发者工具中点击响应,就可以看到网页的源代码,也就是响应体的内容,这是爬虫的解析目标。在做爬虫时,我们主要通过响应体得到网页的源代码、JSON数据等,然后从中提取相应内容。文章来源地址https://www.toymoban.com/news/detail-774321.html
到了这里,关于《网络爬虫开发实战》学习笔记:1.1 HTTP基本原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!