Python3网络爬虫开发实战(1)爬虫基础

一、URL 基础

URL也就是网络资源地址,其满足如下格式规范

scheme://[username:password@]hostname[:port][/path][;parameters][?query][#fragment]

  • scheme:协议,常用的协议有 Http,https,ftp等等;
  • username,password:在某些情况下 URL 需要提供用户名和密码才能访问;
  • hostname:主机地址,可以是域名或者是 IP 地址;
  • port:端口,这是服务器设定的端口;
  • path:路径,指的是网络资源在服务器中的指定地址;
  • query:用来查询某类资源,如果有多个查询使用 & 隔开;
  • fragment:对资源描述的部分补充,可以理解为内部的书签,有两个主要的运用,一个是做单页面路由如 Vue,另一个用作 Html 锚点,控制页面滚动到固定位置;

HTTPS 与 HTTP 不同的是 HTTPS 的安全基础是 SSL,SSL 的主要作用有以下两种:

  1. 建立一个信息安全通道,保证数据传输的安全性;
  2. 确认网站的真实性,使用了 HTTPS 协议的网站,可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,还可以通过 CA 机构颁发的安全签章来查询;

二、请求

请求分为三个部分:请求方法,请求头,请求体;

请求方法:用于表示请求客户端请求服务端的方式,常见的请求方法有两种:GET 和 POST;

  1. GET 请求中的参数包含在 URL 里面,数据可以在 URL 中看到;而 POST 请求的 URL 不会包含这些数据,数据都是通过表单形式传输的,会包含在请求体中;
  2. GET 请求提交的数据最多只有 1024 字节,而 POST 请求则没有限制;

除了 GET 和 POST 请求方式,还有以下请求方式;

序号方法描述
1GET从服务器获取资源。用于请求数据而不对数据进行更改。例如,从服务器获取网页、图片等。
2POST向服务器发送数据以创建新资源。常用于提交表单数据或上传文件。发送的数据包含在请求体中。
3PUT向服务器发送数据以更新现有资源。如果资源不存在,则创建新的资源。与 POST 不同,PUT 通常是幂等的,即多次执行相同的 PUT 请求不会产生不同的结果。
4DELETE从服务器删除指定的资源。请求中包含要删除的资源标识符。
5PATCH对资源进行部分修改。与 PUT 类似,但 PATCH 只更改部分数据而不是替换整个资源。
6HEAD类似于 GET,但服务器只返回响应的头部,不返回实际数据。用于检查资源的元数据(例如,检查资源是否存在,查看响应的头部信息)。
7OPTIONS返回服务器支持的 HTTP 方法。用于检查服务器支持哪些请求方法,通常用于跨域资源共享(CORS)的预检请求。
8TRACE回显服务器收到的请求,主要用于诊断。客户端可以查看请求在服务器中的处理路径。
9CONNECT建立一个到服务器的隧道,通常用于 HTTPS 连接。客户端可以通过该隧道发送加密的数据。

请求头:用来说明服务器要使用的附加信息,比较重要的信息有 Cookie,Referer,User-Agent 等;

  • Accept:请求报头域,用于指定客户端可接受哪些类型的信息;
  • Accept-Language:用于指定客户端可接受的语言类型;
  • Accept-Encoding:用于指定客户端可接受的内容编码;
  • Host:用于指定请求资源主机 IP 和端口号,其内容为请求 URL 的原始服务器或网关的位置,请求必须包含此内容;
  • Cookie:这是网站为了辨别用户,进行会话跟踪而存储在用户本地的数据,主要功能是维持当前访问会话;
  • Referer:用于表示请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如来源统计、防盗链处理等等;
  • User-Agent:添加此信息可以伪装成浏览器,如果不加很容易被识别出来;
  • Content-Type:用来表示具体请求中的媒体类型信息;

请求体:一般承载的内容是 POST 请求中的表单数据,对于 GET 请求,请求体为空

Content-TypePOST 提交数据的方式
application/x-www-form-urlencoded表单数据
multipart/form-data表单文件上传
application/json序列化 JSON 数据
text/xmlXML 数据

在构造 POST 请求中需要使用正确的 Content-Type,并了解设置各种请求库的各个参数时使用的都是哪种 Content-Type,如若不然可能会导致 POST 提交后无法得到正常响应

三、响应

响应是由服务端发送给客户端,可以分为三部分:响应状态码,响应头和响应体;

响应状态码:表示服务器的响应状态,如下所示:

状态码状态码英文名称中文描述
100Continue继续。客户端应继续其请求
101Switching Protocols切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
200OK请求成功。一般用于GET与POST请求
201Created已创建。成功请求并创建了新的资源
202Accepted已接受。已经接受请求,但未处理完成
203Non-Authoritative Information非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204No Content无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205Reset Content重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206Partial Content部分内容。服务器成功处理了部分GET请求
300Multiple Choices多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301Moved Permanently永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302Found临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303See Other查看其它地址。与301类似。使用GET和POST请求查看
304Not Modified未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305Use Proxy使用代理。所请求的资源必须通过代理访问
306Unused已经被废弃的HTTP状态码
307Temporary Redirect临时重定向。与302类似。使用GET请求重定向
400Bad Request客户端请求的语法错误,服务器无法理解
401Unauthorized请求要求用户的身份认证
402Payment Required保留,将来使用
403Forbidden服务器理解请求客户端的请求,但是拒绝执行此请求
404Not Found服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
405Method Not Allowed客户端请求中的方法被禁止
406Not Acceptable服务器无法根据客户端请求的内容特性完成请求
407Proxy Authentication Required请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408Request Time-out服务器等待客户端发送的请求时间过长,超时
409Conflict服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突
410Gone客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411Length Required服务器无法处理客户端发送的不带Content-Length的请求信息
412Precondition Failed客户端请求信息的先决条件错误
413Request Entity Too Large由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414Request-URI Too Large请求的URI过长(URI通常为网址),服务器无法处理
415Unsupported Media Type服务器无法处理请求附带的媒体格式
416Requested range not satisfiable客户端请求的范围无效
417Expectation Failed(预期失败)服务器无法满足请求头中 Expect 字段指定的预期行为。
418I’m a teapot状态码 418 实际上是一个愚人节玩笑。它在 RFC 2324 中定义,该 RFC 是一个关于超文本咖啡壶控制协议(HTCPCP)的笑话文件。在这个笑话中,418 状态码是作为一个玩笑加入到 HTTP 协议中的。
500Internal Server Error服务器内部错误,无法完成请求
501Not Implemented服务器不支持请求的功能,无法完成请求
502Bad Gateway作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503Service Unavailable由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504Gateway Time-out充当网关或代理的服务器,未及时从远端服务器获取请求
505HTTP Version not supported服务器不支持请求的HTTP协议的版本,无法完成处理
响应头:包含了服务器对请求的应答信息
  • Data:用于标识响应产生的时间;
  • Last-Modified:用于指定资源的最后修改时间;
  • Content-Encoding:用于指定响应内容的编码;
  • Server:包含服务器的信息,例如名称,版本号等;
  • Content-Type:文档类型,指定返回的数据是什么类型,如 text/html 代表返回 HTML 文档,application/x-javascript 代表返回 JavaScript 文件,image/jpeg 代表返回图片;
  • Set-Cookie:设置 Cookie,响应头中的 Set-Cookie 用于告诉浏览器需要将此内容放在 Cookie 中,下次请求时将 Cookie 携带上;
  • Expires:用于指定响应的过期时间,可以让代理服务器或浏览器将加载的内容更新到缓存中,当再次访问相同的内容时,就可以直接从缓存中加载,达到降低服务器负载,缩短加载时间的目的;

响应体:响应的正文数据都存在于响应体中,例如请求网页时,响应体就是网页的 HTML 代码;请求一张图片,响应体就是图片的二进制数据。做爬虫请求网页的时候,要解析的内容就是响应体;

四、Web 网页

网页基本由三部分组成,HTML,CSS 和 JavaScript;其中 HTML 相当于骨架,JavaScript 相当于肌肉,CSS 相当于皮肤;这三者结合起来才能形成一个完善的网页;

网页由一个个节点组成,CSS 选择器会为不同的节点设置不同的样式规则;CSS 选择器 | 菜鸟教程 (runoob.com)

选择器示例示例说明
.class.intro选择所有class="intro"的元素
#id#firstname选择所有id="firstname"的元素
**选择所有元素
elementp选择所有<p>元素
element,elementdiv,p选择所有<div>元素和 <p> 元素
element.classp.hometown选择所有 class=“hometown” 的<p> 元素
element elementdiv p选择<div>元素内的所有<p>元素
element>elementdiv>p选择所有父级是<div> 元素的 <p> 元素
element+elementdiv+p选择所有紧跟在 <div> 元素之后的第一个 <p> 元素
[attribute][target]选择所有带有target属性元素
[attribute=value][target=-blank]选择所有使用target="-blank"的元素
[attribute~=value][title~=flower]选择标题属性包含单词"flower"的所有元素
[attribute|=language][lang|=en]选择 lang 属性等于 en,或者以 en- 为开头的所有元素
:linka:link选择所有未访问链接
:visiteda:visited选择所有访问过的链接
:activea:active选择活动链接
:hovera:hover选择鼠标在链接上面时
:focusinput:focus选择具有焦点的输入元素
:first-letterp:first-letter选择每一个<p>元素的第一个字母
:first-linep:first-line选择每一个<p>元素的第一行
:first-childp:first-child指定只有当<p>元素是其父级的第一个子级的样式。
:beforep:before在每个<p>元素之前插入内容
:afterp:after在每个<p>元素之后插入内容
:lang(language)p:lang(it)选择一个lang属性的起始值="it"的所有<p>元素
element1~element2p~ul选择p元素之后的每一个ul元素
[attribute^=value]a[src^=“https”]选择每一个src属性的值以"https"开头的元素
[attribute$=value]a[src$=“.pdf”]选择每一个src属性的值以".pdf"结尾的元素
[attribute*=value]a[src*=“runoob”]选择每一个src属性的值包含子字符串"runoob"的元素
p:firs-of-typep:first-of-type选择每个p元素是其父级的第一个p元素
:last-of-typep:last-of-type选择每个p元素是其父级的最后一个p元素
:only-of-typep:only-of-type选择每个p元素是其父级的唯一p元素
:only-childp:only-child选择每个p元素是其父级的唯一子元素
:nth-child(n)p:nth-child(2)选择每个p元素是其父级的第二个子元素
:nth-last-child(n)p:nth-last-child(2)选择每个p元素的是其父级的第二个子元素,从最后一个子项计数
:nth-of-type(n)p:nth-of-type(2)选择每个p元素是其父级的第二个p元素
:nth-last-of-type(n)p:nth-last-of-type(2)选择每个p元素的是其父级的第二个p元素,从最后一个子项计数
:last-childp:last-child选择每个p元素是其父级的最后一个子级。
:root:root选择文档的根元素
:emptyp:empty选择每个没有任何子级的p元素(包括文本节点)
:target#news:target选择当前活动的#news元素(包含该锚名称的点击的URL)
:enabledinput:enabled选择每一个已启用的输入元素
:disabledinput:disabled选择每一个禁用的输入元素
:checkedinput:checked选择每个选中的输入元素
:not(selector):not§选择每个并非p元素的元素
::selection::selection匹配元素中被用户选中或处于高亮状态的部分
:out-of-range:out-of-range匹配值在指定区间之外的input元素
:in-range:in-range匹配值在指定区间之内的input元素
:read-write:read-write用于匹配可读及可写的元素
:read-only:read-only用于匹配设置 “readonly”(只读) 属性的元素
:optional:optional用于匹配可选的输入元素
:required:required用于匹配设置了 “required” 属性的元素
:valid:valid用于匹配输入值为合法的元素
:invalid:invalid用于匹配输入值为非法的元素

除了 CSS 选择器,还可以使用 XPath 选择器来选择节点;

五、爬虫常见问题

越来越多的网页是采用 Ajax,前端模块化工具构建的

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue</title></head><body><div id="app"></div><script type="module" src="/src/main.js"></script></body>
</html>

如采用 Vue 开发的网页中,其 index.html 的 body 中只有一个 id 为 app 的 div 节点和一个 main.js 的 script,其负责整个网页的渲染;

因此当我们请求页面的时候,我们只得到 HTML 代码,而不会渲染 JavaScript 文件,无法看到完整的页面内容;对于这样的情况,我们只有分析源代码后台的 Ajax 接口,或者使用 Selenium 等库来模拟 JavaScript 的渲染;

六、服务器,Session 和 Cookie

将 html 代码文件放在某台具有固定公网 IP 的主机上,在这台主机上安装 Apache 或者 Nginx 等服务器,这台主机就可以作为服务器了;

Session 在服务端,用来保存用户的 Session 信息, Cookie 在客户端,浏览器在访问相同的网页时会自动带上 Cookie,服务器通过识别 Cookie 判断哪个用户访问,然后判断用户是否处于登入状态,并返回对应的响应;

在客户端第一次请求服务器时,服务器会创建一个 Session 并返回一个响应头中与 Session 对应的 Set-Cookie 字段的响应给客户端,客户端接受到响应后会将 Set-Cookie 中的字段保存为 Cookie,当下一次请求同一网站时,Cookie 会随着客户端的请求发送给服务器,服务器通过 Cookie 中的字段找到 Session,通过判断 Session 辨认用户状态并返回对应响应;

关闭浏览器并不会导致 Session 被删除,因此需要服务器为 Session 设置一个失效时间,当距离客户端上一次使用 Session 的时间超过这个失效时间,服务器才可以认为客户端已经停止了活动并删除 Session 以节省空间;

七、代理,多进程和多线程

服务器会检测某个 IP 在单位时间内的请求次数,如果请求次数超过设定的阈值,就直接拒绝提供服务,并返回一些错误信息,这种情况被称为 封IP

代理常用的有 HTTP 代理和 SOCKS 代理,其配置如下

import requests# http 代理
proxies = {'http': 'http://proxy.example.com:8080','https': 'https://proxy.example.com:8080'
}# socks 代理
proxies = {'http': 'socks5://user:pass@host:port','https': 'socks5://user:pass@host:port'
}response = requests.get(url, proxies=proxies)

进程是线程的集合,一个进程是由一个或者多个线程构成的,线程是操作系统进行运算调度的最小单元;

并发是指多个线程对应的多条指令被快速轮换地执行,在宏观上看起来是同时在运行,而微观上是交换执行;并行是指同一时刻由多条指令在多个处理器上同时执行,这意味着并行必须依赖多个处理器,无论是从宏观还是微观,都是同时运行的;

在一个程序的进程中,有一些指令是比较耗时或者需要等待的,如果使用单线程,指令只能等待一个指令完毕后才能执行下一个指令,因此我们可以使用多线程来实现并效果;同理,如果使用多进程我们可以实现并行的效果;

  • 在python中,实现多线程主要通过threading模块,而多进程主要通过multiprocessing模块。

  • 这两个模块的主要区别是:threading模块基于线程,而multiprocessing模块基于进程。threading模块使用共享内存来实现多线程,所有线程都共享一样的变量(这点在后续的实例中可以感受到);而multiprocessing基于子进程,每个子进程之间都有独立的变量和数据结构。两者的区别意味着threading更使用于I/O密集型任务(例如需要进行多表格读取操作),multiprocessing模块更适用于包含较多计算的CPU密集型任务(矩阵运算,图片处理类任务)。

  • 需要注意的是,由于python中的GIL锁的存在,Python解释器只允许一个Python进程使用,这意味着对于一个解释器只允许一个进程在运行,这也是为什么threading模块无法适用于CPU密集型这类需要大量CPU资源的任务,因为一个进程的CPU资源有限,无论开启多少个线程,总的资源就只有那些,总耗时不会有太大变化。而multiprocessing模块则可以开多个进程,能够更快速的处理CPU密集型任务。

代码参考

【Python】超详细实例讲解python多线程(threading模块)_python的threading模块详解-CSDN博客

Python 爬虫进阶六之多进程的用法 | 静觅 (cuiqingcai.com)

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

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

相关文章

数据库(MySQL)-DQL数据查询语言

DQL(Data Query Language 数据查询语言)的用途是查询数据库数据&#xff0c;如select语句。其中&#xff0c;可以根据表的结构和关系分为单表查询和多表联查。 单表查询 单表查询&#xff1a;针对数据库中的一张数据表进行查询 全字段查询 语法&#xff1a;select 字段名 fro…

C# 实现条件变量

C# 进程通信系列 第一章 共享内存 第二章 条件变量&#xff08;本章&#xff09; 第三章 消息队列 文章目录 C# 进程通信系列前言一、关键实现1、用到的主要对象2、初始化区分创建和打开3、变量放到共享内存4、等待和释放逻辑 二、完整代码三、使用示例1、线程同步控制2、进程…

Maven概述

目录 1.Maven简介 2.Maven开发环境搭建 2.1下载Maven服务器 2.2安装&#xff0c;配置Maven 1.配置本地仓库地址 2.配置阿里云镜像地址 2.3在idea中配置maven 2.4在idea中创建maven项目 3.pom.xml配置 1.项目基本信息 2.依赖信息 3.构建信息 4.Maven命令 5.打包Jav…

【PyTorch】图像多分类项目

【PyTorch】图像二分类项目 【PyTorch】图像二分类项目-部署 【PyTorch】图像多分类项目 【PyTorch】图像多分类项目部署 多类图像分类的目标是为一组固定类别中的图像分配标签。 目录 加载和处理数据 搭建模型 定义损失函数 定义优化器 训练和迁移学习 用随机权重进行训…

【HTML — 构建网络】HTML 入门

在本文中,我们将介绍 HTML 的绝对基础知识。为了帮助您入门,本文定义了元素、属性以及您可能听说过的所有其他重要术语。它还解释了这些在 HTML 中的位置。您将学习 HTML 元素的结构、典型的 HTML 页面的结构以及其他重要的基本语言功能。在此过程中,也将有机会玩转 HTML! …

SpringBoot 项目配置文件注释乱码的问题解决方案

一、问题描述 在项目的配置文件中&#xff0c;我们写了一些注释&#xff0c;如下所示&#xff1a; 但是再次打开注释会变成乱码&#xff0c;如下所示&#xff1a; 那么如何解决呢&#xff1f; 二、解决方案 1. 点击” File→Setting" 2. 搜索“File Encodings”, 将框…

Mac安装Hoomebrew与升级Python版本

参考 mac 安装HomeBrew(100%成功)_mac安装homebrew-CSDN博客 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 安装了Python 3.x版本&#xff0c;你可以使用以下命令来设置默认的Python版本&#xff1a; # 首先找到新安…

图片格式转换工具哪个好?一键转换图片格式就用这4个

在贵州的街头&#xff0c;福建的游神活动吸引了众多目光&#xff0c;人们纷纷拿出手机记录下这难得一见的盛况。然而&#xff0c;在分享这些精彩瞬间时&#xff0c;我们往往会遇到格式不兼容的问题。 想象一下&#xff0c;如果你能一键将手机拍摄的HEIC格式转换为更通用的JPG或…

2024 微信小程序 学习笔记 第二天

1. WXML 模板语法 数据绑定 事件绑定 条件渲染 列表渲染 2. WXSS 模板样式 rpx 样式导入 全局和局部样式 3. 全局配置 window tabBar 配置tabBar案例 4. 网络数据请求 Get请求 Post 请求 加载时请求 5. 案例 -本地生活&#xff08;首页&#xff09; 导航栏 轮播图 九宫格效果…

leetcode10 -- 正则表达式匹配

题目描述&#xff1a; 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xff0c;而不是部分字符串。 示例 1&#xff1…

配置sublime的中的C++编译器(.sublime-build),实现C++20

GCC 4.8: 支持 C11 (部分) GCC 4.9: 支持 C11 和 C14 (部分) GCC 5: 完全支持 C14 GCC 6: 支持 C14 和 C17 (部分) GCC 7: 支持 C17 (大部分) GCC 8: 完全支持 C17&#xff0c;部分支持 C20 GCC 9: 支持更多的 C20 特性 GCC 10: 支持大部分 C20 特性 GCC 11: 更全面地支持 C20 …

原生PHP/JS自主开发的交友内核框架婚恋交友系统V10

本文来自&#xff1a;婚恋交友系统V10 - 源码1688 应用介绍 原生PHP/JS自主开发的交友内核框架&#xff0c;极高性能、无捆绑、自主权、无流水扣点、独立全开源 01脱单盲盒&#xff1a;脱单盲盒类似于漂流瓶&#xff0c;先将自己《投放》到盲盒中&#xff0c;另一伴有缘将您取…

解决显存不足问题:深度学习中的 Batch Size 调整【模型训练】

解决显存不足问题&#xff1a;深度学习中的 Batch Size 调整 在深度学习训练中&#xff0c;显存不足是一个常见的问题&#xff0c;特别是在笔记本等显存有限的设备上。本文将解释什么是 Batch Size&#xff0c;为什么调整 Batch Size 可以缓解显存不足的问题&#xff0c;以及调…

【Git多人协作开发】同一分支下的多人协作开发模式

目录 0.前言场景 1.开发者1☞完成准备工作&协作开发 1.1创建dev分支开发 1.2拉取远程dev分支至本地 1.3查看分支情况和分支联系情况 1.4创建本地dev分支且与远程dev分支建立联系 1.5在本地dev分支上开发file.txt 1.6推送push至远程仓库 2.开发者2☞完成准备工作&…

【学习笔记】Elasticsearch学习汇总(包含SpringData、Spark、Flink操作)

文章目录 前言数据类型种类ES解决什么问题ELK StackES是什么数据格式正排(正向)索引倒排索引创建索引索引查询索引删除创建文档(添加数据)自定义ID 简单查询类似于主键查询查询所有数据 修改数据全量修改局部修改 删除数据条件查询请求路径(不推荐)请求体全查询分页查询指定查询…

普元EOS学习笔记-EOS的ide开发工具的介绍

前言 普元EOS开发包括低开和高开。 EOS低开&#xff0c;直接在浏览器操作即可&#xff0c;不需要编码。 EOS高开&#xff0c;需要使用EOS的ide工具&#xff0c;进行编码开发。 EOS的ide工具是普元在Eclipse基础上进行的扩展&#xff0c;添加了若干插件&#xff0c;专门用于…

如何使用Proxy实现JavaScript中的观察者模式

在软件开发中&#xff0c;尤其是JavaScript中&#xff0c;观察者模式是一种行为设计模式&#xff0c;它定义了一种一对多的关系。它允许多个观察者对象监听一个主题对象&#xff0c;并在主题状态发生变化时自动得到通知。这种模式常用于事件系统、数据绑定等场景。 在JavaScrip…

【React】箭头函数:现代 JavaScript 的高效编程方式

文章目录 一、箭头函数的基本语法二、箭头函数的特性三、在 React 中的常见用法四、最佳实践 在现代 JavaScript 中&#xff0c;箭头函数&#xff08;Arrow Functions&#xff09;是一种简洁的函数表达方式&#xff0c;并且在 React 开发中非常常见。箭头函数不仅简化了函数的语…

HighConcurrencyCommFramework c++通讯服务器框架 :目录,修改标题,配置,日志打印

目录规划 nginx 根目录下的三个文件 makefile :编译项目的入口&#xff0c;编译项目从这里开始 config.mk&#xff1a;也是个配置脚本用来增加变动的东西&#xff0c;应付可变 common.mk&#xff1a;最核心的编译脚本&#xff0c;每个子目录都要被编译.cpp程序 配置文件 配…

构建未来客户服务的智能平台架构

随着科技的飞速发展&#xff0c;客户服务不再仅仅是响应投诉和提供支持&#xff0c;而是成为企业与客户之间重要的互动和沟通桥梁。在这个信息化和智能化的时代&#xff0c;构建一个优秀的客户服务平台架构至关重要&#xff0c;它不仅能提升服务效率&#xff0c;还能增强客户满…