爬虫案例学习6
获取淘宝商品数据2024-12-18
参考学习:
大佬博客
视频教程
通过搜索发现,数据是通过发送请求过来的,不是静态存在源代码的
所以我们需要请求这个接口获取数据:比如标题,价格,图片等信息
https://h5api.m.taobao.com/h5/mtop.relationrecommend.wirelessrecommend.recommend/2.0/
但是我们直接发请求,携带上参数,无法获取到数据,会返回非法请求的字样。
因为有个参数sign是加密的,我们需要逆向
逆向参数获取sign
sign参数:貌似是一些参数经过哈希加密算法之后生成的32位小写加密参数。
具体的需要查看对应的js
点击main.js
搜素sign:相关的,分析
eT = eE(em.token + "&" + eC + "&" + eS + "&" + ep.data)
这一行就是生成sign
点击断点,可以查看变量的值
不过这里推荐打断点的时机,先鼠标滚动到下面的页码处,再接着打断点,点击下一页,此时进入js源码的参数才是正确的。
如果不这样做,鼠标滚轮下滑也进入了断点,ep.data的值不是我们需要的,需要放行很多次。
切换到控制台,输出这些值,等一下在python代码中需要使用,这里先记录一下
eE(em.token + "&" + eC + "&" + eS + "&" + ep.data) # 返回值是sign的值
em.token
eC
eS
ep.data
获得sign 8a3593958c55ff4115e359745dc9a665
是0-9,a-f MD5加密的字符串
我们需要带代码中生成sign
构建字符串MD5加密
#构建字符串str = em.token + "&" + eC + "&" + eS + "&" + ep.data
#Ec是时间
def getSign(eC):em = 'cbee62bc9b064d508514dd6eb1c6cebd' # em变量存储tokeneS = '12574478'# signParam 是ep.data中的params字段signParam = {"device": "HMA-AL00","isBeta": "false","grayHair": "false","from": "nt_history","brand": "HUAWEI","info": "wifi","index": "4","rainbow": "","schemaType": "auction","elderHome": "false","isEnterSrpSearch": "true","newSearch": "false","network": "wifi","subtype": "","hasPreposeFilter": "false","prepositionVersion": "v2","client_os": "Android","gpsEnabled": "false","searchDoorFrom": "srp","debug_rerankNewOpenCard": "false","homePageVersion": "v7","searchElderHomeOpen": "false","search_action": "initiative","sugg": "_4_1","sversion": "13.6","style": "list","ttid": "600000@taobao_pc_10.7.0","needTabs": "true","areaCode": "CN","vm": "nw","countryNum": "156","m": "pc","page": 2,"n": 48,"q": "%E8%A3%A4%E5%AD%90","qSource": "url","pageSource": "","tab": "all","pageSize": "48","totalPage": "100","totalResults": "137306","sourceS": "0","sort": "_coefp","bcoffset": "-13","ntoffset": "13","filterTag": "","service": "","prop": "","loc": "","start_price": None,"end_price": None,"startPrice": None,"endPrice": None,"categoryp": "","ha3Kvpairs": None,"couponFilter": 0,"myCNA": "4PjnHzPgIA0CARsm5jekDfQ+"
}
json在线格式化
复制到python的函数的signParam字典中,将null值修改为None
接着继续完善getSign函数的MD5加密工作
import hashlib
n = json.dumps(signParam)# print(json.dumps(json.dumps(signParam)))data = {"appId": "34385","params": n}# print(data)n_data = json.dumps(data).replace(" ", "")eC= "1734492057250" # 时间戳str = em + "&" + eC + "&" + eS + "&" + json.dumps(data).replace(" ","")# print(str)MD5 = hashlib.md5()MD5.update(str.encode("utf-8"))sign = MD5.hexdigest()return sign,n_data
调用函数,获取签名sign,上面的时间戳我是写死静态可,可以删除,改为动态的,
等一下在完整源码中会修改为动态当前时间戳
date_time = str(int(time.time() * 1000))
sign,n = getSign(eC = date_time)
# print(sign)
# f94586b665e0d865a20aa6d3acf708f3
有了sign,就可以发起请求,获取数据了,直接上完整源码
请求数据所在的api接口
https://h5api.m.taobao.com/h5/mtop.relationrecommend.wirelessrecommend.recommend/2.0/
完整源码
# 可以运行版
# 获取淘宝数据:https://s.taobao.com/
# 搜索键盘相关数据,会自动拦截登录页面(所以需要cookie)
import csv
import timeimport requests
from pprint import pprint
import hashlib
import json
import re
url = "https://h5api.m.taobao.com/h5/mtop.relationrecommend.wirelessrecommend.recommend/2.0/"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36","Referer": "https://s.taobao.com/","cookie":"自己的cookie"
}
"""mtopjsonp6({"api":"mtop.relationrecommend.wirelessrecommend.recommend","data":{},"ret":["FAIL_SYS_ILLEGAL_ACCESS::非法请求"]sign参数每次请求都会变化,导致请求不到数据(参数sign逆向)
"""
# eE(em.token + "&" + eC + "&" + eS + "&" + ep.data)
def getSign(eC):em = 'db1e1adce046132af55f1e37728ca39b'eS = '12574478'signParam = {"device": "HMA-AL00","isBeta": "false","grayHair": "false","from": "nt_history","brand": "HUAWEI","info": "wifi","index": "4","rainbow": "","schemaType": "auction","elderHome": "false","isEnterSrpSearch": "true","newSearch": "false","network": "wifi","subtype": "","hasPreposeFilter": "false","prepositionVersion": "v2","client_os": "Android","gpsEnabled": "false","searchDoorFrom": "srp","debug_rerankNewOpenCard": "false","homePageVersion": "v7","searchElderHomeOpen": "false","search_action": "initiative","sugg": "_4_1","sversion": "13.6","style": "list","ttid": "600000@taobao_pc_10.7.0","needTabs": "true","areaCode": "CN","vm": "nw","countryNum": "156","m": "pc","page": 1,"n": 48,"q": "%E8%A3%A4%E5%AD%90","qSource": "url","pageSource": "","tab": "all","pageSize": "48","totalPage": "100","totalResults": "5000","sourceS": "48","sort": "_coefp","bcoffset": "-26","ntoffset": "0","filterTag": "","service": "","prop": "","loc": "","start_price": None,"end_price": None,"startPrice": None,"endPrice": None,"categoryp": "","ha3Kvpairs": None,"couponFilter": 0,"myCNA": "4PjnHzPgIA0CARsm5jekDfQ+"
}n = json.dumps(signParam)# print(json.dumps(json.dumps(signParam)))data = {"appId": "34385","params": n}# print(data)n_data = json.dumps(data).replace(" ", "")str = em + "&" + eC + "&" + eS + "&" + json.dumps(data).replace(" ","")# print(str)MD5 = hashlib.md5()MD5.update(str.encode("utf-8"))sign = MD5.hexdigest()return sign,n_datadate_time = str(int(time.time() * 1000))
sign,n = getSign(eC = date_time)
print(sign)
params = {
'jsv': '2.7.4',
'appKey': '12574478',
't': date_time,
'sign': sign,
'api': 'mtop.relationrecommend.wirelessrecommend.recommend',
'v': '2.0',
'timeout': '10000',
'type': 'jsonp',
'dataType': 'jsonp',
'callback': 'mtopjsonp6',
'data': n
}
resp = requests.get(url,params=params, headers=headers)
# print(resp.text)
html = resp.text
# 采集数据
info = re.findall(r'mtopjsonp\d+\((.*)', html)[0].replace(')','')
# pprint(info)
jsonData = json.loads(info)
# 循环获取数据
with open('taobao.csv',mode="w",newline='',encoding="utf-8") as f:writer = csv.writer(f)# 写入表头head = ['标题','图片链接','价格','地区','销量','店铺']writer.writerow(head)for item in jsonData['data']['itemsArray']:dit = {'title': item['title'].replace('<span class=H>', '').replace('</span>',''),'img': item['pic_path'],'price': item['price'],'procity': item['procity'],'realSales': item['realSales'],'shopName': item['nick'],}writer.writerow(dit.values())print(dit)
注:需要获取其他数据
修改源码几个参数
url所在浏览器位置
改Referer和cookie
重写getSign函数的em值,eS值,signParam值
data中的appid也改
修改真正数据接口的参数:params
最后运行代码,即可获取数据
相关文章:
爬虫案例学习6
获取淘宝商品数据2024-12-18 参考学习: 大佬博客 视频教程 通过搜索发现,数据是通过发送请求过来的,不是静态存在源代码的 所以我们需要请求这个接口获取数据:比如标题,价格,图片等信息 https://h5api.m…...
28、论文阅读:基于像素分布重映射和多先验Retinex变分模型的水下图像增强
A Pixel Distribution Remapping and Multi-Prior Retinex Variational Model for Underwater Image Enhancement 摘要介绍相关工作基于模型的水下图像增强方法:无模型水下图像增强方法:基于深度学习的水下图像增强方法: 论文方法概述像素分布…...
[BJDCTF2020]ZJCTF,不过如此 1
[BJDCTF2020]ZJCTF,不过如此 1 打开实例发现代码审计 需要GET传入text和file参数,然后执行文件包含 text需要读取到I have a dream文本,这边采用data流进行绕过 ?textdata://,I have a dream&filenext.php成功绕过,接下来…...
Hive的in与not in 值中有null的时候注意事项,join where条件等问题
在进行hive SQL查询数据的时候,where条件中使用了in或者not in,但是该值内有null空。 这时,无论是in还是not in,空值都不会进入该条件内,但是使用not in的时候只是希望把自己不想要的数据给排除掉,这时会同…...
大语言模型画图(流程图、框架图)
第一步:向随意大语言模型,描述内容,推荐豆包 豆包 加上下面Prompt 通过Mermaid语法,描述上面流程图 第二步:将生成Mermaid输入流程图生成网站 中文Mermaid - 流程图、关系图在线画图、生成和编辑器...
Oracle创建逻辑目录
Oracle 在执行逻辑备份及还原时,需要用到逻辑目录。 本文就来简单介绍一下逻辑目录相关的操作,希望对大家有所帮助。 1.登录到Oracle数据库 使用具有足够权限的数据库用户登录到Oracle数据库。通常,这需要是管理员账号,如SYS…...
[react] 优雅解决typescript动态获取redux仓库的类型问题
store.getState()是可以获取总仓库的 先拿到函数的类型 再用ReturnType<T> 它是 TypeScript 中的一个内置条件类型,用于获取某个函数类型 T 的返回值类型 代码 // 先拿总仓库的函数类型type StatefuncType typeof store.getState;//再拿函数类型T的返回值类…...
python如何获取excel单元格文字是否加粗
是的,Python 可以获取 Excel 单元格中的文字是否加粗。通常,这需要使用 openpyxl 库,它允许你读取和写入 Excel 文件(.xlsx 格式)。 以下是一个示例代码,展示如何检查某个单元格的文字是否加粗:…...
我的性能优化经验
专业方向:App cpu/memory/gpu/流畅度/响应时间的优化,Anr,Framework CarPowerManagementService模块的(STR),从0~1完成性能监控体系搭建,完成3大版本迭代高质量性能交付 响应时间: …...
【Vulkan入门】16-IndexBuffer
TOC 先叨叨 上篇介绍了如何使用VertexBuffer传入顶点信息。两个多星期了我们一直在玩三个点,本篇介绍如何渲染更多的点。 在渲染前考虑一个问题,渲染一个三角形需要三个点,渲染两个相接的三角形需要几个点? 答案是6个点…...
如何通过HTTP API新建Collection
本文介绍如何通过HTTP API创建一个新的Collection。 前提条件 已创建Cluster:创建Cluster。 已获得API-KEY:API-KEY管理。 Method与URL HTTP POST https://{Endpoint}/v1/collections 使用示例 说明 需要使用您的api-key替换示例中的YOUR_API_KEY、…...
excel 使用vlook up找出两列中不同的内容
当使用 VLOOKUP 函数时,您可以将其用于比较两列的内容。假设您要比较 A 列和 B 列的内容,并将结果显示在 C 列,您可以在 C1 单元格中输入以下公式: 这个公式将在 B 列中的每个单元格中查找是否存在于 A 列中。如果在 A 列中找不到…...
实验16 循环神经网络(3)
目录 1.数据处理 1.1.数据集下载 1.2.数据加载 1.2.1读取数据 1.2.2词表转换 1.2.3封装数据 2. 模型构建 2.1汇聚层算子 2.2模型汇总 3. 模型训练 3.1模型训练 3.2绘制准确率和损失函数图像 4. 模型评价 5. 模型预测 6. 基于Torch的单向LSTM 6.1模型修改-只返…...
Docker 清理命令
Docker 清理命令 删除停止的容器:停止的容器仍然会占用磁盘空间,可以使用以下命令删除所有停止的容器: docker container prune删除无用的网络:Docker 创建的网络,如果不再使用,也可以被清理: d…...
游泳溺水识别数据集,对9984张原始图片进行YOLO,COCO JSON, VOC XML 格式的标注,平均识别率在91.7%以上
游泳溺水识别数据集: 对9984张原始图片进行YOLO,COCO JSON, VOC XML 格式的标注,平均识别率在91.7%以上 ,可识别泳池或者水库中是否有人溺水。 数据集分割 训练组98% 9818图片 有效集%…...
【计算机网络】应用层
1. 域名系统 DNS 1.1 域名系统概述 域名系统 DNS (Domain Name System) : 互联网使用的命名系统。 用来把人们使用的机器名字(域名)转换为 IP 地址。 为互联网的各种网络应用提供了核心服务。 域名采用层次树状结构的命名方法。 DNS 是…...
计算机组成原理的学习笔记(1)
学习笔记 前言 本文主要是对于b站尚硅谷的计算机组成原理的学习笔记,仅用于学习交流。 一、hello.c如何运行起来? 1. 预处理阶段 在编译 C 程序时,预处理器首先处理代码。预处理器会: 插入头文件:例如,…...
挑战一个月基本掌握C++(第六天)了解函数,数字,数组,字符串
一 C函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上ÿ…...
《薄世宁医学通识50讲》以医学通识为主题,涵盖了医学的多个方面,包括医学哲学、疾病认知、治疗过程、医患关系、公共卫生等
《薄世宁医学通识50讲》是一门由薄世宁医生主讲的医学通识课程,该课程旨在通过深入浅出的方式,向广大听众普及医学知识,提升公众对医学的认知和理解。 晓北斗推荐-薄世宁医学通识 以下是对该课程的详细介绍: 一、课程概述 《薄世…...
Golang囊地鼠gopher
开发知识点-golang 介绍红队专题-Golang工具Fscan简介主要功能ubuntu 安装windows 安装常用命令:项目框架源文件common目录Plugins目录Webscan目录入口点插件扫描类型爆破插件common.ScantypeWebtitle函数webpoc扫描POC 执行CEL-GO 实践CEL指纹识别免杀源码特征参考链接红队专…...
关于如何正确在测试用例中mock静态方法的问题
文章目录 情况一:希望在测试用例中直接执行静态方法的逻辑情况二:不希望在测试用例中执行静态方法的逻辑插桩方法坑1: 报错SubclassByteBuddyMockMaker原因与解决方案坑2:报错 the existing static mock registration must be deregistered原…...
深度学习0-前置知识
一、背景 AI最大,它的目的是通过让机器模仿人类进而超越人类; ML次之,它是AI的一个分支,是让机器模仿人类的一种方法。开发人员用大量数据和算法“训练”机器,让机器自行学会如何执行任务,它的成功取决于…...
web网页前后端交互方式
参考该文, 一、前端通过表单<form>向后端发送数据 前端是通过html中的<form>表单,设置method属性定义发送表单数据的方式是get还是post。 如使用get方式,则提交的数据会在url中显示;如使用post方式,提交…...
电商大数据的几种获取渠道分享!
在当今数字化时代,电商大数据已成为企业决策和运营的重要基础。如何高效地获取、分析和利用这些数据,对于提升电商企业的竞争力至关重要。本文将详细介绍几种电商大数据的获取渠道,帮助电商从业者更好地掌握数据资源,提升业务洞察…...
【图像配准】方法总结
图像配准(Image registration)就是将不同时间、不同传感器(成像设备)或不同条件下(天候、照度、摄像位置和角度等)获取的两幅或多幅图像进行匹配、叠加的过程,就是找到1幅图像像素到另1幅图像像素间的空间映射关系它已…...
SSM 超市管理系统
🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…...
【Yonghong 企业日常问题04】永洪BI可视化工具Linux部署全攻略(部署详解版)
文章目录 一、准备工作二、服务器环境配置2.1 安装JDK2.2 安装字体 三、产品安装四、相关资料 一、准备工作 在进行部署之前需要有以下几项工作准备: 1.产品安装包 2.对应版本的License 3.对应版本的JDK(推荐JDK11,产品v8版本以上需要JDK11以上版本) 4.…...
ubuntu下gdb调试ROS
参考: 使用VsCode进行ROS程序调试_ros vscode 调试-CSDN博客 https://blog.csdn.net/weixin_45031801/article/details/134399664?spm1001.2014.3001.5506 一、调试准备 1.1 CMakeLists改动 注释文件中的 set(CMAKE_BUILD_TYPE "Release") #构建类…...
scala中正则表达式的使用
正则表达式: 基本概念 在 Scala 中,正则表达式是用于处理文本模式匹配的强大工具。它通过java.util.regex.Pattern和java.util.regex.Matcher这两个 Java 类来实现(因为 Scala 运行在 Java 虚拟机上,可以无缝使用 Java 类库&…...
语音识别失败 chrome下获取浏览器录音功能,因为安全性问题,需要在localhost或127.0.0.1或https下才能获取权限
环境: Win10专业版 谷歌浏览器 版本 131.0.6778.140(正式版本) (64 位) 问题描述: 局域网web语音识别出现识别失败 chrome控制台出现下获取浏览器录音功能,因为安全性问题,需要在…...
前端本地数据存储方式有哪些
发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。 在前端开发中,本地数据存储是实现客户端数据持久化的关键技术。以下是几种常见的前端本地数据存储方式: …...
python总说的cd是什么
以下适用于windows环境 cd就是change directory的缩写,即改变目录。 讲cd命令之前,先来看看提示符是什么意思。现在的提示符是c:\> c:说明现在的工作盘是c盘,\告诉我们当前的工作目录是根目录。 >的作用是把工作目录和我们要输入的…...
Mybatis加密解密查询操作(sql前),where要传入加密后的字段时遇到的问题
项目场景: 提示:这里简述项目相关背景: 例如:Mybatis加密解密查询操作(sql前),where要传入加密后的字段时遇到的问题 问题描述 提示:这里描述项目中遇到的问题: 例如…...
Netdevops入门基础学习03
1、数据类型 在Python中解释器会自动识别数据类型,但是在C语言中需要手动指定(故Python简单易学) 字符串: str(string) 在Python中加了引号的都是字符串整数: int (integer)浮点数: …...
什么是自然语言处理
01.什么是自然语言处理 自然语言处理(Natural Language Processing,简称NLP)是一门跨学科领域,它结合了计算机科学、人工智能、语言学、心理学等多个学科的知识,旨在使计算机能够理解、解释、处理和生成人类语言。自然语言处理的目标是缩小人类语言和计算机之间的差距,使…...
网络安全怎么学习
当我们谈论网络安全时,我们正在讨论的是保护我们的在线空间,这是我们所有人的共享责任。网络安全涉及保护我们的信息,防止被未经授权的人访问、披露、破坏或修改。 一、网络安全的基本概念 网络安全是一种保护:它涉及保护我们的设…...
网络多层的协议详述
网络层 1)地址管理:制定一系列的规则,通过地址,在网络上描述出一个设备的位置 2)路由选择:网络环境比较复杂,从一个节点到另一个节点,存在很多条不同的路径,需要规划出…...
【C#】方法参数的修饰符ref 与 out
在 C# 中,ref 和 out 是方法参数的修饰符,用于将参数 按引用传递,而不是按值传递。这允许方法修改调用者传递的变量的值。尽管它们的行为类似,但有重要的区别和适用场景。 1. ref 的含义与使用 含义 引用传递: 参数通…...
hpe服务器更新阵列卡firmware
背景 操作系统:RHEL7.8 hpe服务器经常出现硬盘断开,阵列卡重启问题,导致系统hang住。只能手动硬重启。 I/O error,dev sda smartpqi 0000:5c:00:0: resettiong scsi 1:1:0:1 smartpqi 0000:5c:00:0: reset of scsi 1:1:0:1:…...
arcgisPro相接多个面要素转出为完整独立线要素
1、使用【面转线】工具,并取消勾选“识别和存储面邻域信息”,如下: 2、得到的线要素,如下:...
【机器学习】【集成学习——决策树、随机森林】从零起步:掌握决策树、随机森林与GBDT的机器学习之旅
这里写目录标题 一、引言机器学习中集成学习的重要性 二、决策树 (Decision Tree)2.1 基本概念2.2 组成元素2.3 工作原理分裂准则 2.4 决策树的构建过程2.5 决策树的优缺点(1)决策树的优点(2)决策树的缺点(3࿰…...
YOLOv8目标检测——详细记录使用ONNX Runtime进行推理部署C++/Python实现
概述 在之前博客中有介绍YOLOv8从环境安装到训练的完整过程,本节主要介绍ONNX Runtime的原理以及使用其进行推理加速,使用Python、C两种编程语言来实现。 https://blog.csdn.net/MariLN/article/details/143924548?spm1001.2014.3001.5501 1. ONNX Ru…...
联合物种分布模型(JSDM)与Hmsc包:群落生态学数据分析与预测技术
联合物种分布模型(Joint Species Distribution Modelling,JSDM)在生态学领域,特别是群落生态学中发展最为迅速,它在分析和解读群落生态数据的革命性和独特视角使其受到广大国内外学者的关注。在学界不同研究团队研发出…...
蓝桥杯——竞赛省赛国赛题分享
目录 一.[蓝桥杯 2013 省 AB] 错误票据 代码如下: 二.[蓝桥杯 2024 省 Java B] 报数游戏 代码如下: 讲解: 三.[蓝桥杯 2014 国 C] 拼接平方数 代码如下: 四.三步问题(递归,上台阶) 代码…...
【ubuntu18.04】ubuntu18.04挂在硬盘出现 Wrong diagnostic page; asked for 1 got 8解决方案
错误日志 [ 8754.700227] usb 2-3: new full-speed USB device number 3 using xhci_hcd [ 8754.867389] usb 2-3: New USB device found, idVendor0e0f, idProduct0002, bcdDevice 1.00 [ 8754.867421] usb 2-3: New USB device strings: Mfr1, Product2, SerialNumber0 [ 87…...
Hive其一,简介、体系结构和内嵌模式、本地模式的安装
目录 一、Hive简介 二、体系结构 三、安装 1、内嵌模式 2、测试内嵌模式 3、本地模式--最常使用的模式 一、Hive简介 Hive 是一个框架,可以通过编写sql的方式,自动的编译为MR任务的一个工具。 在这个世界上,会写SQL的人远远大于会写ja…...
如何在 Ubuntu 上安装 NodeBB 并使用 Nginx 反向代理
简介 NodeBB 是一款基于 Node.js 的开源论坛软件,为在线社区提供了现代化和响应式的解决方案。在 Ubuntu Linux 上运行的 NodeBB 利用了操作系统的强大性和灵活性,以提供高性能和可扩展性。它结合了 MongoDB 或 Redis 进行数据库管理,使其能…...
Linux脚本语言学习--下
4.Bash的变量 4.1.用户自定义变量 4.1.1.什么是变量 变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息的时候,如一个文件名或是一个数字,就把他存放在一个变量中。每个变量有一个名字,所以很容易引用…...
基于Spring Boot的医院质控上报系统
一、系统背景与意义 医院质控上报系统旨在通过信息化手段,实现医院质量控制的标准化、流程化和自动化管理。该系统能够帮助医院实时监控医疗质量数据,及时发现和处理潜在的质量问题,从而确保医疗服务的安全性和有效性。同时,系统…...
React 第十七节 useMemo用法详解
概述 useMemo 是React 中的一个HOOK,用于根据依赖在每次渲染时候缓存计算结果; 大白话就是,只有依赖项发生变化时候,才会重新渲染为新计算的值,否则就还是取原来的值,有点类似 vue 中的 computed 计算属性…...