第2章 网络爬虫基础
网络爬虫实现的思想是模拟用户使用浏览器向网站发送请求,网站响应请求后,将HTML文档发送过来,爬虫再对网页做信息提取和存储。因此,了解浏览器与网站服务器之间的通信方式和交互过程,理解HTML页面的组织和结构,掌握页面信息的提取和存储技术,能进一步加深对网络爬虫原理的理解。
2.1 HTTP基本原理
下面来看一下用户从浏览器输入某个网址到获取网站内容的整个过程。该过程主要分为4个步骤,如图2-1所示。
图2-1 访问网站的过程
(1)在浏览器中输入URL地址(如百度地址https://www.baidu.com),然后回车。
(2)在浏览器中向网站服务器发送请求访问的命令。
(3)网站服务器响应请求后,向浏览器发送HTML文档(也可以是图片、视频和JSON数据等其他资源)。
(4)浏览器解析、渲染HTML文档后,将页面展示给用户。
下面详细讲解这些步骤中的关键知识,这将有助于我们更深入地了解爬虫的基本原理。
2.1.1 URL介绍
我们把在浏览器的地址栏里输入的网址叫做URL(Uniform Resource Locator,统一资源定位符)。URL用于确定分散在互联网中各种资源的位置和访问方式。例如摄图网中故宫博物馆的图片地址为http://seopic.699pic.com/photo/50088/2824.jpg_wh1200.jpg。它包含了以下几种信息:
- 访问协议:http,用于确定数据传输的方式。
- 服务器名称:seopic.699pic.com,图片所在的网站服务器地址。
- 访问路径:photo/50088,图片目录。
- 资源名:2824.jpg_wh1200.jpg,图片名称。
2.1.2 HTTP和HTTPS协议
首先来看一下访问协议。为了保证浏览器能够正确解析并显示网站服务器传送的资源,需要制定一套双方都遵守的协议,最常见的有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协议了。
2.1.3 HTTP请求(Request)
当用户通过浏览器访问某个网站时,浏览器会向网站服务器发送访问请求,这个请求就叫做HTTP请求。请求包含的内容主要有:
- 请求方法(Request Method);
- 请求网址(Request URL);
- 请求头(Request Headers);
- 请求体(Request Body)。
为了更直观地说明这个过程,我们使用Chrome浏览器自带的“开发者工具”来查看浏览器发送的请求信息。下面以访问百度(https://www.baidu.com)为例来讲解。
(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中的请求头
下面简单介绍常用的请求头信息。
- Accept:浏览器端可以接受的媒体类型。text/html代表浏览器可以接受服务器发送的文档类型为text/html,也就是我们常说的HTML文档。
- Accept-Encoding:浏览器接受的编码方式。
- Accept-Language:浏览器所接受的语言种类。
- Connection:表示是否需要持久连接。keep-alive表示浏览器与网站服务器保持连接;close表示一个请求结束后,浏览器和网站服务器就会断开,下次请求时需重新连接。
- Cookie:有时也用复数形式Cookies,指网站为了辨别用户身份、进行会话跟踪而储存在用户本地的数据(通常经过加密),由网站服务器创建。例如当我们登录后,访问该网站的其他页面时,发现都是处于登录状态,这是Cookie在发挥作用。因为浏览器每次在请求该站点的页面时,都会在请求头中加上保存有用户名和密码等信息的Cookie并将其发送给服务器,服务器识别出该用户后,就将页面发送给浏览器。在爬虫中,有时需要爬取登录后才能访问的页面,通过对Cookie进行设置,就可以成功访问登录后的页面了。
- Host:指定被请求资源的Internet主机和端口号,通常从URL中提取。
- User-Agent:告诉网站服务器,客户端使用的操作系统、浏览器的名称和版本、CPU版本,以及浏览器渲染引擎、浏览器语言等。在爬虫中,设置此项可以将爬虫伪装成浏览器。
4.请求体(Request Body)
请求体中保存的内容一般是POST请求发送的表单数据。对于GET请求,请求体为空。
2.1.4 HTTP响应(Response)
当网站服务器接收到浏览器的请求后,会发送响应消息给浏览器,这个响应就叫做HTTP响应。一个完整的响应消息主要包含:
- 响应状态码(Response Status Code);
- 响应头(Response Headers);
- 响应体(Response Body)。
1.响应状态码(Response Status Code)
响应状态码表示服务器对请求的响应结果。例如,200代表服务器响应成功,403代表禁止访问,404代表页面未找到,408代表请求超时。浏览器会根据状态码做出相应的处理。在爬虫中,可以根据状态码来判断服务器的状态,如果状态码为200,则继续处理数据,否则直接忽略。表2-1中列举了常见的状态码。
表2-1 常见状态码及说明
服务器不支持请求中所用的HTTP协议版本
2.响应头(Response Headers)
响应头中包含了服务器对请求的应答信息。在Chrome浏览器的“开发者工具”中,响应头的内容在Headers选项卡中的Response Headers目录中,如图2-4所示。
图2-4 Chrome中的响应头信息
下面简单介绍一下常用的响应头信息。
- Date:服务器响应时间。
- Content-Type:返回数据的文档类型,如text/html代表返回HTML文档;application/x-javascript代表返回JavaScript文件;image/jpeg代表返回图片。
- Content-Encoding:服务器支持的返回内容压缩编码类型。
- Server:服务器软件的名称。
- Set-Cookie:设置HTTP Cookie。
- Expires:响应过期的日期和时间。
3.响应体(Response Body)
响应体中存放服务器发送给浏览器的正文数据。在Chrome浏览器的“开发者工具”中,与Headers选项卡平行的Response选项卡中存储的就是响应体数据。比如请求访问百度首页时,它的响应体就是百度首页的HTML代码,如图2-5所示。
图2-5 服务器返回的百度首页的响应体
当访问摄图网中故宫博物馆的图片(http://seopic.699pic.com/photo/50088/2824. jpg_wh1200.jpg)时,它的响应体就是一张图片的二进制数据。Response选项卡中无法显示图片数据,在左边的Preview选项卡中可以预览,如图2-6所示。
图2-6 服务器返回的图片预览
在爬虫中,我们从响应体中获取HTML代码、JSON数据和网络图片等,然后从中提取相应的内容。
2.2 网 页 基 础
当从网站服务器获取了HTML文档后,就需要从文档中提取有价值、有意义的数据了。如何从看似纷繁复杂、杂乱无章的HTML文档中提取想要的数据呢?这就必须要了解HTML的基本组成和结构了。可以将HTML看成一个树形结构,沿着树根往下遍历,就能找到任何想要位置的数据了。
2.2.1 HTML文档
HTML(HyperText Markup Language,超文本标记语言)用于创建网页。HTML使用标签来表示不同的内容,如使用表示图片,使用