当前位置: 首页 > news >正文

7. user-Agent破解反爬机制

1. 为什么要设置反爬机制

普通用户通过浏览器访问网站。

爬虫是靠程序代码来访问网站。

爬虫程序可能会篡改资源信息。

爬虫程序会引发短时间内的访问激增。

导致服务器压力过大。

为了提高安全性,因此绝大多数网站都实施了反爬措施,对爬虫程序进行拦截。

【总结】

设置反爬机制是为了保护网站的数据和资源不被恶意爬虫或者机器人滥用和攻击。

恶意爬虫或机器人可能会对网站造成严重的影响,如消耗网站的带宽和服务器资源、盗取网站的数据、影响网站的正常运行等。

因此,为了保护网站的安全和稳定性,设置反爬机制是必要的。

同时,反爬机制也可以防止竞争对手通过爬虫获取网站的商业机密和竞争优势。

2. 服务器如何区分浏览器访问和爬虫访问

服务器可以通过多种方式来识别是人手动访问网站还是爬虫程序访问网站。

  1. User-Agent:每个浏览器或爬虫程序都有一个User-Agent标识,服务器可以通过检查User-Agent来判断访问者是人还是爬虫程序。

  2. IP地址:服务器可以通过检查访问者的IP地址来判断是否是爬虫程序。一些爬虫程序使用大量的IP地址进行访问,而人类用户通常只使用一个或几个IP地址。

  3. 访问频率:爬虫程序通常会以非常高的频率访问网站,而人类用户通常不会如此频繁地访问网站。服务器可以通过检查访问频率来判断是否是爬虫程序。

  4. 访问行为:爬虫程序通常会按照一定的规律进行访问,例如按照页面顺序进行访问或者按照特定的关键词进行搜索。服务器可以通过检查访问行为来判断是否是爬虫程序。

3. 反爬虫机制

所谓上有政策,下有对策。

服务器可以通过多种方式来识别是人手动访问网站还是爬虫程序访问网站,但是一些高级的爬虫程序可以模拟人类用户的行为,使得服务器难以区分。

Python的反爬虫机制主要包括以下几种:

  1. User-Agent检测:有些网站会检测请求头中的User-Agent字段,如果发现是Python的默认User-Agent,就会拒绝访问。解决方法是在请求头中添加一个随机的User-Agent。

  2. IP封禁:有些网站会根据IP地址来限制访问频率或者直接封禁IP。解决方法是使用代理IP或者使用分布式爬虫。

  3. 验证码识别:有些网站会在登录或者访问频率过高时出现验证码,需要手动输入才能继续访问。解决方法是使用第三方验证码识别服务或者手动输入验证码。

  4. 访问频率限制:有些网站会限制同一IP或同一用户的访问频率,如果超过一定次数就会拒绝访问。解决方法是控制访问频率或者使用分布式爬虫。

  5. 动态页面爬取:有些网站使用了动态页面技术,需要使用Selenium等工具模拟浏览器行为才能爬取。

4. User-Agent是什么

User-Agent是一个HTTP头部字段,用于标识发送HTTP请求的客户端应用程序或设备的信息。

它通常包含了操作系统、浏览器、设备类型、应用程序版本等信息,以便服务器能够根据这些信息来优化响应内容或提供适当的服务。

例如,网站可以根据User-Agent识别访问者使用的设备类型和浏览器版本,从而提供适合的网页布局和功能。

User[ˈjuːzə]:用户。

Agent[ˈeɪdʒənt]:代理人。

User-Agent用户代理,简称UA。

无论是浏览器发出的请求,还是爬虫发出的请求,都会包含请求头。

请求头里有一个非常重要的信息,User-Agent。

5. 如何查询网页的User-Agent

  1. 打开360浏览器。

  2. 按【F12】打开开发者工具。

  3. 点击【网络】选项卡。

  4. 点击【全部】选项卡。

  5. 【Ctrl+R】刷新网页。

  6. 点击【名称】下方的内容。

  7. 点击【标头】。

  8. 向下滑动鼠标,找到【请求标头】。

在这里插入图片描述

  1. 【请求标头】的最后一项信息就是【user-agent】

  2. 将整个【user-agent】复制到文件(doc或txt或py文件等等都可以)来备用。

在这里插入图片描述

6. user-agent信息解析

user-agent中包含许多信息,用户使用的操作系统、CPU类型、浏览器版本等等。

【复制的user-agent内容如下】

user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.95 Safari/537.36 QIHU 360SE

【user-agent信息解析如下】

操作系统:Windows NT 10.0

  • CPU 架构:WOW64
  • 浏览器内核:AppleWebKit/537.36
  • 浏览器类型:Chrome
  • 浏览器版本:108.0.5359.95
  • 浏览器标识:Safari/537.36
  • 来源:QIHU 360SE解析

在每次浏览器发送请求的时候,UA字符串都会被发送到服务器上。

服务器会根据UA信息,显示不同的网页排版,以适应不同的用户浏览器。

同时,服务器还可以通过UA信息,侦察客户端的请求是否安全。

判断请求访问的是爬虫程序还是普通用户。

7. 爬虫程序user-agent和浏览器user-agent的区别

爬虫程序里的user-agent和浏览器里的user-agent的主要不同在于:

  1. 目的不同:浏览器的user-agent是为了告诉服务器它所使用的浏览器类型和版本,以便服务器能够返回适合该浏览器的网页内容;而爬虫程序的user-agent是为了模拟浏览器行为,以便获取网页内容。

  2. 内容不同:浏览器的user-agent通常包含浏览器类型、版本、操作系统类型和版本等信息;而爬虫程序的user-agent通常只包含爬虫程序的名称和版本号等信息。

  3. 格式不同:浏览器的user-agent通常是一个字符串,包含多个信息,格式比较复杂;而爬虫程序的user-agent通常是一个简单的字符串,格式比较简单。

8. 代码查看爬虫程序的user-agent

我们通过一个测试网站来查看爬虫程序的user-agent的包含的信息。

【测试网站】

url = "http://httpbin.org/get"

【代码示例】

# 1.导入库
# requests是第三方库,作用是发送发送GET、POST、PUT、DELETE等请求
import requests# 2.要访问的url
url = "http://httpbin.org/get"# 3.发送请求,并把响应结果赋值给变量r
r = requests.get(url)  # 输出r的文本信息
print(r.text)

【终端输出】

{"args": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.26.0", "X-Amzn-Trace-Id": "Root=1-6482e247-021e317204e5813568df0582"}, "origin": "112.113.185.64", "url": "http://httpbin.org/get"
}

上面输出的结果就爬虫程序里包含的user-agent。

观察输出结果,看到打印出来的 User-Agent的信息标志的是python-requests/2.26.0

信息里没有操作系统,也没有浏览器版本。

所以我们通过上面的代码访问网页,服务器是能识别出是爬虫代码在访问,而不是人工在访问。

这样的User-Agent会被反爬机制轻易拦截。

既然爬虫程序是因为User-Agent被识别出来的。

那解决这个问题,我们只需要把爬虫的User-Agent伪装成浏览器请求头里的User-Agent即可。

狼怎么伪装成羊呢?

狼可以用毛皮或其他材料制作成羊的外表。

披着羊皮的狼,和爬虫程序加入请求头信息(User-Agent)就是一个道理。

9. 在代码中加入请求头信息

requests库的get方法提供了headers参数。

headers:请求头。

headers参数的类型是字典。

headers参数的类型是字典。

headers参数的类型是字典。

作用是接收自定义的请求头。

【初学者可以这样构建请求头信息】

  1. 先构建一个字典
header = {}

header是变量名。

{}表示字典。

  1. 在大括号中间输入【回车】,输入'':''字符,准备好字典的框架。
header = {'':''
}

这里添加引号是因为这里字典的键和值都是字符串类型。

  1. 填充字典的键和值。
header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) +\AppleWebKit/537.36 (KHTML, like Gecko)+\Chrome/108.0.5359.95 Safari/537.36 QIHU 360SE'
}

user-agent是字典的键。

后面的具体信息作为值。

因为请求头字符多,字典格式很多初学者掌握的不熟练,复制请求头信息时太容易出错了。

初学者用上面的方法可以避免出错。

然后在requests发送请求时将请求头信息及header变量作为值传递给get函数的参数headers

r = requests.get(url,headers = header )  

headers是get函数的参数,是不可以换成其他名字的。

header是存储请求头信息的变量名,名字你可以自己命名。

【测试加入请求头的user-agent】

# 1.导入库
# requests是第三方库,作用是发送发送GET、POST、PUT、DELETE等请求
import requests# 2.要访问的url,这个是测试网址
url = "http://httpbin.org/get"# 3. 浏览器的请求头信息
header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) +\AppleWebKit/537.36 (KHTML, like Gecko)+\Chrome/108.0.5359.95 Safari/537.36 QIHU 360SE'
}# 4.发送请求,并把响应结果赋值给变量r
r = requests.get(url, headers= header )  # 5. 输出r的文本信息
print(r.text)

【终端输出】

{"args": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.95 Safari/537.36 QIHU 360SE", "X-Amzn-Trace-Id": "Root=1-648348bd-2aadd11662bf3bad3c052f78"}, "origin": "112.113.185.64", "url": "http://httpbin.org/get"
}

大家观察输出结果。

【添加 "User-Agent"访问网页服务器识别的 "User-Agent"是下面这样的】

“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.95 Safari/537.36 QIHU 360SE”,

【没有 "User-Agent"访问网页服务器识别的 "User-Agent"是下面这样的】

“User-Agent”: “python-requests/2.26.0”

我们发现通过添加User-Agent我们将爬虫程序的请求头伪装成功了。

添加一个字典变量,我们成功的将狼伪装成了羊。

下面,我们以访问百度网页为例,写一个带请求头的访问网页代码。

【代码示例】

# 1.导入库
# requests是第三方库,作用是发送发送GET、POST、PUT、DELETE等请求
import requests# 2.要访问的url
url = 'https://www.baidu.com/'# 3. 浏览器的请求头信息
header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) +\AppleWebKit/537.36 (KHTML, like Gecko) +\Chrome/108.0.5359.95 Safari/537.36 QIHU 360SE'
}# 4.发送请求,并把响应结果赋值给变量r
r = requests.get(url, headers= header )  # 5.输出Response对象的status_code属性
print(r.status_code)# 6. 查看r的类型
print(type(r))

【终端输出】

200
<class 'requests.models.Response'>

200表示访问网页成功。

<class 'requests.models.Response'>表示返回的r是一个requests.models类的响应对象。

相关文章:

7. user-Agent破解反爬机制

文章目录 1. 为什么要设置反爬机制2. 服务器如何区分浏览器访问和爬虫访问3. 反爬虫机制4. User-Agent是什么5. 如何查询网页的User-Agent6. user-agent信息解析7. 爬虫程序user-agent和浏览器user-agent的区别8. 代码查看爬虫程序的user-agent9. 在代码中加入请求头信息 1. 为…...

3.Nginx+Tomcat负载均衡和动静分离群集

文章目录 NginxTomcat负载均衡和动静分离群集Nginx作用实验七层反向代理nginx动静分离四层反向代理负载均衡 NginxTomcat负载均衡和动静分离群集 Nginx是-款非常优秀的HTTP服务器软件 支持高达50 000个并发连接数的响应拥有强大的静态资源处理能力运行稳定内存、CPU等系统资源…...

数据结构与算法之树结构

目录 为什么要使用树结构树结构基本概念树的种类树的存储与表示常见的一些树的应用场景为什么要使用树结构 线性结构中不论是数组还是链表,他们都存在着诟病;比如查找某个数必须从头开始查,消耗较多的时间。使用树结构,在插入和查找的性能上相对都会比线性结构要好 树结构…...

【python】 用来将对象持久化的 pickle 模块

pickle 模块可以对一个 Python 对象的二进制进行序列化和反序列化。说白了&#xff0c;就是它能够实现任意对象与二进制直接的相互转化&#xff0c;也可以实现对象与文本之间的相互转化。 比如&#xff0c;我程序里有一个 python 对象&#xff0c;我想把它存到磁盘里&#xff…...

【博客654】prometheus配置抓取保护以防止压力过载

prometheus抓取保护配置以防止压力过载 场景 担心您的应用程序指标可能突然激增&#xff0c;以及指标突然激增导致prometheus压力过载 就像生活中的许多事情一样&#xff0c;标签要有节制。当带有用户 ID 或电子邮件地址的标签被添加到指标时&#xff0c;虽然它不太可能结束…...

Backtrader官方中文文档:第十三章Observers观察者

本文档参考backtrader官方文档,是官方文档的完整中文翻译,可作为backtrader中文教程、backtrader中文参考手册、backtrader中文开发手册、backtrader入门资料使用。 本章包含 backtrader 官方Observers章节全部内容,入口 : https://backtrader.com/docu/observers-and-sta…...

算法leetcode|54. 螺旋矩阵(rust重拳出击)

文章目录 54. 螺旋矩阵&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a;每次循环移动一步&#xff1a;每次循环完成一个顺时针&#xff1a…...

单容水箱建模(自衡单容水箱+无自衡单容水箱)

自衡单容水箱Simulink建模和PLC源代码请参看下面文章链接: 单容双容水箱建模(simulink仿真+PLC代码)_RXXW_Dor的博客-CSDN博客PLC通过伯努利方程近似计算水箱流量详细内容请参看下面的文章博客PLC通过伯努利方程近似计算水箱流量(FC)_怎么用伯努利方程求某水位流量_RXXW_Dor的…...

分享Python7个爬虫小案例(附源码)

本次的7个python爬虫小案例涉及到了re正则、xpath、beautiful soup、selenium等知识点&#xff0c;非常适合刚入门python爬虫的小伙伴参考学习。注&#xff1a;若涉及到版权或隐私问题&#xff0c;请及时联系我删除即可。 1.使用正则表达式和文件操作爬取并保存“某吧”某帖子…...

我用ChatGPT写2023高考语文作文(一):全国甲卷

2023年 全国甲卷 适用地区&#xff1a;广西、贵州、四川、西藏 人们因技术发展得以更好地掌控时间&#xff0c;但也有人因此成了时间的仆人。 这句话引发了你怎样的联想与思考&#xff1f;请写一篇文章。 要求&#xff1a;选准角度&#xff0c;确定立意&#xff0c;明确文体&am…...

c++ modbusTCP

//Modbus TCP是一种基于TCP/IP协议的Modbus协议&#xff0c;它允许Modbus协议通过以太网进行通信。 //在C中&#xff0c;可以使用第三方库来实现Modbus TCP通信&#xff0c;例如libmodbus和QModbus。 //使用libmodbus库实现Modbus TCP通信的示例代码如下&#xff1a; //c #incl…...

linux(信号结尾)

目录&#xff1a; 1.可重入函数 2.volatile关键字 3.SIGCHLD信号 -------------------------------------------------------------------------------------------------------------------------------- 1.可重入函数----------用来描述一个函数的特点的 1.在单进程当中也存…...

【漏洞修复】node-exporter被检测出来pprof调试信息泄露漏洞

node-exporter被检测出来pprof调试信息泄露漏洞 说在前面解决方法结语 说在前面 惯例开篇吐槽&#xff0c;有些二五仔习惯搞点自研的安全扫描工具&#xff0c;然后加点DIY元素&#xff0c;他也不管扫的准不准&#xff0c;就要给你报个高中危的漏洞&#xff0c;然后就要去修复&…...

在linux 上安装 NFS服务器软件

在 Ubuntu Linux 中创建 NFS 文件系统通常需要完成以下步骤: 安装 NFS 服务器软件。您可以在终端上使用以下命令来安装所需的软件包。sudo apt-get update sudo apt-get install nfs-kernel-server创建要共享的目录。例如,您可以创建一个名为 /var/nfs/shared 的目录。sudo m…...

网卡中的Ring buffer -- 解决 rx_resource_errors 丢包

1、软硬件环境 硬件&#xff1a; 飞腾E2000Q 平台 软件&#xff1a; linux 4.19.246 2、问题现象 网卡在高速收包的过程中&#xff0c;出现 rx error , 细查是 rx_resource_errors 如下&#xff1a; rootE2000-Ubuntu:~# ifconfig eth1 eth1: flags4163<UP,BROADCAST,RU…...

六月九号补题日记:Codeforces Round 877 (Div. 2)

专注是不够的&#xff0c;很重要的一方面在于细节&#xff0c;关注细节&#xff1a;精细和专注才是成功的重点&#xff01;&#xff01;&#xff01; A 题意&#xff1a;给你一堆数字&#xff0c;说这一堆数字是由最初的两个数字相减得到的&#xff0c;让你求出两个数字其中一…...

python基础选择题,高中适用

1. 下面哪个是 Python 的注释符号&#xff1f; A. // B. # C. /* D. ; 答案&#xff1a;B 2. 下面哪个是 Python 的赋值运算符&#xff1f; A. B. C. ! D. > 答案&#xff1a;A 3. 下面哪个是 Python 的逻辑运算符&#xff1f; A. && B. || C. ! D. & 答…...

Linux 面试题-(腾讯,百度,美团,滴滴)

Linux 面试题-(腾讯,百度,美团,滴滴) 分析日志t.log(访问量)&#xff0c;将各个ip 地址截取&#xff0c;并统计出现次数,并按从大到小排序(腾讯) http://192.168.200.10/index1.html http://192.168.200.10/index2.html http://192.168.200.20/index1.html http://192.168.20…...

DDD--战略设计步骤

在领域驱动设计&#xff08;Domain-Driven Design&#xff0c;DDD&#xff09;中&#xff0c;战略设计是指在系统的整体层面上考虑领域模型的组织和架构。下面是一些战略设计的详细步骤&#xff1a; 确定限界上下文&#xff08;Bounded Context&#xff09;&#xff1a;首先&a…...

Web Scoket简述

Web Socket 简介 初次接触 Web Socket 的人&#xff0c;我们已经有了 HTTP 协议&#xff0c;为什么还需要另一个协议&#xff1f;它能带来什么好处&#xff1f; 因为 HTTP 协议有一个缺陷&#xff1a;通信只能由客户端发起。http基于请求响应实现。 &#xff08;准确来说HTTP…...

“Docker 技术在企业中的应用及挑战解决方案“

Docker 技术是一种基于容器化的应用部署和管理技术。随着云计算的普及和应用的不断增多&#xff0c;Docker 技术在企业中的应用越来越广泛。本文将介绍 Docker 技术的基本概念、优势和应用场景&#xff0c;并讨论如何在企业中应用 Docker 技术。 一、Docker 技术概述 Docker …...

vue中开发包、生产包、全局包的区别以及安装语法

目录 开发包 (devDependencies) 安装方法 生产包 (dependencies) 安装方法 全局包 (Global build) 安装方法 vue中有三种不同类型的包&#xff1a;开发包 (Development build)&#xff0c;生产包 (Production build) 和全局包 (Global build)。下面我们分别解释它们的区别…...

list的模拟实现

前言 list是STL中重要的容器&#xff0c;了解它的原理对于我们掌握它是有很多的帮助的&#xff0c;一般list和vector都是一起来使用的&#xff0c;因为它们的优缺点不同&#xff0c;刚好可以互补。list的优点是任意位置的插入和删除都很快&#xff0c;它的缺点是不支持随机访问…...

ChatGLM简介和SSE聊天接口测试效果

开发公司 智谱AI是由清华大学计算机系技术成果转化而来的公司&#xff0c;致力于打造新一代认知智能通用模型。公司合作研发了双语千亿级超大规模预训练模型GLM-130B&#xff0c;并构建了高精度通用知识图谱&#xff0c;形成数据与知识双轮驱动的认知引擎&#xff0c;基于此模型…...

darknet yolo标注、训练详细说明

文章目录 1、标注数据1.1、标注1.2、生成训练列表文件train.txt1.3、转换数据标注格式 2、训练数据整理2.1、修改train.txt路径2.2、修改yolov3.cfg2.3、obj.name和obj.data2.4、训练脚本文件trian.sh2.5、测试脚本文件test.sh 3、训练 本文对应的脚本文件和程序下载链接 darke…...

chatgpt赋能python:Python如何产生随机整数?

Python如何产生随机整数&#xff1f; Python是一种高级编程语言。它允许程序员轻松地创建各种类型的应用程序&#xff0c;包括生成随机整数。本文将介绍如何在Python中使用内置的随机数函数来生成随机整数。 random模块 Python中的random模块提供了生成随机数的函数。这些函…...

大话Stable-Diffusion-Webui-客制化主题(四)

文章目录 目标效果开始重要说明单选框以及复选框图标样式更改gradio主题构建器上传主题方式代码上传主题方式目标 在DIY的主题中更改gradio单选框组件以及复选框组件的勾选后图标样式 效果 开始 笔者在使用gradio的主题构建器的过程中发现,gradio的复选框以及单选框组件勾选…...

Excel函数VLOOKUP常用方法

一、基础用法 1、精确匹配 公式&#xff1a;VLOOKUP(待匹配值&#xff0c;查找范围&#xff0c;范围列数&#xff0c;查找方式) 定义好要输出表的表头和第一列&#xff0c;第一列即为要查找和匹配的父内容&#xff0c;在第二列输入公式&#xff0c;被查找表中一定也要将待查…...

systemV的工作原理+原理代码

概念 我们知道进程间的通信有管道的方式进程通信管道制作_云的小站的博客-CSDN博客 但是我们的管道通信其实属于一种取巧的方式&#xff0c;利用了打开的文件可读写的特性上&#xff0c;两个进程对此分别进行读写操作就会产生所谓的通信现象&#xff0c;但是外面的管道依旧得…...

Kubeflow--TFJob实现机制学习

2023暑期学习 TF Job实际场景应用Vertex AI TF Job 链接 https://www.kubeflow.org/docs/components/training/tftraining/ https://developer.aliyun.com/article/601779 TFJob实际上遵循Kubernetes标准的API定义. TFJob 对象 apiVersion --> string --> api版本&…...

苏州公司网站建设/浏览器下载安装2023版本

2019独角兽企业重金招聘Python工程师标准>>> GNOME开发人员Bastien Nocera在他最新的博客文章中谈到了他在过去几个星期内在Fedora Linux操作系统的蓝牙堆栈上实施的增强功能。开发者已经为Fedora Linux蓝牙软件包提交的补丁&#xff0c;让用户在GNOME桌面环境中可以…...

基础集团网站建设/惊艳的网站设计

选择宣传册的尺寸&#xff0c;是开始宣传册设计的第一步&#xff0c;宣传册印刷样式多种多样&#xff0c;做法千变万化&#xff0c;但是宣传册尺寸是宣传册的基调&#xff0c;最常规的规格主要有以下几种&#xff1a;1、最常规的宣传册印刷尺寸&#xff0c;适合绝大多数企业和场…...

aspx网站实例/seo整站优化费用

你的外部for循环条件给你带来了问题.这是你的循环&#xff1a; –for (int i 0; i < array[i].length; i)现在,当我达到值3时,您正在尝试访问数组[3] .length.这将抛出IndexOutOfBounds异常.由于每个内部数组的大小相同,您可以将循环更改为&#xff1a; –for (int i 0; i…...

企业网站备案怎么做/百度入口网址

去除重复字母 给你一个字符串 s &#xff0c;请你去除字符串中重复的字母&#xff0c;使得每个字母只出现一次。需保证 返回结果的字典序最小&#xff08;要求不能打乱其他字符的相对位置&#xff09;。 注意&#xff1a;该题与 1081 https://leetcode-cn.com/problems/smalle…...

怎么做网站互换链接/广州百度关键词推广

前几天看了springside4的mini-web代码发现确实有不少新的东东&#xff0c;咱这次单说说Spring Data JPA吧。 引用springside4的 wiki关于对Spring Data JPA的简介 Spring Data JPA在JPA上又做了一层封装&#xff0c;只要编写接口就够了&#xff0c;不用写一行实现代码&#xff…...

word文档做网站/营业推广

ES6为Array增加了find()&#xff0c;findIndex函数。 find()函数用来查找目标元素&#xff0c;找到就返回该元素&#xff0c;找不到返回undefined。 findIndex()函数也是查找目标元素&#xff0c;找到就返回元素的位置&#xff0c;找不到就返回-1。 他们的都是一个查找回调函数…...