更新时间:2021-08-09 18:09:53
网络爬虫实现的思想是模拟用户使用浏览器向网站发送请求,网站响应请求后,将HTML文档发送过来,爬虫再对网页做信息提取和存储。因此,了解浏览器与网站服务器之间的通信方式和交互过程,理解HTML页面的组织和结构,掌握页面信息的提取和存储技术,能进一步加深对网络爬虫原理的理解。
下面来看一下用户从浏览器输入某个网址到获取网站内容的整个过程。该过程主要分为4个步骤,如图2-1所示。
图2-1 访问网站的过程
(1)在浏览器中输入URL地址(如百度地址https://www.baidu.com),然后回车。
(2)在浏览器中向网站服务器发送请求访问的命令。
(3)网站服务器响应请求后,向浏览器发送HTML文档(也可以是图片、视频和JSON数据等其他资源)。
(4)浏览器解析、渲染HTML文档后,将页面展示给用户。
下面详细讲解这些步骤中的关键知识,这将有助于我们更深入地了解爬虫的基本原理。
我们把在浏览器的地址栏里输入的网址叫做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请求。请求包含的内容主要有:
(1)打开Chrome浏览器,按F12键,显示“开发者工具”栏。
(2)在地址栏中输入百度网址https://www.baidu.com,然后回车。
(3)此时“开发者工具”栏抓取到了许多浏览器请求及服务器响应信息。按如图2-2所示的顺序选中各个选项,在第4步的Headers选项卡中,就能查看到请求信息了。
图2-2 查看请求内容
下面来看一下浏览器向百度的网站服务器发送了哪些请求信息。
1.请求方法(Request Method)
HTTP协议定义了许多与服务器交互的方法,最常用的有GET和POST方法。
如果浏览器向服务器发送一个GET请求,则请求的参数信息会直接包含在URL中。例如在百度搜索栏中输入scrapy,单击“百度一下”按钮,就形成了一个GET请求。搜索结果页面的URL变为https://www.baidu.com/s?wd=scrapy,URL中问号(?)后面的wd=scrapy就是请求的参数,表示要搜寻的关键字。
POST请求主要用于表单的提交。表单中输入的卡号、密码等隐私信息通过POST请求方式提交后,数据不会暴露在URL中,而是保存于请求体中,避免了信息的泄露。
2.请求网址(Request URL)
另外,还有一个选项Remote Address:180.97.33.107:443,这是百度服务器的IP地址。也可以使用IP地址来访问百度。
3.请求头(Request Headers)
请求头的内容在Headers选项卡中的Request Headers目录下,如图2-3所示。请求头中包含了许多有关客户端环境和请求正文的信息,比较重要的信息有Cookie和User-Agent等。
图2-3 Chrome中的请求头
下面简单介绍常用的请求头信息。
请求体中保存的内容一般是POST请求发送的表单数据。对于GET请求,请求体为空。
当网站服务器接收到浏览器的请求后,会发送响应消息给浏览器,这个响应就叫做HTTP响应。一个完整的响应消息主要包含:
响应状态码表示服务器对请求的响应结果。例如,200代表服务器响应成功,403代表禁止访问,404代表页面未找到,408代表请求超时。浏览器会根据状态码做出相应的处理。在爬虫中,可以根据状态码来判断服务器的状态,如果状态码为200,则继续处理数据,否则直接忽略。表2-1中列举了常见的状态码。
表2-1 常见状态码及说明
图2-4 Chrome中的响应头信息
响应体中存放服务器发送给浏览器的正文数据。在Chrome浏览器的“开发者工具”中,与Headers选项卡平行的Response选项卡中存储的就是响应体数据。比如请求访问百度首页时,它的响应体就是百度首页的HTML代码,如图2-5所示。
图2-5 服务器返回的百度首页的响应体
图2-6 服务器返回的图片预览
当从网站服务器获取了HTML文档后,就需要从文档中提取有价值、有意义的数据了。如何从看似纷繁复杂、杂乱无章的HTML文档中提取想要的数据呢?这就必须要了解HTML的基本组成和结构了。可以将HTML看成一个树形结构,沿着树根往下遍历,就能找到任何想要位置的数据了。
HTML(HyperText Markup Language,超文本标记语言)用于创建网页。HTML使用标签来表示不同的内容,如使用表示图片,使用