近几年,随着人工智能呈现爆发式发展,网络爬虫也跟着火了起来,为什么?因为人工智能离不开海量数据,没有了数据,就没有所谓的人工智能,而从互联网中获取数据是最直接、最经济、最有效的方法。网络爬虫,就是用于从互联网中,以自动化的形式,获取海量数据。
网络爬虫实现的思想是模拟用户使用浏览器向网站发送请求,网站响应请求后,将HTML文档发送过来,爬虫再对网页做信息提取和存储。因此,了解浏览器与网站服务器之间的通信方式和交互过程,理解HTML页面的组织和结构,掌握页面信息的提取和存储技术,能进一步加深对网络爬虫原理的理解。
来看一下用户从浏览器输入某个网址到获取网站内容的整个过程。该过程主要分为四个步骤,如图所示。
下面详细讲解一下这些步骤中的关键知识,这将有助于我们更深地了解爬虫的基本原理。
我们把在浏览器的地址栏里输入的网址叫做URL。URL全称Uniform Resource Locator,即统一资源定位符。URL用于确定分散在互联网中各种资源的位置和访问方式。例如摄图网中故宫博物馆的图片地址为http://seopic.699pic.com/photo/50088/2824.jpg_wh1200.jpg。它包含了以下几种信息。
首先来看一下访问协议。为了保证浏览器能够正确解析并显示网站服务器传送的资源,需要制定一套双方都遵守的协议,最常见的有HTTP和HTTPS协议。当然还有其他功能的协议,如FTP(文件传输协议)、TELNET(远程登录服务)、FILE(本地文件传输协议)等。在爬虫中,通常是通过HTTP或HTTPS协议获取到页面的。
下面就来了解一下这两个协议。
HTTP全称HyperText Transfer Protocol,即超文本传输协议。是用于从网络中传输超文本到本地浏览器的传输协议,是互联网中应用最为广泛的一种网络协议。它能保证高效而准确地传送超文本文档,我们平常看到的HTML文档就是超文本文档。
HTTP协议以明文方式发送内容,不提供任何方式的数据加密。像银行卡号、密码等对安全性要求高的信息传输,就不能使用HTTP,而要使用HTTPS协议了。
HTTPS全称HyperText Transfer Protocol over Secure Socket Layer,即安全套接字层超文本传输协议。是以安全为目标的HTTP通道,简单讲是HTTP的安全版。HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并对浏览器和服务器之间的通信加密。
现在越来越多的网站都开始采用安全级别更高的HTTPS协议了。
当用户通过浏览器访问某个网站时,浏览器会向网站服务器发送访问请求,这个请求就叫做HTTP请求。请求包含的内容主要有:
为了更直观地说明这个过程,我们使用Chrome浏览器自带的“开发者工具”来查看浏览器发送的请求信息。以访问百度(https://www.baidu.com)为例。
下面来看一下浏览器向百度的网站服务器发送了哪些请求信息。
请求方法(Request Method)
HTTP协议定义了许多与服务器交互的方法,最常用的有GET和POST方法。
如果浏览器向服务器发送一个GET请求,请求的参数信息会直接包含在URL中。例如在百度搜索栏中输入“scrapy”,点击“百度一下”按钮,就形成了一个GET请求。搜索结果页面的URL变为https://www.baidu.com/s?wd=scrapy,URL中问号(?)后面的wd=scrapy就是请求的参数,表示要搜寻的关键字。
POST请求主要用于表单的提交。表单中输入的卡号、密码等隐私信息通过POST请求方式提交后,数据不会暴露在URL中,而是保存于请求体中,避免了信息的泄露。
请求网址(Request URL)
这里请求的网址为https://www.baidu.com/,即百度主页的URL地址。另外,还有一个选项Remote Address的值为180.97.33.107:443,这是百度服务器的IP地址,也可以使用IP地址来访问百度。
请求头(Request Headers)
请求头的内容在Headers选项卡中的Request Headers目录下,如图2-3所示。请求头中包含了许多有关客户端环境和请求正文的信息,比较重要的信息有Cookie、User-Agent等。
下面简单介绍一下常用的请求头信息。
请求体(Request Body)
请求体中保存的内容一般是POST请求发送的表单数据。对于GET请求,请求体为空。
当网站服务器接收到浏览器的请求后,会发送响应消息给浏览器,这个响应就叫做HTTP响应。一个完整的响应消息主要包含:
响应状态码(Response Status Code)
状态码表示服务器对请求的响应结果。例如200代表服务器响应成功,403代表禁止访问,404代表页面未找到,408代表请求超时。浏览器会根据状态码做出相应的处理。在爬虫中,可以根据状态码来判断服务器的状态,如果状态码为200,则继续处理数据,否则直接忽略。下表列举了常见的状态码。
表- 常见状态码及说明
状态码 |
说明 |
详情 |
100 |
继续 |
服务器已收到请求的一部分,客户端应该继续发送 |
101 |
切换协议 |
请求者已要求服务器切换协议,服务器已确认并准备切换 |
200 |
成功 |
服务器已成功处理了请求 |
201 |
已创建 |
请求成功并且服务器创建了新的资源 |
202 |
已接受 |
服务器已接受请求,但尚未处理 |
203 |
非授权信息 |
服务器成功处理了请求,但返回的信息可能来自另一来源 |
204 |
无内容 |
服务器成功处理了请求,但没有返回任何内容 |
205 |
重置内容 |
服务器成功处理了请求,但没有返回任何内容 |
206 |
部分内容 |
服务器成功处理了部分GET请求 |
300 |
多种选择 |
针对请求,服务器可执行多种操作 |
301 |
永久移动 |
请求的网页已永久移动到新位置 |
302 |
临时移动 |
请求的网页暂时跳转到其他页面 |
400 |
错误请求 |
服务器不理解请求的语法 |
401 |
未授权 |
请求要求身份验证 |
403 |
禁止 |
服务器拒绝请求 |
404 |
未找到 |
服务器找不到请求的网页 |
405 |
方法禁用 |
禁用请求中指定的方法 |
406 |
不接受 |
无法使用请求的内容特性响应请求的网页 |
407 |
需要代理授权 |
与401(未授权)类似,但指定请求者应当授权使用代理 |
408 |
请求超时 |
服务器等候请求时发生超时 |
409 |
冲突 |
服务器在完成请求时发生冲突 |
410 |
已删除 |
请求的资源已永久删除 |
411 |
需要有效长度 |
服务器不接受不含有效内容长度标头字段的请求 |
412 |
未满足前提条件 |
服务器未满足请求者在请求中设置的其中一个前提条件 |
413 |
请求实体过大 |
实体过大,超出服务器的处理能力 |
414 |
URI过长 |
请求的URI(通常为网址)过长 |
415 |
不支持的媒体类型 |
请求的格式不受请求页面的支持 |
500 |
服务器内部错误 |
服务器遇到错误,无法完成请求 |
501 |
尚未实施 |
服务器不具备完成请求的功能 |
502 |
错误网关 |
服务器作为网关或代理,从上游服务器收到无效响应 |
503 |
服务不可用 |
服务器目前无法使用 |
504 |
网关超时 |
没有及时从上游服务器收到请求 |
505 |
HTTP版本不支持 |
服务器不支持请求中所用的HTTP协议版本 |
响应头(Response Headers)
响应头包含了服务器对请求的应答信息。在Chrome浏览器的“开发者工具”中,响应头的内容在Headers选项卡中的Response Headers目录中,如图2-4所示。
下面简单介绍一下常用的头信息。
响应体(Response Body)
响应体中存放服务器发送给浏览器的正文数据。在Chrome浏览器的“开发者工具”中,与Headers选项卡平行的Response选项卡中存储的就是响应体数据。比如请求访问百度首页时,它的响应体就是百度首页的HTML代码,如图所示。
当访问摄图网中故宫博物馆的图片(http://seopic.699pic.com/photo/50088/2824.jpg_wh1200.jpg)时,它的响应体就是一张图片的二进制数据。Response选项卡中无法显示图片数据,在左边的Preview选项卡中可以预览,如图所示。
在爬虫中,我们从响应体中获取HTML代码、JSON数据、网络图片等,然后从中提取相应的内容。
节选自书籍:《从零开始学Scrpay网络爬虫》,作者张涛
下一节继续讲解:《从零开始学网络爬虫》之网络爬虫基础(网页基础)