1.URL
统一资源定位符,如https://www.githubs.cn/favicon.ico。其中https代表访问协议;访问路径:www.githubs.cn代表访问网站的根目录;资源名称:favicon.ico。
2.超文本
浏览器网页的源代码html就是超文本,网页就是超文本解析而成。如下:
F12->Elements里的html代码就是超文本。
3.HTTP和HTTPS
- HTTP:超文本传输协议,用于从网络传输超文本数据到本地浏览器的传送协议,能够保证高效而准确地传输超文本文档。
- HTTPS:简单讲是HTTP的安全版,其中加入了SSL层,则简称HTTPS。HTTPS的安全基础是SSL,通过它传输的数据都是经过SSL加密的。
作用:
第一:建立一个信息安全通道来保证数据传输的安全。
第二:确认网站的真实性,凡是使用了HTTPS 的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过CA 机构颁发的安全签章来查询。
4.HTTP请求过程
思考:为什么在向浏览器输入URL后,按下回车便会在浏览器的观察页看到相应的内容?
解答:请仔细观察下面这幅图。如图所示,浏览器向网站所在的服务器发出请求,网站服务器接收到请求后对其进行处理和解析,然后返回对应的响应,传回给浏览器。响应里包含了网页的源代码等内容,浏览器在对其进行解析,最后呈现。
直观呈现:
如图中红框的地方:Network下Name处每一行条目都代表一次请求和响应。
其中每一列都有其意义。
第一列Name :请求的名称,一般会将URL 的最后一部分内容当作名称。
第二列Status :响应的状态码,这里显示为2 00 , 代表响应是正常的。通过状态码,我们可以判断发送了请求之后是杏得到了正常的响应。
第三列Type : 请求的文梢类型。这里为document ,代表我们这次请求的是一个HTML 文档,内容就是一些HTML 代码。
第四列Initiator : 请求源。用来标记请求是由哪个对象或进程发起的。
第五列Size : 从服务器下载的文件和请求的资源大小。如果是从缓存中取得的资源,则该列会显示台om cache 。
第六列Time : 发起请求到获取响应所用的总时间。
第七列 Watefall:网络请求的可视化瀑布流。
每一条条目都有具体的详情信息,包含了请求和响应的相关参数内容。点击第一条:www.baidu.com
(1) General:如下,分别表示请求的URL 、请求的方法 、响应状态码 、远程服务器的地址和端口 、Referer 判别策略
(2) Response Headers:响应头信息,包含了如服务器的类型 、文档类型 、日期等信息,浏览器接收到响应后,会解析响应内容并在浏览器上呈现网页
(3) Request Headers:请求头信息,包含了如浏览器标识 、Cookies 、Host 等信息,这些信息给服务器作为判断依据,判断是否合法并作出对应的响应
具体解释:
General —— 通用信息
Request URL:请求的URL
Request Method:请求的方法
Status Code:响应状态码
Remote Address:远程服务器的地址和端口
Referer Policy:Referer 判别策略
Response Headers —— 响应头信息
Date:标识响应产生的时间
Last-Modified:指定资源的最后修改时间
Content-Encoding:指定响应内容的编码
Server:包含服务器的信息,比如名称、版本号等
Content-Type:文档类型,指定返回的数据类型是什么,如 text/html 代表返回 HTML 文档,image/jpeg 则代表返回图片
Set-Cookie:告诉浏览器需要将此内容放在Cookies中, 下次请求携带 Cookies 信息来请求资源
Expires:指定响应的资源过期时间,可以使代理服务器或浏览器将加载的内容更新到缓存中
Request Headers —— 请求头信息
Accept:请求报头域,用于指定客户端可接受哪些类型的信息
Accept-Encoding:指定客户端可接受的内容编码
Accept-Language:指定客户端可接受的语言类型
Connection:表示客户端与服务端的连接类型,keep-alive 表示持久性连接,close 表示单方面关闭连接,让连接断开
Cookie:这是网站为了辨别用户进行会话跟踪而存储在用户本地的数据,它的主要功能是维持当前访问会话
Host:指定请求资源的主机IP和端口号
User-Agent:简称UA ,可以使服务器识别客户端使用的操作系统及版本、浏览器及版本等信息
Referer:用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如做来源统计、防盗链处理等
Content-Type:表示请求的资源类型,如 text/html 代表 HTML 文档,image/gif 代表 GIF 图片, application/json 代表 JSON 类型
5.请求
请求,由客户端向服务端发出,可以分为 4 部分内容:请求方法(Request Method)、请求的网址(Request URL)、请求头(Request Headers)、请求体(Request Body)。
(1) 请求方法
常见的请求方法有两种:GET 和 POST。
在浏览器中直接输入 URL 并回车,这便发起了一个 GET 请求,请求的参数会直接包含到 URL 里。例如,在百度中搜索 Python,这就是一个 GET 请求,链接为 https://www.baidu.com/s?wd=Python,其中 URL 中包含了请求的参数信息,这里参数 wd 表示要搜寻的关键字。POST 请求大多在表单提交时发起。比如,对于一个登录表单,输入用户名和密码后,点击 “登录” 按钮,这通常会发起一个 POST 请求,其数据通常以表单的形式传输,而不会体现在 URL 中。
GET 和 POST 请求方法有如下区别。
- GET 请求中的参数包含在 URL 里面,数据可以在 URL 中看到,而 POST 请求的 URL 不会包含这些数据,数据都是通过表单形式传输的,会包含在请求体中。
- GET 请求提交的数据最多只有 1024 字节,而 POST 方式没有限制。
一般来说,登录时,需要提交用户名和密码,其中包含了敏感信息,使用 GET 方式请求的话,密码就会暴露在 URL 里面,造成密码泄露,所以这里最好以 POST 方式发送。上传文件时,由于文件内容比较大,也会选用 POST 方式。
我们平常遇到的绝大部分请求都是 GET 或 POST 请求,另外还有一些请求方法,如 GET、HEAD、POST、PUT、DELETE、OPTIONS、CONNECT、TRACE 等,我们简单将其总结为表。
(2) 请求的网址
请求的网址,即统一资源定位符 URL,它可以唯一确定我们想请求的资源。
(3) 请求头
请求头,用来说明服务器要使用的附加信息,比较重要的信息有 Cookie、Referer、User-Agent 等。下面简要说明一些常用的头信息。
- Accept:请求报头域,用于指定客户端可接受哪些类型的信息。
- Accept-Language:指定客户端可接受的语言类型。
- Accept-Encoding:指定客户端可接受的内容编码。
- Host:用于指定请求资源的主机 IP 和端口号,其内容为请求 URL 的原始服务器或网关的位置。从 HTTP 1.1 版本开始,请求必须包含此内容。
- Cookie:也常用复数形式 Cookies,这是网站为了辨别用户进行会话跟踪而存储在用户本地的数据。它的主要功能是维持当前访问会话。例如,我们输入用户名和密码成功登录某个网站后,服务器会用会话保存登录状态信息,后面我们每次刷新或请求该站点的其他页面时,会发现都是登录状态,这就是 Cookies 的功劳。Cookies 里有信息标识了我们所对应的服务器的会话,每次浏览器在请求该站点的页面时,都会在请求头中加上 Cookies 并将其发送给服务器,服务器通过 Cookies 识别出是我们自己,并且查出当前状态是登录状态,所以返回结果就是登录之后才能看到的网页内容。
- Referer:此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如作来源统计、防盗链处理等。
- User-Agent:简称 UA,它是一个特殊的字符串头,可以使服务器识别客户使用的操作系统及版本、浏览器及版本等信息。在做爬虫时加上此信息,可以伪装为浏览器;如果不加,很可能会被识别出为爬虫。
- Content-Type:也叫互联网媒体类型(Internet Media Type)或者 MIME 类型,在 HTTP 协议消息头中,它用来表示具体请求中的媒体类型信息。例如,text/html 代表 HTML 格式,image/gif 代表 GIF 图片,application/json 代表 JSON 类型,更多对应关系可以查看此对照表:http://tool.oschina.net/commons。
因此,请求头是请求的重要组成部分,在写爬虫时,大部分情况下都需要设定请求头。
(4) 请求体
请求体一般承载的内容是 POST 请求中的表单数据,而对于 GET 请求,请求体则为空。
例如,这里我登录 GitHub 时捕获到的请求和响应如图 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 来上传文件。
在爬虫中,如果要构造 POST 请求,需要使用正确的 Content-Type,并了解各种请求库的各个参数设置时使用的是哪种 Content-Type,不然可能会导致 POST 提交后无法正常响应。
6.响应
响应,由服务端返回给客户端,可以分为三部分:响应状态码(Response Status Code)、响应头(Response Headers)和响应体(Response Body)。
(1) 响应状态码
响应状态码表示服务器的响应状态,如 200 代表服务器正常响应,404 代表页面未找到,500 代表服务器内部发生错误。在爬虫中,我们可以根据状态码来判断服务器响应状态,如状态码为 200,则证明成功返回数据,再进行进一步的处理,否则直接忽略。表 2-3 列出了常见的错误代码及错误原因。
(2) 响应头
响应头包含了服务器对请求的应答信息,如 Content-Type、Server、Set-Cookie 等。下面简要说明一些常用的头信息。
- Date:标识响应产生的时间。
- Last-Modified:指定资源的最后修改时间。
- Content-Encoding:指定响应内容的编码。
- Server:包含服务器的信息,比如名称、版本号等。
- Content-Type:文档类型,指定返回的数据类型是什么,如 text/html 代表返回 HTML 文档,application/x-javascript 则代表返回 JavaScript 文件,image/jpeg 则代表返回图片。
- Set-Cookie:设置 Cookies。响应头中的 Set-Cookie 告诉浏览器需要将此内容放在 Cookies 中,下次请求携带 Cookies 请求。
- Expires:指定响应的过期时间,可以使代理服务器或浏览器将加载的内容更新到缓存中。如果再次访问时,就可以直接从缓存中加载,降低服务器负载,缩短加载时间。
(3) 响应体
最重要的当属响应体的内容了。响应的正文数据都在响应体中,比如请求网页时,它的响应体就是网页的 HTML 代码;请求一张图片时,它的响应体就是图片的二进制数据。我们做爬虫请求网页后,要解析的内容就是响应体,如图 2-8 所示。
在浏览器开发者工具中点击 Preview,就可以看到网页的源代码,也就是响应体的内容,它是解析的目标。
在做爬虫时,我们主要通过响应体得到网页的源代码、JSON 数据等,然后从中做相应内容的提取。