【第一节】Python爬虫基础-HTTP基本原理

目录

前言

一、URI和URL是什么

二、什么是超文本

三、HTTP和HTTPS的区别

四、HTTP请求过程

五、请求

六、响应


前言

在着手开发爬虫程序之前,我们需要先掌握一些基础概念。本节将详细讲解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的区别

观察淘宝首页https://www.taobao.com/的URL开头部分,可以看到http或https前缀,这表示访问资源所使用的协议类型。除此之外,我们还可能遇到以ftp、sftp、smb等开头的URL,它们也代表不同的协议类型。在爬虫工作中,主要处理的是基于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网络爬虫开发实战

相关推荐
The Future is mine11 分钟前
Python计算经纬度两点之间距离
开发语言·python
九月镇灵将13 分钟前
GitPython库快速应用入门
git·python·gitpython
兔子的洋葱圈1 小时前
【django】1-2 django项目的请求处理流程(详细)
后端·python·django
独好紫罗兰1 小时前
洛谷题单3-P5719 【深基4.例3】分类平均-python-流程图重构
开发语言·python·算法
27669582921 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿
橘子在努力1 小时前
【橘子大模型】关于PromptTemplate
python·ai·llama
SheepMeMe1 小时前
蓝桥杯2024省赛PythonB组——日期问题
python·算法·蓝桥杯
莓事哒2 小时前
selenium和pytessarct提取古诗文网的验证码(python爬虫)
爬虫·python·selenium·测试工具·pycharm
q567315232 小时前
使用puppeteer库编写的爬虫程序
爬虫·python·网络协议·http
mosquito_lover12 小时前
Python数据分析与可视化实战
python·数据挖掘·数据分析