【爬虫】1.1. HTTP基本原理

HTTP基本原理

本章节讲述了HTTP的基本原理,了解从浏览器中输入URL到获取网页内容之间都发生了什么。

1. URI和URL

URI的全称为Uniform Resource Identifier,即为统一资源标识符; URL的全称为Uniform Resource Locator,即统一资源定位符。 举例来说,https://github.com/favicon.ico 即是一个URI也是一个URL,意思是有一个favicon.ico图标资源,我们用上面一行的URI/URL指定了访问它的唯一方式,其中包含了访问协议https、访问路径(即根目录)和资源名称,通过这一个链接,便可以从互联网上找到某个资源,这个链接就是URI/URL。

URI里包括了URL和URN,URN的全称为Uniform Resource Name,即统一资源名称,URN只为资源命名而不指定如何定位这个资源

URI统一资源标识符
URL统一资源定位符URN统一资源名称

在目前的互联网中,URN使用得非常少,几乎所有的URI都是URL,URL的基本组成格式如下:

scheme://username:password@hostname:port/path;parameters?query#fragment
  1. Scheme (协议):
    协议指定了访问资源所使用的协议或规则。它通常是用于访问资源的协议,例如 httphttpsftpmailto 等。它告诉浏览器或其他客户端如何获取资源。另外,Scheme也被称作protocol。

  2. Username (用户名) 和 Password (密码):
    这两个部分是用于在URL中指定访问资源所需的用户名和密码。通常,它们与身份验证相关联,并用于访问受密码保护的资源。

  3. Hostname (主机地址):
    可以是域名和IP地址,主机名指定了资源所在的服务器的域名或IP地址。它是资源的物理位置。比如,https://www.baidu.com,这个URL的Hostname就是www.baidu.com;https://8.8.8.8,这个URL的Hostname就是8.8.8.8,它是一个IP地址。

  4. Port (端口):
    端口是指资源所在服务器上用于与客户端通信的端口号。它是可选的,如果未指定,会使用默认端口。例如::80 表示使用默认HTTP端口,:443 表示使用默认HTTPS端口。

  5. Path (路径):
    路径指定了服务器上资源的具体位置或目录结构。它用于定位资源在服务器上的位置。

  6. Parameters (参数):
    参数是一种附加在路径中的额外信息,通常以分号 ; 分隔。在实践中,参数并不常用,而是使用Query参数。

  7. Query (查询):
    查询参数是以问号 ? 开头的一串参数列表,用于向服务器传递额外的参数。多个参数之间使用 & 符号分隔。例如:?id=123 表示传递id参数为123,?category=books&sort=price 表示传递category参数为books,sort参数为price。

  8. Fragment (片段):
    片段用于标识资源中的特定部分。在Web页面中,片段通常用于定位页面中的某个具体位置,例如页面内的锚点。它以井号 # 开头。例如:#section1 表示定位到id为section1的元素。

2. HTTP和HTTPS

2.1. HTTP

http的全称是Hypertext Transfer Protocol,即超文本传输协议,其作用就是把超文本数据从网络传输到本地服务器,能保证高效而准确地传输超文本文档。如今,人们普遍使用的是HTTP1.1版本,当然也有不少网站支持HTTP2.0版本。

年份版本描述
1991HTTP 0.9首个HTTP版本,非常简单,只支持GET方法,并且没有头部信息。
1996HTTP 1.0引入了更多的请求方法(如POST)、响应状态码、头部字段和HTTP版本号。
1997HTTP 1.1目前最广泛使用的版本,引入持久连接、管道化连接、Host头字段等特性。
2007HTTP 1.1 (RFC 2616)正式发布HTTP 1.1的RFC文档。
2015HTTP/2改进了性能,引入二进制协议、多路复用、头部压缩和服务器推送等特性。
2018HTTP/2 (RFC 7540)正式发布HTTP/2的RFC文档。
2019HTTP/3基于UDP协议的版本,改进了性能和安全性,使用QUIC传输协议。
2020HTTP/3 (RFC 9000)正式发布HTTP/3的RFC文档。

2.2.HTTPS

HTTPS的全称是Hypertext Transfer Protocol over Secure Socket Layer,是以安全为目标的HTTP通道,简单来说就是HTTP的安全版,即在HTTP下加入SSL层,简称HTTPS。HTTPS的安全基础是SSL,因此通过该协议传输的内容都是经过SSL加密的,SSL主要作用有以下两种:①建立一个信息安全通道,保证数据传输安全性;②确认网站的真实性。

3. HTTP的请求过程

在浏览器地址栏输入一个URL,按下回车之后就可以观察所得到的内容。实际上,这个过程是浏览器先向网站所在的服务器发送一个请求,网站服务器接收到请求后对其进行处理和解析,然后返回对应的响应,接着传回浏览器,浏览器对响应里的源代码解析并呈现出来,得到的就是眼前的东西为了直观说明上述过程,我们用Chrome浏览器开发者模式下的Network监听组件来做一下,演示网站www.baidu.com:

  • 打开Chrome浏览器鼠标右键并选择“检查”菜单,即可打开浏览器的开发者工具,并切换到Network面板,我们可以看到Network面板中出现了很多条目,其中每一条目就代表一次请求和接受相应的过程:

在这里插入图片描述

  • 我们观察,其各列的含义如下:

    • 第一列Name:请求的名称。一般会用URL的最后一部分内容作为名称。
    • 第二列Status:响应的状态码。这里基本显示的是200,代表响应是正常的。通过状态吗我们可以知道发送的请求是否得到正常的回应。
    • 第三列Type:请求的文档类型。如document,代表我们这一次请求的是一个HTML文档,内容是一些代码。
    • 第四列Initiator:请求源。用来标记请求是由拿个对象或进程发起的。
    • 第五列Size:从服务器下载资源的大小,如果不是从服务器取得的,会显示其他东西。
    • 第六列Time:从发出请求到获取响应所花的总时间。
    • 第七列Waterfall:网络请求的可视化瀑布流。
    • 其他:Protocol:请求的协议类型,http/1.1代表HTTP1.1版本,h2代表HTTP2.0版本
  • 点击一个条目,来观察更具体的信息:

    • 首先是General部分,其中Request URL是请求的URL,Request Method为请求的方法,Status Code为响应状态码,Remote Address为远程服务器的地址和端口,Referred Policy为Referred判别策略。referer是用来防止 CORS(跨站请求伪造)的一种最常见及有效的方式。对于自身服务器,通过客户端发来的请求中带有的referer信息,可以判断该请求是否来源于本网站。这样就可以一定程度上避免其他网站盗取自身服务器信息,或者可以通过referer来实现广告流量引流。

    • 接着是Response Headers,代表的是响应头。响应头是响应的一部分,其中包含了服务器的类型、文档类型、日期等信息。

    • 最后是Request Headers,代表的是请求头。请求头中包含了浏览器标识、Cookie、Host等信息,服务器会根据这些信息判断请求是否合法,这些在以后爬取网页信息的时候会经常用到,可以称为“伪装”。

在这里插入图片描述

4. 请求(重要)

请求Request,由客户端发往服务器,分为四部分内容:请求方法(Request Method)、请求的网址(URL)、请求头(Requests Headers)、请求体(Requeset Body),下面进行介绍:

4.1. 请求方法(Request Method)

请求方法,用于标识请求客户端请求服务端的方式,常见的请求方式由GET和POST。在浏览器中直接输入URL并回车就会发送一个GET请求,请求的参数就会直接包含在URL里,而POST请求通常在提交表单时候发起的,例如,对于一个登录界面,如果我们用的是GET请求,那么我们的密码就会直接暴露在URL中,如果使用的是POST请求,那么数据通常就以表单形式发送,则不会体现在URL中。 除了这两个请求外,还有其他的请求:

请求类型描述
GET请求获取指定资源。通过URL中的参数传递数据,对于敏感数据不安全,通常用于获取数据。
POST在指定资源上提交数据,用于创建新资源或对资源进行修改。请求数据在请求体中传递。
PUT请求在指定位置创建或更新资源。类似于POST,但PUT是幂等的,多次请求不会产生不同结果。
DELETE请求删除指定资源。用于删除服务器上的资源。
PATCH请求对资源进行局部修改。只更新资源的部分内容。
HEAD类似于GET,但只返回响应头,不返回实际资源内容,用于检查资源是否存在和获取元信息。
OPTIONS请求查询服务器支持的请求方法。用于获取服务器支持的HTTP方法列表。
CONNECT要求在与代理服务器通信时建立隧道,用于使用SSL/TLS进行加密通信。
TRACE回显服务器接收到的请求,用于调试或测试。

4.2. 请求的网址(URL)

请求的网址,唯一确定客户端想请求的资源。

4.3. 请求头(Requests Headers)

请求头,用来说明服务器要使用的附加信息,比较重要的信息有:Cookie、Referer、User-Agent等。下面简要说明一些常用请求头信息:

请求头含义和作用示例
Accept告知服务器客户端能够接受的响应内容类型。Accept: text/html, application/json
Accept-Language告知服务器客户端可接受的语言类型。Accept-Language: en-US, zh-CN;q=0.9
Accept-Encoding告知服务器客户端可接受的内容编码方式,用于数据压缩传输。Accept-Encoding: gzip, deflate
Host指定请求的目标服务器的域名或IP地址和端口号。Host: www.example.com:8080
Cookie在HTTP请求中携带存储在客户端的Cookie信息,用于会话状态保持。例如,输入用户名和密码登录一个网站后,每次刷新和请求该站点其他页面,都会保持登录状态,这就是Cookie的功劳。Cookie: session_id=123456; user_id=987654
Referer表示当前请求的来源页面的URL,用于跟踪和统计。Referer: https://www.example.com/page1
User-Agent标识客户端应用程序或浏览器的信息,帮助服务器优化响应。User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36
Content-Type指定请求体中的数据类型,用于POST请求等需要传递数据的请求。Content-Type的设置对于数据的正确解析和处理非常重要。例如,如果服务器期望接收JSON数据,而客户端却发送了普通文本数据,服务器可能无法正确解析数据。Content-Type: application/json; charset=utf-8

4.4. 请求体(Requeset Body)

请求体,一般承载的内容是POST请求中的表单数据,对于GET请求请求体为空。以下是一些常见的Content-Type类型及其描述:

Content-Type描述
application/jsonJSON数据,常用于在客户端和服务器之间传递结构化数据。
application/x-www-form-urlencoded表单数据,通常用于在请求中传递表单数据,数据以普通URL编码格式传递。
multipart/form-data表单数据上传,支持上传文件和文本数据,用于文件上传和表单数据同时提交。
text/htmlHTML格式的网页内容,用于返回网页。
text/plain普通文本数据,没有特殊格式,通常用于返回纯文本数据。
image/jpegJPEG图片格式。
image/pngPNG图片格式。
image/gifGIF图片格式。
application/xmlXML数据格式,用于在客户端和服务器之间传递结构化数据。
application/pdfPDF文件格式。
application/javascriptJavaScript代码,用于在客户端执行脚本。
application/octet-stream二进制数据流,通常用于传输未知或不可预知的二进制数据。
audio/mpegMPEG音频文件格式,通常用于音频文件。
video/mp4MP4视频文件格式,通常用于视频文件。

5. 响应

响应,即Response,由服务器返回给客户端,可以分为三部分:响应状态码(Response Status Code)、响应头(Response Headers)、响应体(Response Body)。

5.1. 响应状态码

表示服务器的响应状态,下面列出了常见状态码及错误原因:

状态码错误原因描述
100Continue - 服务器收到请求的起始部分,客户端应继续发送剩余部分。
101Switching Protocols - 请求切换协议,服务器正在切换到新协议。
204No Content - 请求已成功处理,但没有返回内容。
206Partial Content - 客户端只请求资源的一部分,服务器成功返回部分内容。
300Multiple Choices - 请求的资源有多个可供选择的表示形式。
301Moved Permanently - 资源的URL已永久更改,需要使用新URL重新请求。
302Found - 资源的URL临时性更改,客户端应继续使用原始URL。
304Not Modified - 客户端缓存的资源是最新的,无需返回内容。
400Bad Request - 请求有误,服务器无法理解。
401Unauthorized - 请求未经授权,需要进行身份验证。
403Forbidden - 请求被服务器拒绝,通常因为权限不足。
404Not Found - 请求的资源不存在。
405Method Not Allowed - 请求方法不允许,通常因为请求方法不正确。
406Not Acceptable - 请求的资源不符合请求头中的Accept设置。
409Conflict - 请求与服务器上的资源冲突,通常用于并发操作冲突。
410Gone - 请求的资源已被永久删除,不再可用。
413Payload Too Large - 请求体太大,服务器拒绝处理。
415Unsupported Media Type - 请求的媒体类型不被支持。
429Too Many Requests - 客户端发送请求过于频繁,达到限制。
500Internal Server Error - 服务器内部错误,通常因为代码错误。
502Bad Gateway - 服务器作为网关或代理,从上游服务器接收到无效的响应。
503Service Unavailable - 服务器当前无法处理请求,通常因为过载或维护。
504Gateway Timeout - 服务器作为网关或代理,未及时从上游服务器接收到响应。

5.2. 响应头

响应头包含了服务器对请求信息的应答信息,如Content-Type、Server、Set-Cookie等。

  • Date:用于标识响应产生的时间。
  • Last-Modified:用于指定资源的最后修改时间。
  • Content-Encoding:用于指定响应内容的编码。
  • Server:包含服务器的信息,例如名称、版本号等。
  • Content-Type:文档类型,指定返回的数据是什么类型,如text/html代表返回HTML文档,等。
  • Set-Cookie:设置Coolkie,告诉浏览器下次请求时把Cookie给带上,见上面“请求”部分。
  • Expires:用于指定响应的过期时间,可以让代理服务器或者浏览器将加载的内容更新到缓存中。当再次访问相同的内容时,就可以直接从缓存中加载,达到降低服务器负载缩短加载时间的目的

5.3. 响应体

这是最关键的部分响应的正文数据都存在于响应体中,在浏览器开发者工具中点击Preview,就可以看到网页的源代码,也就是响应体的内容,这是爬虫的解析目标。

6. HTTP2.0

这部分先简单讲解HTTP2.0的相关内容,详细之后在做解释。

HTTP2.0在传输层做了很多的优化,它的主要目标是通过支持完整的请求与响应复用来减少延迟,并通过有效压缩HTTP请求头字段的方式,将协议开销降至最低,同时增加请求优先级和服务器推送的支持。HTTP2.0相比与HTTP1.1来说做了这样的优化:

  • 二进制分帧层
  • 多路复用
  • 流控制
  • 服务端推送

HTTP的普及还不完善,目前大部分网站依然以HTTP1.1为主,另外,一些编程语言还未完全支持HTTP2.0,比如对于python来说hyper、httpx等库已经支持http2.0了,但广泛使用的requests库依然只支持HTTP1.1。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金渐层大战哥斯拉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值