目录
前言
在着手开发爬虫程序之前,我们需要先掌握一些基础概念。本节将详细讲解HTTP的基本工作原理,重点分析从浏览器输入网址到获取网页内容的全过程。理解这些知识对后续掌握爬虫原理具有重要意义。
一、URI和URL是什么
首先需要明确URI和URL的概念。URI全称为统一资源标志符(Uniform Resource Identifier);URL全称为统一资源定位符(Universal Resource Locator)。
举例说明,https://img-home.csdnimg.cn/images/20201124032511.png 是csdn网站图标地址,它既是URL也是URI。这个链接明确指出了访问该图标资源的具体方式,包括使用的https协议、根目录"/"路径以及资源名称20201124032511.png。通过这样的链接,我们就能在互联网上准确定位到目标资源,这正是URL/URI的核心功能。
需要说明的是,URL实际上是URI的一个子集。也就是说,所有URL都属于URI,但并非所有URI都是URL。那么什么样的URI不属于URL呢?URI还有一个子类别叫URN(统一资源名称,Universal Resource Name)。URN仅对资源进行命名而不提供定位信息,例如urn:isbn:0451450523这个ISBN编号可以唯一标识一本书,但没有说明在哪里能找到这本书。URL、URN和URI之间的关系可以通过下图直观展示。

不过在当前的互联网环境中,URN的使用非常罕见,因此绝大多数URI实际上都是URL。日常使用的网页链接,既可以称为URL也可以称为URI,个人更习惯使用URL这个称呼。
二、什么是超文本
接下来介绍超文本(hypertext)的概念。我们在浏览器中看到的网页,实际上就是由超文本解析呈现的。网页源代码由HTML代码构成,包含各种标签元素,比如显示图片的img标签、定义段落的p标签等。浏览器解析这些标签后,就形成了我们日常浏览的网页界面,而这些HTML源代码就是所谓的超文本。
实际操作中,以淘宝首页为例,在Chrome浏览器中打开页面后,右键点击选择"检查"选项(或直接按F12键),即可调出开发者工具。在Elements标签页中,可以看到当前网页的源代码,这些代码都属于超文本范畴,如下图所示。

三、HTTP和HTTPS的区别
HTTP全称为超文本传输协议(Hyper Text Transfer Protocol),主要用于将超文本数据从网络传输到本地浏览器,确保文档能够高效准确地传输。该协议由万维网协会(World Wide Web Consortium)和互联网工程任务组(IETF)共同制定,目前普遍使用的是HTTP1.1版本。
HTTPS全称是安全超文本传输协议(Hyper Text Transfer Protocol over Secure Socket Layer),简单理解就是在HTTP基础上增加了SSL安全层。HTTPS的安全基础是SSL加密,所有通过它传输的数据都会经过加密处理。其主要功能包括:建立安全的信息传输通道确保数据安全;验证网站的真实性。使用HTTPS的网站,用户可以通过点击浏览器地址栏的锁形图标查看网站认证信息,也可以通过CA机构颁发的安全签章进行验证。近年来,越来越多的网站和应用都转向使用HTTPS协议,例如:
(1)苹果公司要求所有iOS应用在2017年1月1日前必须改用HTTPS加密,否则无法上架App Store。
(2)谷歌从2017年1月发布的Chrome56版本开始,会对未使用HTTPS加密的网站显示"不安全"警告。
(3)微信小程序开发规范要求后台必须使用HTTPS进行网络通信,不符合要求的域名和协议将无法发起请求。
需要注意的是,有些网站虽然使用了HTTPS协议,但浏览器仍会提示不安全。例如很早以前访问12306官网https://www.12306.cn/时,Chrome浏览器会显示"您的连接不是私密连接"的警告(如下图所示)。

这是因为12306的CA证书是由中国铁道部自行签发的,以前没有得到CA机构的信任,导致证书验证失败,现在应该没啥问题了。但实际上数据传输仍然是经过SSL加密的。在爬取这类网站时,需要设置忽略证书选项,否则会出现SSL连接错误。
四、HTTP请求过程
当我们在浏览器地址栏输入URL并回车后,就能看到网页内容。实际上这个过程包含了多个步骤:浏览器向网站服务器发送请求,服务器接收并处理请求后返回响应,响应中包含网页源代码等内容,浏览器解析后最终呈现网页界面。这个过程的基本模型如下图所示。

在这个模型中,客户端指的是用户使用的浏览器(PC端或移动端),服务器则是托管目标网站的服务器。
为了更直观地观察这个过程,我们可以使用Chrome浏览器的开发者工具中的Network面板。它能完整记录访问网页时发生的所有网络请求和响应。具体操作方法是:打开Chrome浏览器,右键选择"检查"调出开发者工具,访问百度首页http://www.baidu.com/,在Network面板中可以看到一系列请求记录,每个记录代表一次完整的请求-响应过程,如下图所示。

以第一个请求(www.baidu.com)为例,各列信息含义如下:
-
Name:请求名称,通常取自URL的最后部分。
-
Status:响应状态码,200表示请求成功。
-
Type:请求的文档类型,document表示请求的是HTML文档。
-
Initiator:标记请求的发起来源。
-
Size:从服务器下载的资源大小,若从缓存获取则显示from cache。
-
Time:从发起请求到接收响应所花费的总时间。
-
Waterfall:以瀑布流形式可视化展示请求过程。
点击具体条目可以查看详细信息(如下图所示):

General部分包含Request URL(请求地址)、Request Method(请求方法)、Status Code(状态码)、Remote Address(服务器地址和端口)以及Referrer Policy(来源策略)。下方还分别列出了Response Headers(响应头)和Request Headers(请求头)。请求头包含浏览器标识、Cookies、Host等重要信息,服务器通过这些信息判断请求的合法性。响应头则包含服务器类型、文档类型、日期等信息,浏览器接收后会据此解析响应内容。
下面我们分别详细介绍请求和响应的组成要素。
五、请求
客户端向服务器发送的请求包含四个主要部分:请求方法(Request Method)、请求地址(Request URL)、请求头(Request Headers)和请求体(Request Body)。
1. 请求方法
最常用的请求方法有GET和POST两种。
在浏览器地址栏直接输入URL并回车,就是发起GET请求,请求参数会直接包含在URL中。例如在百度搜索"Python"时,URL为https://www.baidu.com/s?wd=Python,其中wd参数就是搜索关键词。POST请求则多用于表单提交,比如登录时输入用户名和密码后点击"登录"按钮,通常会发起POST请求,数据以表单形式传输而不显示在URL中。
GET和POST的主要区别在于:
-
GET请求参数暴露在URL中,POST请求参数包含在请求体内。
-
GET请求有长度限制(通常1024字节),POST请求没有这个限制。
由于安全性考虑,涉及敏感信息(如密码)的操作建议使用POST方法。文件上传等大数据量传输也适合使用POST方法。
除了GET和POST,HTTP协议还定义了其他请求方法,如下表所示:

参考来源:http://www.runoob.com/http/http-methods.html
2. 请求地址
请求地址就是URL,用于唯一标识要请求的资源。
3. 请求头
请求头包含附加信息,重要字段包括:
-
Accept:客户端可接受的响应类型。
-
Accept-Language:客户端接受的语言类型。
-
Accept-Encoding:客户端接受的内容编码方式。
-
Host:请求的目标主机和端口(HTTP1.1必须包含)。
-
Cookie:存储在用户本地的会话信息,用于维持登录状态等。
-
Referer:标识请求来源页面。
-
User-Agent:客户端浏览器和系统信息(爬虫需要合理设置)。
-
Content-Type:请求内容的媒体类型(MIME类型),常见值包括:
-
text/html:HTML文档
-
image/gif:GIF图片
-
application/json:JSON数据
完整对应关系参考:http://tool.oschina.net/commons
请求头是爬虫开发中需要重点处理的部分,大多数情况下都需要进行适当设置。
4. 请求体
POST请求的表单数据通常放在请求体中,GET请求的请求体为空。以百度登录为例(如下图所示),在提交登录表单时,用户名和密码会以表单数据形式放在请求体中。


此时请求头中的Content-Type需要设置为application/x-www-form-urlencoded。不同的Content-Type对应不同的数据提交方式,如下表所示:

在编写爬虫时,构造POST请求必须正确设置Content-Type,否则可能导致服务器无法正确处理请求。
六、响应
服务器返回的响应包含三个主要部分:状态码(Response Status Code)、响应头(Response Headers)和响应体(Response Body)。
1. 状态码
状态码表示请求的处理结果,常见的有:
-
200:请求成功
-
404:页面不存在
-
500:服务器内部错误
爬虫程序可以根据状态码判断是否继续处理响应内容。完整的状态码说明如下表:

更详细的状态码如下:




2. 响应头
重要响应头字段包括:
-
Date:响应生成时间。
-
Last-Modified:资源最后修改时间。
-
Content-Encoding:内容编码方式。
-
Server**:服务器软件信息。
-
Content-Type:响应体数据类型。
-
Set-Cookie:设置客户端Cookie。
-
Expires:响应过期时间,用于缓存控制。
3. 响应体
响应体包含实际的响应内容。对于网页请求来说,响应体就是HTML源代码;对于图片请求,则是图片二进制数据。爬虫程序主要处理的就是响应体内容。
在开发者工具中点击"Preview"可以查看格式化后的响应内容,预览的内容可以右键查看源代码,这也是爬虫需要解析的目标数据。

本节详细讲解了HTTP的基本原理,包括请求响应过程、URL/URI、超文本、HTTP/HTTPS协议等核心概念。这些知识是后续网页分析的基础,需要重点掌握。
参考学习书籍:Python 3网络爬虫开发实战