1. URL
URL是Uniform Resource Locator的缩写,意思是统一资源定位符,它是互联网上标准的资源地址,用于定位互联网上的资源,例如网页、图片、视频等等。在浏览器地址栏中输入URL,可以让浏览器找到并显示相应的网页。URL的基本格式如下:
scheme://[username:password@]hostname[:port][/path][;parameters][?query][#fragment]
其中中括号里面的内容为非必要部分
下面介绍各部分代表的含义及作用:
- scheme:协议。常用的协议有http、https、ftp等,另外scheme也常被称为protocol。
- username、password:用户名和密码。有些URL需要提供用户名和密码才能访问,这时候把用户名和密码放在hostname前面则可以直接访问。
- hostname:主机地址。可以为域名或者IP地址。
- port:端口。这是服务器设定的服务端口。如https://8.8.8.8:2345这个URL的端口为2345。有些URL没有端口信息,使用默认端口。http协议的默认端口为80,https协议的默认端口为443。
- path:路径。指的是网络资源在服务器中的指定位置。如https://baidu.com/favicon.ico中的path就是favicon.ico。
- parameters:参数。用来指定访问某个资源时的附加信息。
- query:查询。用于查询某种资源,若查询多个资源,则用&隔开。如https://baidu.com/s?wd=python&ie=utf-8,其中query部分为wd=python&ie=utf-8,这里指定了wd的值为python,ie的值为utf-8。
- fragment:片段。对资源描述的补充说明,可以理解为资源内部的书签。目前主要有两个应用,一是用作单页面路由,比如前端框架Vue,React都可以用它来做路由管理,二是用作HTML描点,可以用它控制一个页面打开时自动下滑滚到某个特定位置。
2、HTTP和HTTPS
在爬虫中,我们通常抓取的页面是基于http或https协议的。
HTTP全称为Hypertext Transfer Protocol,中文名为超文本传输协议。其作用是把超文本数据从网络传输到本地浏览器。
HTTPS全称是Hypertext Transfer Protocol Secure Socket Layer,是以安全为通道的http通道,可以理解为http的安全版。
(ps:HTTPS的安全基础是SSL,通过该协议传输的内容都是通过SSL加密的)
3、HTTP请求过程
在浏览器地址栏输入一个URL,按下回车之后便可以访问对应的网页内容。实际上,这个过程是浏览器先向所在网站的服务器发送一个请求,网站服务器收到请求后对其进行处理和解析,然后返回对应的响应,在传回浏览器。由于响应里包含页面源代码等内容,浏览器再对其进行解析,相应的网页便呈现出来了。
为直观说明上述过程,下面用Chrome浏览器开发者模式下的Network监听组件来做一下演示。Network监听组件可以在访问当前请求的网页时,显示产生的所有网络请求和响应。
打开Chrome浏览器,访问www.baidu.com(百度),鼠标右键选择“检查”菜单(或快捷键F12),打开浏览器开发者工具。
切换到Network面板
点击刷新
此时Network面板下出现了很多条目,每一个条目就代表一次发送请求和接收响应的过程。
我们首先观察第一个网络请求,即www.baidu.com,其中各列含义如下:
- Name:请求的名称。一般取URL的最后一部分内容座位请求名称。
- Status:响应状态码。通过状态码,我们可以判断我们发送的请求是否得到了正常的响应。(此处为200,表示正常,其他响应状态码后续介绍)
- Type:请求的文档类型。此处为document,代表我们请求的是一个HTML文档,内容是一些HTML代码。
- Initiator:请求源。用于标记请求是由哪个对象或进程发起的。
- Size:从服务器下载的文件或请求的资源的大小。(from cache表示资源是从缓存中取得的)
- Time:从发起请求到获得响应消耗的总时间。
- Waterfall:网络请求的可视化瀑布流。
点击请求名称,即可进入详情页面
- General部分:
Request URL:请求的URL。
Request Method:请求的方法。
Status Code:响应状态码。
Remote Address:远程服务器的地址和端口。
Referrer Policy:Referrer判别策略。
-
Response Headers表示响应头,响应头是响应的一部分。
-
Request Headers表示请求头**,服务器会根据请求头里的信息判断请求是否合法,进而做出相应的响应。
4、请求
请求由客户端发往服务器,分为四部分内容:请求方法(Request Method)、请求网址(Request URL)、请求头(Request Headers)、请求体(Request Body),下面一一进行介绍。
请求方法:
用于标识客户端请求服务端的方式,常见的请求方法有两种:GET和POST。当我们在浏览器输入URL并回车后,便发起了一个GRT请求,而POST请求大多数在我们提交表单时发起(比如我们填写账号密码点击登录时)。GET请求中的参数会包含在URL里面,数据可以在URL内看见,POST请求则是以表单传输,不会体现在URL中。
请求网址:
唯一确定客户端想请求的资源。
请求头:
用来说明服务器要使用的附加信息。请求头是请求的重要组成部分,再写爬虫程序时,通常要设定请求头。比较重要的信息有Cookie、Referer、User-Agent等。
附加信息 | 说明 |
---|---|
Accept | 指定客户端可以接收哪些类型的信息 |
Accept-Encoding | 指定客户端可接受的内容编码 |
Accept-Language | 指定客户端可接受的语言类型 |
Cookie | 网站为辨别用户,进行会话跟踪而存储在用户本地的数据。其主要功能是维持当前会话。例如,用户输入用户名和密码成功登录某个网站后,服务器会用会话保存登录状态,之后每次刷新或请求该站点的其他页面,都会发现处于登陆状态,这就也是Cookie的作用。Cookie里有信息标识了我们所对应的服务器的会话,每次浏览器在请求该站点的页面时,都会将请求头中加上Cookie并发送给服务器,服务器通过Cookie进行识别是我们自己,并且查询出当前状态是登录状态,所以返回的结果是登录之后的网页内容。 |
Host | 指定了客户端正在连接的服务器的主机名和端口号。通常,Host头部字段的内容是网站的域名或IP地址。 |
Referer | 标识请求是从哪个页面发过来的,服务器可拿到这一信息并做相应的处理,如做来源统计,防盗链处理等。 |
User-Agent | 简称UA,可以使服务器识别客户端使用的操作系统及版本、浏览器及版本等信息。爬虫时加上此信息可以伪装成浏览器,如果不加则很容易被识别出来。 |
Content-Type | 也叫互联网媒体类型(Internet Media Type)或MIME类型,用来表示具体请求中的媒体类型信息,如text/html代表HTML格式、image/gif代表GIF图片、application/json代表JSON类型。 |
请求体:
请求体一般承载的内容是POST请求中的表单数据,多余GET请求,请求体为空。
下表为Content-Type和POST提交数据方式的关系:
Content-Type | POST提交数据的方式 |
---|---|
application/x-www-form-urlencoded | 表单数据 |
multipart/form-data | 表单文件上传 |
application/json | 序列化JOSN数据 |
text/xml | XML数据 |
爬虫程序中,构造POST请求需要使用正确的Content-Type,并了解设置各种请求库的各个参数时使用的都是那种Content-Type,否则可能导致POST提交后无法得到正常的响应。
5、响应
由服务器返回给客户端,可以分为三部分:响应状态码(Response Status Code)、响应头(Response Headers)、响应体(Response Body)。下面分别进行介绍。
响应状态码:
表示服务器的响应状态,下表为常见的错误状态吗即错误原因:
状态码 | 说明 | 详情 |
---|---|---|
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-Modidied | 指定资源的最后修改时间 |
Content-Encoding | 指定响应内容的编码 |
Server | 包含服务器的信息,包括名称、版本号等 |
Content-Type | 文档类型,指定返回的数据是什么类型 |
Set-Cookie | 设置Cookie。用于告诉浏览器需要将此内容放在Cookie中,下次请求将Cookie携带上 |
Expires | 指定响应的过期时间,可以让代理服务器或浏览器将加载的内容更新到缓存中。当再次访问相同的内容时,就可以直接从缓存中加载,达到降低服务器负载、缩短加载时间的目的 |
响应体:
存储响应正文数据。我们做爬虫请求网页时,要解析的内容就是响应体。
我们可通过Response查看网页源代码,也就是响应体的内容。
我们在做爬虫时,主要通过响应体得到网页的源代码、JSON数据等,并从中提取我们需要的内容。