URI和 URL
URI全称为Uniform Resource Identifier,即统一资源标志符;URL全称为Universal Resource Locator,即统一资源定位符。
URL是URI的子集,也就是说每个URL都是URI,但并非 每个URI都是URL。
除了URL, URI还包括一个子类,叫作 URN,其全称为Universal Resource Name,即统一资源名称。
URN只为资源命名而不指定如何定位资源。
URN用得很少,几乎所有的URI都是URL,对于一般的网页链接,既可以称之为URL,也可以称之为URI。
URL基本的组成格式:
scheme://[username:passworde]hostname[:port][/path][;parameters][?query][#fragment]
其中,中括号包括的内容代表非必要部分,比如 www.baidu.com 这个 URL,这里就只包含了 scheme 和 hostname 两部分,没有 port、path、parameters、query、fragment。
- scheme: 协议。常用的协议有 http、https、ftp等,另外 scheme也被常称作 protocol,二者都代表协议的意思。
- usename、password: 用户名和密码。在某些情况下 URL 需要提供用户名和密码才能访问, 这时候可以把用户名和密码放在host前面。比如 https:/ssr3.scrape.center 这个URL需要用户名 和密码才能访问,直接写为 https:/admin:admin@ssr3.scrape.center 则可以直接访问。
- hostname: 主机地址。可以是域名或 IP地址,比如 www.baidu.com 这个URL中的 hostname 就是 <www.baidu.com>, 这就是百度的二级域名。比如 htps://8.8.8.8 这个URL中的hostname 就是8.8.8.8,它是一个IP地址。
- port: 端口。这是服务器设定的服务端口,比如 https://8.8.8.8:12345 这个 URL 中的端口就是12345。但有些URL中没有端口信息,这是使用了默认的端口。http 协议的默认端口是80, https协议的默认端口是443。所以 https:/www.baidu.com等价于https:/www.baidu.com:443, 而 www.baidu.com相当于 www.baidu.com:80。
- path:路径。指的是网络资源在服务器中的指定地址,比如 github.com/favicon.ico 中的path 就是 favicon.ico,指的是访问GitHub根目录下的 favicon.ico。
- parameters:参数。用来指定访问某个资源时的附加信息。https://8.8.8.8:12345/hello;user中的 user 就是 parameters.
- query:查询。用来查询某类资源,如果有多个查询,则用&隔开。www.baidu.com/s?wd=nba&ie…,其中的 query 部分就是 wd=nba&ie=utf-8,这里指定了 wd是 nba,ie 是utf-8。
- fragment:片段。它是对资源描述的部分补充,可以理解为资源内部的书签。
HTTP和 HTTPS
HTTP的全称是Hypertext Transfer Protocol,中文名为超文本传输协议,其作用是把超文本数据从网络传输到本地浏览器,能够保证高效而准确地传输超文本文档。
HTTPS的全称是 Hypertext Transfer Protocol over Secure Socket Layer,是以安全为目标的HTTP通道,简单讲就是HTTP的安全版,即在HTTP下加入SSL层,简称 HTTPS。
HTTPS的安全基础是SSL,因此通过该协议传输的内容都是经过SSL加密的,SSL的主要作用有以下两种:
- 建立一个信息安全通道,保证数据传输的安全性。
- 确认网站的真实性。凡是使用了HTTPS协议的网站,都可以通过单击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,此外还可以通过CA机构颁发的安全签章来查询。
HTTP请求过程
在浏览器地址栏中输入一个 URL,按下回车之后便可观察到对应的页面内容。
实际上,这个过程是浏览器先向网站所在的服务器发送一个请求,网站服务器接收到请求后对其进行处理和解析,然后返回对应的响应,接着传回浏览器。由于响应里包含页面的源代码等内容,所以浏览器再对其进行解析,便将网页呈现出来。
客户端代表我们自己的电脑或手机浏览器,服务器就是要访问的网站所在的服务器。
在浏览器打开百度可以看到的网络请求信息:
- Name:请求的名称。一般会用URL的最后一部分内容作为名称。
- Status:响应的状态码。这里显示为200,代表响应是正常的。通过状态码,我们可以判断发送请求之后是否得到了正常的响应。
- Protocol:请求的协议类型。这里http/1.1代表HTTP1.1版本,h2代表HTTP2.0版本。
- Type:请求的文档类型。这里为 document,代表我们这次请求的是一个HTML文档,内容是一些 HTML代码。
- Initiator:请求源。用来标记请求是由哪个对象或进程发起的。
- Size:从服务器下载的文件或请求的资源大小。如果资源是从缓存中取得的,则该列会显示 from cache。
- Time:从发起请求到获取响应所花的总时间。
- Waterfall:网络请求的可视化瀑布流。
请求
请求,英文为 Request,由客户端发往服务器,分为四部分内容:请求方法 (Request Method) 、 请求的网址(Request URL)、请求头(Request Headers)和请求体(Request Body)。
请求方法
请求方法,用于标识请求客户端请求服务端的方式,常见的请求方法有两种:GET和POST。 在浏览器中直接输入URL并回车,便发起了一个GET请求,请求的参数会直接包含到URL里。 例如,在百度搜索引擎中搜索Python就是一个GET请求,链接为www.baidu.com/s?wd=Python>。
其中 URL中包含了请求的 query 信息,这里的参数 wd表示要搜寻的关键字。POST 请求大多在提交表单时发起。例如,对于一个登录表单,输入用户名和密码后,单击“登录”按钮,这时通常会发起 一个 POST 请求,其数据通常以表单的形式传输,而不会体现在URL中。
GET和 POST 请求方法的区别:
- GET请求中的参数包含在 URL里面,数据可以在URL中看到;而POST 请求的 URL不会包含这些数据,数据都是通过表单形式传输的,会包含在请求体中。
- GET 请求提交的数据最多只有1024字节,POST方式则没有限制。
常见的请求方法:
| 方 法 | 描 述 |
|---|---|
| GET | 请求页面,并返回页面内容 |
| HEAD | 类似于GET请求,只不过返回的响应中没有具体内容。用于获取报头 |
| POST | 大多用于提交表单或上传文件,数据包含在请求体中 |
| PUT | 用客户端传向服务器的数据取代指定文档中的内容 |
| DELETE | 请求服务器删除指定的页面 |
| CONNECT | 把服务器当作跳板,让服务器代替客户端访间其他网页 |
| OPTIONS | 允许客户端查看服务器的性能 |
| TRACE | 回显服务器收到的请求。主要用于测试或诊断 |
请求体
请求体,一般承载的内容是 POST请求中的表单数据,对于GET请求,请求体为空。
登录之前,需要先填写用户名和密码信息,登录时这些内容会以表单数据的形式提交给服务器, 此时需要注意 Request Headers 中指定 Content-Type为 application/x-www-form-urlencoded。 只有这样设置 Content-Type,内容才会以表单数据的形式提交。
另外,也可以将 Content-Type 设置为 application/json 来提交 JSON 数据,或者设置为 multipart/form-data 来上传文件。
请求头
请求头,用来说明服务器要使用的附加信息,比较重要的信息有Cookie,Referer,User-Agent 等。
- Accept:请求报头域,用于指定客户端可接受哪些类型的信息。
- Accept-Language:用于指定客户端可接受的语言类型。
- Accept-Encoding:用于指定客户端可接受的内容编码。
- Host:用于指定请求资源的主机IP和端口号,其内容为请求URL的原始服务器或网关的位置。 从HTTP1.1 版本开始,请求必须包含此内容。
- Cookie:也常用复数形式Cookies,这是网站为了辨别用户,进行会话跟踪而存储在用户本地的数据。它的主要功能是维持当前访问会话。
- Referer:用于标识请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如做来源统计、防盗链处理等。
- User-Agent:简称 UA,这是一个特殊的字符串头,可以使服务器识别客户端使用的操作系统及版本、浏览器及版本等信息。做爬虫时如果加上此信息,可以伪装为浏览器;如果不加,很可能会被识别出来。
- Content-Type:也叫互联网媒体类型(Internet Media Type)或者 MIME类型,在HTTP协议消息头中,它用来表示具体请求中的媒体类型信息。
响应
响应,即Response,由服务器返回给客户端,可以分为三部分:响应状态码 (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:设置Cookie。响应头中的 Set-Cookie用于告诉浏览器需要将此内容放在Cookie中,下次请求时将 Cookie携带上。
- Expires:用于指定响应的过期时间,可以让代理服务器或浏览器将加载的内容更新到缓存中。 当再次访问相同的内容时,就可以直接从缓存中加载,达到降低服务器负载、缩短加载时间的目的。
响应体
响应体,这可以说是最关键的部分了,响应的正文数据都存在于响应体中,例如请求网页时,响应体就是网页的HTML代码;请求一张图片时,响应体就是图片的二进制数据。我们做爬虫请求网页时,要解析的内容就是响应体,