【Python爬虫开发基础⑥】计算机网络基础(Web和HTTP)

news2024/10/6 8:38:16

专栏:python网络爬虫从基础到实战 欢迎订阅!近期还会不断更新~
另外:如果想要看更多的计算机网络知识,可以关注我的专栏:计算机网络
往期推荐
【Python爬虫开发基础①】Python基础(变量及其命名规范)
【Python爬虫开发基础②】Python基础(正则表达式)
【Python爬虫开发基础③】Python基础(文件操作方法汇总)
【Python爬虫开发基础④】爬虫原理
【Python爬虫开发基础⑤】HTML页面构成概述
上一篇文章已经介绍了HTML语言,本篇文章来简单的介绍一下计算机网络的应用层,特别是Web和HTTP协议,方便写程序时,让我们更加高效的书写代码~


文章目录

  • 1 前置知识
    • 1.1 网络应用模型
      • 1.1.1 C/S架构(客户端-服务器模型)
      • 1.1.2 B/S架构(浏览器-服务器模型)
    • 1.2 域名系统(DNS)
      • 1.2.1 层次域名空间
      • 1.2.2 域名服务器
  • 2 HTTP概述
    • 2.1 什么是HTTP
    • 2.2 HTTP的工作原理
  • 3 HTTP的发展阶段
    • 3.1 采用非持续连接的HTTP
    • 3.2 采用持续连接的HTTP
  • 4 HTTP报文结构
  • 5 用户与服务器的交互:Cookie
  • 6 Web缓存
  • 7 条件GET方法


1 前置知识

1.1 网络应用模型

网络应用模型是指在网络环境下,进行应用程序开发和交互的一种架构或模式。常见的网络应用模型包括客户端-服务器模型、浏览器-服务器模型和分布式模型。

1.1.1 C/S架构(客户端-服务器模型)

在客户端-服务器模型中,应用程序被分为两个主要组件:客户端和服务器。

  • 客户端是指用户使用的设备(例如个人计算机、手机应用程序或网页浏览器等),客户端通常提供用户界面,允许用户与服务器进行交互,并将用户的请求打包成数据包发送给服务器。
  • 服务器存储和处理数据的远程计算机(在网络中具有固定的 IP 地址和提供特定服务的软件,如网站服务器、文件服务器、邮件服务器等),它接收来自客户端的请求,并根据请求执行相应的操作,然后将结果返回给客户端
  • 这种模型常用于 Web 应用开发、移动应用开发等。
  • 客户端和服务器之间通过网络进行通信,通常使用标准的网络协议,如HTTP(超文本传输协议)或TCP/IP(传输控制协议/互联网协议)。客户端通过指定服务器的地址和端口号来建立连接,并发送请求消息。服务器接收到请求后,处理请求并将结果封装成响应消息返回给客户端。

这种模型具有以下几个特点

  1. 分工明确:客户端负责发送请求和展示结果,服务器负责处理请求和提供服务。
  2. 可扩展性:通过增加服务器的数量可以提高系统的性能和容量。
  3. 可靠性:专门的服务器设备可以提供稳定的服务,并进行备份和故障恢复。
  4. 统一标准:使用标准的网络协议,使得各种不同类型的客户端能够与服务器进行通信。

在这里插入图片描述

1.1.2 B/S架构(浏览器-服务器模型)

浏览器-服务器模型是客户端-服务器模型的一种特殊形式,其中客户端使用的是浏览器作为用户界面。描述了在Web应用程序中,浏览器和服务器之间的交互方式。

  • 在这个模型中,用户通过浏览器向服务器发出请求,浏览器充当客户端的角色,并从服务器获取 Web 页面的内容
  • 具体来说,当用户在浏览器中输入URL或点击链接时,浏览器会发送HTTP请求到特定的服务器。该请求包含了用户要访问的资源的信息,比如HTML文件、图片、CSS样式表或JavaScript代码等。
  • 服务器根据请求的路径和参数进行处理,将所需的资源打包成HTTP响应返回给浏览器。
  • 根据请求生成动态的 HTML 页面或提供静态的资源,并将其发送回浏览器进行显示。
  • 在这个交互过程中,浏览器和服务器之间通过HTTP协议进行通信。HTTP定义了一套规范,规定了请求和响应的格式,以及一些状态码和标头字段的含义

浏览器-服务器模型的优点包括:

  1. 客户端无需事先安装特定程序,只要有浏览器即可访问Web资源。
  2. 服务器端可以集中管理和提供资源,对用户来说更加方便。
  3. Web应用程序的开发可以分为前端和后端,在不同层面上进行开发,使任务分工更清晰。

在这里插入图片描述

1.2 域名系统(DNS)

域名系统(Domain Name System,DNS)是互联网中用于将域名转换为IP地址的分布式命名系统。它充当了互联网中的"电话簿",将易于记忆的域名映射到对应的IP地址。DNS系统采用人们更喜欢使用具有特定含义的字符串来标识因特网上的计算机。客户/服务器模型,其协议运行在UDP之上,使用53号端口。

在Web上,我们通常使用域名来访问网站,例如www.example.com。然而,计算机和网络通信使用的是IP地址,如192.0.2.1。DNS的主要作用是将这两者进行关联。

1.2.1 层次域名空间

层次域名空间是指域名系统(DNS)中的层次和结构化组织。它通过将域名划分为不同级别的域名,并按照层次结构进行管理和解析。

因特网采用层次树状结构的命名方法。采用这种命名方法,任何一个连接到因特网的主机或路由器,都有一个唯一的层次结构名称,即域名(Domain Name)。

(Domain)是名字空间中一个可被管理的划分。域还可以划分为子域,而子域还可以继续划分为子域的子域,这样就形成了顶级域、二级域、三级域等。每个域名都由标号序列组成,而各标号之间用点(“.”)隔开

注意

  1. 标号中的英文不区分大小写。
  2. 标号中除连字符外不能使用其他的标点符号。
  3. 每个标号不超过63个字符,多标号组成的完整域名最长不超过255个字符。
  4. 级别最低的域名写在最左边,级别最高的顶级域名写在最右边。

在这里插入图片描述

1.2.2 域名服务器

域名服务器是一个网络服务,用于将域名转换为相应的IP地址。它充当域名解析的中心枢纽,在互联网上提供域名与IP地址之间的映射关系。

当用户在浏览器或其他网络应用程序中输入一个域名时,操作系统会向本地域名服务器发起查询请求。如果本地域名服务器拥有该域名的缓存信息,则直接返回对应的IP地址。否则,本地域名服务器会通过递归查询的方式向更高级的域名服务器进行查询

  • 域名服务器按照层次结构组织,其中最顶层的是根域名服务器
  • 根域名服务器负责管理顶级域名(TLD)的信息,如.com、.org等。
  • 当本地域名服务器无法直接解析域名时,它会向根域名服务器发送查询请求,以获取下一级域名服务器的信息

在这里插入图片描述


2 HTTP概述

万维网(World Wide Web,WWW)是一个分布式、联机式的信息存储空间,在这个空间中:一样有用的事物称为一样“资源”,并由一个全域“统一资源定位符”(URL)标识。这些资源通过超文本传输协议(HTTP)传送给使用者,而后者通过单击链接来获取资源。

2.1 什么是HTTP

超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
HTTP定义了浏览器(万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器

从层次的角度看,HTTP是面向事务的(Transaction-oriented)应用层协议,它规定了在浏览器和服务器之间的请求和响应的格式与规则,是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。

在计算机网络中,Web是一种应用,在7层模型中运行在最上层的应用层,HTTP是支持Web这种应用的协议

2.2 HTTP的工作原理

从协议执行过程来说,浏览器要访问WWW服务器时,首先要完成对WWW服务器的域名解析。一旦获得了服务器的IP地址,浏览器就通过TCP向服务器发送连接建立请求

HTTP是基于B/S架构通信的,也就是浏览器/服务器架构。在这个模型中,客户端也就是浏览器,用于请求、接收和显示Web对象服务器用于对请求进行相应,发送客户端需要的对象

HTTP的工作流程如下图所示

  • 每一个万维网站点也就是服务器,都有一个服务器进程,它永远守候在80号端口进行监听
  • 当监听到客户的请求时,便与其建立TCP连接,并分配一个新的socket指向与这个用户的会话关系,用于与其进行通信。
  • 与此同时,服务器仍然监听80号端口查看是否有新的客户端请求建立连接,若有则重复上述步骤。
  • 在这里,80号端口称为守候进程(Waiting Socket),新的socket称为连接进程(Connection Socket)。

在这里插入图片描述
用浏览器访问一个URL所经历的过程

  1. 浏览器分析链接指向页面的 URL。
  2. 浏览器向 DNS 请求解析上面URL的IP地址。
  3. 域名系统DNS解析出清华大学服务器的IP地址。
  4. 浏览器与该服务器建立TCP连接(默认端口号为80)。
  5. 浏览器发出 HTTP请求:GET/index.htm
  6. 服务器通过HTTP响应把文件index.htm发送给浏览器。
  7. 释放TCP连接。
  8. 浏览器解释文件index.htm,并将 Web 页显示给用户。

3 HTTP的发展阶段

HTTP协议的发展经历了几个阶段,最主要的发展就是非持续连接和持续连接的区别。每个请求/相应是经过一个单独的TCP连接发送的称为非持续连接,如果所有的请求及其相应都是经过相同的TCP连接发送的,则称为持续连接。

3.1 采用非持续连接的HTTP

  1. 客户端发起一个与服务器的TCP连接(建立套接字),端口号为80
  2. 服务器接受客户端的TCP连接
  3. 在浏览器与Web服务器交换HTTP报文
  4. TCP连接关闭

其中,每一个TCP连接在服务器发送一个对象后关闭,而且每个TCP连接只传输一个请求报文和一个响应报文

这种协议是无状态的也称为非持久HTTP,即服务器不保留与客户交易时的任何状态。这就大大减轻了服务器记忆负担,从而保持较快的响应速度。
在这里插入图片描述

3.2 采用持续连接的HTTP

HTTP 1.1中,引入了保持活动机制,其中连接可以重用于多个请求。这样的持久性连接可以明显减少请求延迟,因为在发送第一个请求之后,客户端不需要重新进行TCP 三次握手连接。另一个积极的副作用是,通常,由于TCP的缓慢启动机制,连接随着时间的推移而变得更快
在这里插入图片描述

持续连接有分为非流水线和流水线两种方式

  • 对于非流水线方式,客户在收到前一个响应后才能发出下一个请求,服务器发送完一个对象后,其TCP连接就处于空闲状态,浪费了服务器资源。
  • HTTP 1.1 的默认方式是使用流水线的持久连接,这种情况下,客户每遇到一个对象引用就立即发出一个请求,因而客户可以逐个地连续发出对各个引用对象的请求。就像是滑动窗口的发送方式。
  • 如果所有的请求和响应都是连续发送的,那么所有的引用对象共经历1个RTT延迟,而不像非水线方式那样,每个引用都必须有1个RTT延迟。

这种方式减少了TCP 连接中的空闲时间,提高了效率。


4 HTTP报文结构

在浏览器和服务器之间的请求与响应的交互,必须遵循规定的格式和规则,这些格式和规则就是HTTP。因此 HTTP有两类报文:请求报文和响应报文。我们做爬虫,正是通过获取并分析这些报文来分辨是否是我们要获得的信息。

在这里插入图片描述
在这里插入图片描述

HTTP有两种报文,请求报文和响应报文,结构如上图所示。
HTTP请求报文和响应报文都由三个部分组成。从图中可以看出,这两种报文格式的区别就是开始行不同。本节主要介绍每个字段的意义以及存储的内容,下一篇文章通过实战,带你了解在浏览器中看一下这些报文到底在哪。

  • 开始行

用于区分是请求报文还是响应报文。在请求报文中的开始行称为请求行,而在响应报文中的开始行称为状态行。开始行的三个字段之间都以空格分隔,最后的“CR”和“LF”分别代表“回车”和“换行”。

请求报文的“请求行”有三个内容:方法、请求资源的URL及HTTP的版本。其中,“方法”是对所请求对象进行的操作,这些方法实际上也就是一些命令。下表给出了HTTP请求报文中常用的几个方法。

方法(操作)意义
GET请求读取由URL标识的信息
HEAD请求读取由URL标识的信息的首部
POST给服务器添加信息(如注释)
CONNECT用于代理服务器
  • 首部行

用来说明浏览器、服务器或报文主体的一些信息。首部可以有几行,但也可以不使用。

在每个首部行中都有首部字段名和它的值,每一行在结束的地方都要有“回车”和“换行”。整个首部行结束时,还有一空行将首部行和后面的实体主体分开。

  • 状态码

响应报文中的状态行中有一个状态码字段,它描述了请求的结果。下表说明了主要的状态码和对应的意义

状态码意义
200 OK请求成功,信息在返回的响应报文中
301 Moved Permanently请求的对象已经被永远的转移了,新的URL定义在响应报文的Location,首部行中。客户软件将自动获取新的URL
400 Bad Request一个通用的差错代码,指示该请求不能被服务器理解
404 Not Found被请求的文档不在服务器上
505 HTTP Version Not Supported服务器不支持请求报文使用的HTTP协议版本

5 用户与服务器的交互:Cookie

我们前面提到了HTTP服务器是无状态的。这简化了服务器的设计,并且允许工程师们去开发可以同时处理数以千计的TCP连接的高性能Web服务器。

然而有的站点希望根据不同的用户推送不同的内容,并且在下一次访问时可以找到之前的访问记录,根据以前的访问进行本次访问。为此,HTTP使用了cookie,它允许站点对用户进行跟踪。
目前大多数商务Web 站点都使用了cookie。

如下图所示,cookie技术有4个组件

  1. 在 HTTP响应报文中的一个cookie首部行;
  2. 在 HTTP请求报文中的一个cookie首部行;
  3. 在用户端系统中保留有一个cookie文件,并由用户的浏览器进行管理;
  4. 位于Web站点的一个后端数据库

并且下图用一个例子说明了cookie的工作过程
在这里插入图片描述

从上述过程中我们看到,cookie可以用于标识一个用户

  • 用户首次访问一个站点时,可能需要提供一个用户标识(可能是名字)。
  • 在后继会话中,浏览器向服务器传递一个cookie首部,从而向该服务器标识了用户。
  • 因此cookie可以在无状态的HTTP之上建立一个用户会话层

在后续的爬虫编程中,我们也会用到cookie。


6 Web缓存

在本文的以上内容中,我们介绍的都是客户端直接访问服务器。但是这样的操作往往会使得服务器的负担较重,这时,如果有一个代理,能够将一部分内容拿出来,帮助Web服务器完成用户的访问,那么无论是对于用户还是服务器来说都是有利的。

Web缓存(Web cache)也称代理服务器(proxy server),它是能够代表初始Web服务器来满足HTTP请求的网络实体。Web缓存器有自己的磁盘存储空间,并在存储空间中保存最近请求过的对象的副本

在这里插入图片描述
使用Web缓存处理客户端请求的过程

  1. 浏览器创建一个到Web 缓存器的 TCP连接,并向Web缓存器中的对象发送一个HTTP请求
  2. Web缓存器进行检查,看看本地是否存储了该对象副本。如果有,Web缓存器就向客户浏览器用HTTP响应报文返回该对象
  3. 如果 Web缓存器中没有该对象,它就打开一个与该对象的初始服务器的TCP连接。Web缓存器则在这个缓存器到服务器的TCP连接上发送一个对该对象的HTTP请求。在收到该请求后,初始服务器向该Web缓存器发送具有该对象的HTTP响应
  4. 当Web缓存器接收到该对象时,它在本地存储空间存储一份副本,并向客户的浏览器用HTTP 响应报文发送该副本(通过现有的客户浏览器和Web缓存器之间的TCP 连接)。

建立Web缓存的好处

  • 可以大大减少对客户请求的响应时间。
  • 能够大大减少一个机构的接入链路到因特网的通信量,从而不必增加带宽,降低了费用。

7 条件GET方法

虽然Web缓存可以帮助我们减少请求时间以及服务器的负担,但是存在一个缺点:当上次请求的内容在服务器中已经修改,则此时的内容与Web缓存中的内容不一致,为此,我们必须知道该内容在服务器中是否进行的修改,这种机制就是条件GET方法(conditional GET)。

如果请求报文使用GET方法;并且,请求报文中包含一个“If-Modified-Since:”首部行。那么,这个HTTP请求报文就是一个条件GET请求报文。

操作流程

  • 首先,代理服务器代表一个请求浏览器,向某个Web服务器发送一个请求报文
    在这里插入图片描述
  • 其次,该Web服务器向缓存发送具有被请求的对象的响应报文
    在这里插入图片描述
  • 该缓存器在将对象转发到请求的浏览器的同时,也在本地缓存了该对象
  • 重要的是,缓存器在存储该对象时也存储了最后修改日期
  • 最后,一个星期后,另一个用户经过该缓存器请求同一个对象,该对象仍在这个缓存器中。
  • 由于在过去的一个星期中位于Web服务器上的该对象可能已经被修改了,该缓存器通过发送一个条件GET 执行最新检查。下面是该缓存器发送的报文:
    在这里插入图片描述
  • 在If-Modified-Sincce字段中,首部行的值正好等于一星期钱服务器发送的响应报文中的Last-Modified
  • 则Web服务器向该缓存中发送一个响应报文:
    在这里插入图片描述
  • 作为该条件GET方法的响应,服务器仍发送一个响应报文,但是并没有在该响应报文中包含所请求的对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/680159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】特殊矩阵的压缩存储

🎇【数据结构】特殊矩阵的压缩存储🎇 🌈 自在飞花轻似梦,无边丝雨细如愁 🌈 🌟 正式开始学习数据结构啦~此专栏作为学习过程中的记录🌟 文章目录 🎇【数据结构】特殊矩阵的压缩存储&#x1f38…

C语言学习(二十六)---指针练习题(二)

在上节的内容中,我们进一步学习了有关指针的内容,并做了一些关于指针的题目,今天我们将继续练习一些指针的题目,以便大家更好的理解和掌握指针的知识,好了,话不多说,开整!&#xff0…

【c++11】 左值引用和右值引用

c11特性 右值引用左值引用和右值引用左值引用右值引用比较 右值引用的应用左值引用的短处右值引用解决问题移动构造 STL的改动move()函数结语 右值引用 c从出现就有着引用的语法,但是在c11后又新增了右值引用的新特性,以往所学的引用成了左值引用。非左…

代码随想录算法训练营第四十二天| 背包问题

标准背包问题 有n件物品和一个最多能背重量为w 的背包。 第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 举一个例子: 背包最大重量为4。 物品为: 重量价…

5.2.3目录与文件之权限意义

现在我们知道了Linux系统内文件的三种身份(拥有者、群组与其他人),知道每种身份都有三种权限(rwx), 已知道能够使用chown, chgrp, chmod去修改这些权限与属性,当然,利用ls -l去观察文…

《C++高级编程》读书笔记(十:揭秘继承技术)

1、参考引用 C高级编程(第4版,C17标准)马克葛瑞格尔 2、建议先看《21天学通C》 这本书入门,笔记链接如下 21天学通C读书笔记(文章链接汇总) 1. 使用继承构建类 1.1 扩展类 当使用 C 编写类定义时&#xf…

WMS中Choreographer 配合 VSYNC 中断信号

WMS中Choreographer 配合 VSYNC 中断信号 1、了解SurfaceFlinger中VSYNC信号刷新2、Choreographer 舞蹈编导2.1 Choreographer初始化2.2 FrameHandler中处理任务2.3 FrameDisplayEventReceiver初始化3.4 简易流程图 3、ViewRootImpl中scheduleTraversals3.1 postCallback 通过n…

java——IO与NIO

文章目录 1. 传统IO模型字节流字符流 2. NIO模型 Java中的IO(输入输出)是用于在程序中读取和写入数据的一种机制。Java提供了两种不同的IO模型:传统的IO模型和NIO(New IO)模型。 1. 传统IO模型 在传统的IO模型中&…

WPF本地化/国际化,多语言切换

之前写过winformwinform使用本地化,中英文切换_winform 中英文切换_故里2130的博客-CSDN博客 基本的技术差不多,但是后来又发现了一个ResXManager工具,可以更好方便快捷的使用。 首先下载,网络不好的话,去官网下载&a…

01背包简介

01背包问题(0/1 Knapsack problem)是一个经典的动态规划问题,它描述了在给定容量限制的情况下,如何选择一组物品放入背包,以使得物品的总价值最大化。 问题描述: 假设有一个背包,其容量为C。现…

VulnHub项目:Fawkes

1、靶机地址 HarryPotter: Fawkes ~ VulnHub 该篇为哈利波特死亡圣器系列最终部,也是最难的一个靶机,难度真的是逐步提升!!! 2、渗透过程 确认靶机IP,kali IP,探测靶机开放端口 详细的扫描…

ICLR 23 | 工业视觉小样本异常检测最新网络:Graphcore

来源:投稿 作者:橡皮 编辑:学姐 论文链接:https://openreview.net/pdf?idxzmqxHdZAwO 论文代码:尚未开源 1.背景 随着人工智能中深度视觉检测技术的快速发展,检测工业产品表面的异常/缺陷受到了前所未有…

scratch lenet(11): C语言实现 squashing function

文章目录 1. 目的2. Sigmoidal Function2.1 S2 用到 Sigmoidal Function2.2 Sigmoidal Function 的定义 3. Squashing Function3.1 改用 Sigmoid Suahsing function 术语3.2 具体到 hyperlolic tangent 这一 squahsing function 4. Squahsing function 的实现References 1. 目的…

设计模式之观察者模式笔记

设计模式之观察者模式笔记 说明Observer(观察者)目录观察者模式示例类图抽象主题角色类抽象观察者类具体主题角色类具体的观察者角色类测试类 说明 记录下学习设计模式-观察者模式的写法。JDK使用版本为1.8版本。 Observer(观察者) 意图:定义对象间的一种一对多的依赖关系&a…

Gradle构建系统macOS安装与使用

1.打开gradle.org并点击安装 2.先决条件 ,确认安装JDK1.8或者更高版本已安装 在终端输入brew install gradle进行安装 安装成功如下: 查看安装版本号gradle -v 使用gradle 1.创建目录demo并进入该目录 mkdir demo cd demo 2.gradle init 使用Gradle开始构建 输入2开始构建应…

DevOps系列文章之 docker插件实现多实例部署(IDEA插件)

1. Docker的安装以及开启远程访问 1.1 安装 # 检查虚拟机内核版本,必须是3.10及以上 uname -r # 安装docker yum install docker # 输入y确认安装 # 启动docker systemctl start docker # 查看docker版本 docker -v # 开机启动docker systemctl enable docker # 停…

Golang学习日志 ━━ gin-vue-admin换机重新配置的记录,很愚蠢,很傻瓜,很机械...自己使用

最近一直在弄AI,没时间搞gva,所以有点忘记了,代码升级管它呢,全部重来一遍~ 一、备份保存 根据经验和个人喜好,我特别不喜欢在框架下把一个应用分散在module、api、service等等目录下,这种目录分配方案将把…

图上作业法

目录 交通示意图的表示方法 图上作业法 (1)对流 (2)迂回 物资调运问题的图上作业法 交通路线不成圈 交通路线成圈 交通示意图的表示方法 交通示意图是用来表明收发点的大致位置、收发量、交通路线长度的图形。 图形表示…

java mail发送、接收邮件

java mail接收邮件 1、引入java mail依赖 <dependency><groupId>org.eclipse.angus</groupId><artifactId>angus-mail</artifactId><version>2.0.2</version> </dependency>2、编写代码 注意&#xff1a;下述代码中的服务器…