网络爬虫相关

一、爬虫的基础内容

1、基本概念和用途

1.1、概念:

  • 模拟浏览器、发送请求,获取响应。(只能获取客户端所展示出来的数据)

1.2、特点:知识碎片化,针对不同的网站对应的方法也不同。

  • 爬虫:模拟客户端访问,抓取数据。
  • 反爬:保护重要数据,阻止恶意网络攻击
  • 反反爬:针对反爬的措施。

1.3、作用

  1. 数据采集
  2. 软件测试
  3. 抢票
  4. 网络安全
  5. web漏洞扫描

2、爬虫的分类

2.1、根据爬取网站的数量,可以分为

2.1.1、通用爬虫

①特点:爬取网站数量没有上线。

示例:搜索引擎

2.1.2、聚焦爬虫(*)

①特点:爬取网站数量有上限,有明确的目标。

②分类:

功能性爬虫

①特点:不获取数据,只为实现某一功能。

示例:投票 / 抢票 / 短信轰炸等。

数据增量性爬虫

①特点:获取数据用于后续分析

②分类

  • url与数据同时变化        -- 整条新数据
  • url不变,数据裱花        -- 数据部分更新

3、爬虫的基本流程

3.1、流程

  • url(网站资源定位符)
  • 对url发送网络请求,获取网络请求的响应
  • 解析响应,提取数据
  • 保存数据
3.1.1、确认目标:目标url:www.baidu.com
3.1.2、发送请求:发送网络请求,获取到特定的服务端给你响应。
3.1.3、提取数据:从响应中提取特定的数据        jsonpath / xpath / re
3.1.4、保存数据:本地(html、json、txt)、数据库

获取到的响应中,有可能会提取到还需要继续发送请求的url,可以拿着解析到的url继续发送请求

robots协议并不是一个规范,只是约定俗成。

二、http协议以及请求头

1、网络通信

1.1、步骤

  • 电脑(浏览器):   url      --   www.baidu.com      域名
  • DNS服务器:IP地址标注服务器,返回响应
  • DNS服务器返回IP地址给浏览器
  • 浏览器拿到IP地址去访问服务器,返回响应
  • 服务器返回给我们的响应数据:html / css / js / jpg......

1.2、实际原理

一个请求只能对应一个数据包(文件)

2、http协议和https协议

2.1、http协议(超文本传输协议)

  • 超文本:不仅仅限于文本,还包括图片、音频、视频。
  • 传输协议:指使用共用约定的固定格式来传递转换成字符串的超文本内容。
2.1.1、作用
  • 规定了服务器和客户端互相通信的规则。
2.1.2、http请求/响应的步骤
  • 客户端连接到web服务器
  • 发送http请求
  • 服务器接受请求返回响应
  • 释放连接tcp连接
  • 客户端解析html内容
2.1.3、请求头

请求方式:get  和   post

get:向服务器要资源

post:向服务器提交资源

  • User-Agent:模拟正常用户
  • cookie:登录保持
  • referer:当前这一次请求时由哪个请求过来的

抓包得到的响应内容才是判断依据,elements中的源码是渲染之后的源码,这个不能作为判断标准。

2.1.4、字符串编码解码

编码        -- encode()

字符串转换成二进制字符串        str 转换成 bytes

解码        -- decode()

二进制字符串转换成字符串        bytes 转换成 str

三、requests库的介绍

1、requests基本使用

requests模块作用:发送http请求,获取响应数据。

requests模块式第三方模块,需要安装:

1.1、安装命令:        --    pip install requests
1.2、基本使用:
import requests# 目标url
url = 'https://www.baidu.com'# 向目标url发送get请求
response = requests.get(url)# 打印响应内容#将其编码设置为UTF-8
response.encoding = 'utf-8'print(response.text)# print(response.content.decode())    默认UTF-8解码

使用requests库保存图片:

import requests# 确定url
url = 'https://img0.baidu.com/it/u=3225468693,477076843&fm=253&fmt=auto&app=138&f=JPEG?w=1115&h=800'# 发送请求,获取响应
res = requests.get(url)
print(res.content)# 保存响应
with open('1.jpg', 'wb') as f:f.write(res.content)
1.3、常用的属性或方法
  • response.url  响应的url。有时候响应的url和请求的url并不一致。
  • response.status_code  响应状态码。
  • response.request.headers  响应对应的请求头。
  • response.headers  响应头
  • response.cookies  响应的cookie(经过了set-cookie动作。返回cookieJar类型)
1.4、其他属性

response.text 和 response.content 的区别:

text:  str类型,  requests模块自定根据http头部对响应的编码作出有根据的推测。

content: bytes类型,  可以通过decode()解码。

2、用户代理

请求头中user-agent字段必不可少,表示客户端操作系统以及浏览器的信息。

示例

import requestsurl = 'https://www.baidu.com/'# 构建请求头
header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36'
}# 带上user-agent发送请求
# headers参数接受字典形式的请求头,请求头字段名为key,值为value
response = requests.get(url, headers=header)print(response.content.decode())

添加user-agent的目的是为了让服务器认为是浏览器在发送请求,而不是爬虫在发送请求

3、URL传参

user-agent池        --防止反爬

第一种方法:使用user-agent池随机调用

import random# 随机调用
UAlist = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36','Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1','Mozilla/5.0 (Linux; Android 8.0.0; SM-G955U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Mobile Safari/537.36',
]print(random.choice(UAlist))

第二种方法:使用fake_useragent  可能会出现异常

首先下载fake_useragent:pip install fake_useragent

from fake_useragent import UserAgent
print(UserAgent().random)

3.1、浏览器发送请求的原理

  • 构建请求
  • 查找缓存(在浏览器缓存中寻找有没有需要查找的资源,如果有的话就拦截请求,返回这一资源的副本,并直接结束请求)
  • 准备IP地址和端口
  • 等待tcp队列
  • 建立tcp连接
  • 发送http请求

浏览器会向服务器发送请求行,包括了请求方法,请求url,http协议

3.2、编码转译

  • 字符串被当做url提交时会被自动进行url编码处理
  • 输入           --字符串       明文
  • 发送请求的时候        --%xxx%xxx       密文
from urllib.parse import quote, unquote
# quote()     #明文转密文
# unquote()      #密文转明文
print(quote('参数'))  # 输出:%E5%8F%82%E6%95%B0
print(unquote('%E5%8F%82%E6%95%B0'))  # 输出:参数

3.3、发送带参数的请求

通过params携带参数字典

  • 构建请求参数字典
  • 发送请求的时候带上请求参数字典
import requestsurl = 'https://www.baidu.com/s?'header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36'
}# 构建请求参数字典
name = input("请输入关键字:")
kw = {'wd': name}# 带上请求参数发起请求,获取响应
response = requests.get(url, headers=header, params=kw)
print(response.content.decode())

四、简单案例

1、获取单张图片

示例(网易云)

# 1、导入模块
import requests# 找到目标url
url = 'https://p1.music.126.net/Y2C3RbZflVZMUuNBkKA-Jg==/109951170607654157.jpg?imageView&quality=89'# 构建请求头字典
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36'
}# 发送请求,获取响应
res = requests.get(url, headers=headers)
# res.content是二进制数据# 保存文件
with open('网易云.jpg', 'wb') as f:f.write(res.content)

2、获取单首歌曲

示例(酷我):

# 1、导入模块
import requests# 找到对应目标的url
url = 'https://ga-sycdn.kuwo.cn/2941b0d5664d5d39fbcc5d58db543670/67d45eec/resource/pay3_v2/279292599/'# 构建请求头字典
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36'
}# 发送请求,获得响应
res = requests.get(url, headers=headers)# 保存文件
with open('酷我.mp3', 'wb') as f:f.write(res.content)

3、获取单个MV

示例(酷我):

# 导入模块
import requests# 确定目标url
url = 'https://gd-sycdn.kuwo.cn/6bab1f0b832f4a522593a520edc1abee/67d45553/resource/m3/35/83/2343069577.mp4'# 获取请求头字典
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36'
}# 发送请求,获取响应
res = requests.get(url, headers=headers)# 保存文件
with open('mv.mp4', 'wb') as f:f.write(res.content)

4、获取单页贴吧

示例(百度贴吧):

# 导入模块
import requests# 确定目标url
url = 'https://tieba.baidu.com/f?ie=utf-8&kw=%E5%B0%8F%E6%98%8E&fr=search'# 获取请求头字典
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36'
}# 发送请求,获取响应
res = requests.get(url, headers=headers)# 保存文件
with open('小明.html', 'wb') as f:f.write(res.content)

示例(贴吧翻页):

# 导入模块
import requests# 确定目标url
url = 'https://tieba.baidu.com/f?'# 获取请求头字典
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36'
}search = input('请输入搜索内容:')
page = int(input('请输入要保存的页数:'))for i in range(page):params = {'kw': search,'pn': i*50}# 发送请求,获取响应res = requests.get(url, headers=headers, params=params)# 保存文件with open(F'{search}{i+1}.html', 'wb') as f:f.write(res.content)

改为面向对象

# 导入模块
import requests# 改为面向对象class Tb:def __init__(self):self.url = 'https://tieba.baidu.com/f?'self.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36'}# 发送请求def send(self, params):res = requests.get(self.url, headers=self.headers, params=params)return res.text# 保存数据def save(self, page, con):with open(f'{page}.html', 'w', encoding='utf-8') as f:f.write(con)def run(self):word = input('请输入查找信息:')pages = int(input('请输入页数:'))for page in range(pages):params = {'kw': word,'pn': page*50}# 循环执行data = self.send(params)self.save(page, data)te = Tb()
te.run()

五、post请求和模拟登录

1、post请求:登录注册,传输大文本内容

requests.post(url,data)# data参数接受一个字典

get和post的区别:

  • get请求  --比较多                        
  • post请求  --比较少
  • get请求直接向服务器发送请求,获取响应内容
  • poet请求是先给服务器一些数据,然后再获取响应
  • get请求携带参数   --params
  • post请求携带参数  --data

2、cookie    模拟登录

# 导入模块
import requestsurl = 'https://music.163.com/'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36','Cookie': 'NMTID=00OirJp6WmwK2CZ0UsRs0AwIsuCZ24AAAGVlUI2ww; _iuqxldmzr_=32; _ntes_nnid=8acdc47e4ec07cfcc0c3d8a5a7563e2b,1741965900532; _ntes_nuid=8acdc47e4ec07cfcc0c3d8a5a7563e2b; WEVNSM=1.0.0; WNMCID=yzysjc.1741965901512.01.0; WM_TID=uR%2FXeQkMY%2BBEREERQAeWZsNjcExlNr%2Fr; sDeviceId=YD-wk74YKwl8c1BEgVBFVbBkf9FLdSm06BO; ntes_utid=tid._.jwaAVzsxdbJFRkFAAUfDM9YiNEl0ltaU._.0; __snaker__id=HFEZmaht8jsYG5Lq; JSESSIONID-WYYY=D4asd5JMMPTACEfo1h%5CuG3iv1f2kh4UokwaX6EThS3M6N%2BTH2v8RFTnYrueIKW6KK05aXaUMNg4muZNN1HwU6meM4CI%2F3swbc2%5CQ19yJAjnHar08eUxlMd6sZme0mrgWUZ%2B1Yz0lztuFpXI2ftmblBDuXpf%2FbJEy9Y7uRz9ocrPdN83W%3A1742052144561; WM_NI=uvbx63QfSmoh%2B74VnJtzOY3PI8UFru33HLKrWjKUtPOsE%2FJeYNhNhn2AIT1aHmDoEZDHq1GJ5C%2BgGLQobuWHScYDBnqiCBkb4Mh9VgIo%2FS%2B0CJ0ZUgjvDhqdG0OsaO0zUmg%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eeb3c55e9b939c88ce3dae9a8aa3d15f928a8e87c269fb94adabe766acbcf79bf92af0fea7c3b92ab7aaae99b53993ba9d8eee64e9e9fcb7ed42b8a681bab25c8be89ba7f17ff1ed88adca7a95b685b6f75c8dad8bd0c96f9b92a8afeb66f29f87b5b46b8cb38c90c8528898bfd2c642f79de588c64893b1ae96d64491bd97a5c166b3b78da3ea6af893a8dad56d8bb1e1b4aa3c819600bbd86daaaa8c89f47085f08194e445f4a69b8ee637e2a3; gdxidpyhxdE=OOzg9mY%2FxHuPDnHdx434EhbnKe5iAVw5gopZkA4GbO4xlhAJYlrunqeeT3mnVYsjaLgbMuXlm9Z3QdBpG2JLgex1w9OCqOm5ftHtqC0wvLOZbX6SJdnRKwjOcitbT9ViOWEItod3TyULCDOK%5Cy%5CuEvaAqdcv%2FPGk5Ax%5C26UMJI8dPzt6%3A1742051249437; __csrf=5b42a43d68078759426489b0b38b1550; MUSIC_U=00D6018410AF7F96CDC71B00BDBA2443074C93CB0859C0894B62EB44734CB09C8F339E40951BECD0A20BF971729D9E195D51057ED0B5601D9EB8504B44BA59190FC07E793A37F266D6B8FDF3CDA161416292E1690844821EBEE9B31E9B9EECC551AAA85ED5BEC21FC171CD3907BEE0F88BE58ABC25EBEE9FAFBCB8821C649C99B7AFE8D2C622FA851CD0096BB46B0A869688E1038BA3034E434D4EDD76242A23743EA0FAF138DE54513B4AFD4756238A5B03471FC7B5F4B5748D142991DB96CA7A9AD4AF0CAD55462359561BA5D3164128F00508A709CF4CCF0407BE84A8A25945F2DBCB4614F4AEB64E740E93E56FCD68291F57E410DC0260BEFA6BD303378F0CB856081EAD6433FCBA395F144059BF3D18D3CBAAEFB267307A0683684042C4558E9965D2379DC9B92EBEDB41563C1C7F3B59114880CD15E586C57504BDEEB7F61CE50DACC1C5DED2C6C42205A8E360E6A8BB3CF69469EF9712A6A35972CB79BE; ntes_kaola_ad=1'
}# 发送请求
res = requests.get(url, headers=headers)
print(res.text)

3、post请求举例

示例(金山翻译):

# 导入模块
import requests
import jsonurl = 'https://ifanyi.iciba.com/index.php?c=trans'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36'
}word = input('请输入你要翻译的内容:')# 构建data参数字典
post_data = {'from': 'zh','to': 'en','q': word
}res = requests.post(url, headers=headers, data=post_data)
# print(res.text)# 解析数据
# 将json数据转换为Python字典
dic = json.loads(res.text)
print(dic['out'])

4、session

requests模块中的session类能够自动处理发送请求获取响应过程中所产生的cookie,进而达到状态保持的目的。(自动处理cookie,即下一次请求会带上前一次的cookie。

session = requests.session()      #实例化session对象
res = session.post(url,data=data)使用session访问登录以后的页面
session.get(url.text)
  • 1、对访问登录后才能访问的页面去进行抓包
  • 2、确定登录请求的url地址,请求方法和所需的参数
  • 3、确定登录才能访问的页面url和请求方法
  • 4、利用requests.session完成代码

5、cookie池

user-agent池:短时间内多次发出请求,尽量每一次的请求都用不同的用户代理。

cookie池:每一个cookie就代表一个账号。

cookie有有效期,session不用担心有效期的问题。

cookie跟session的区别:

  • cookie数据放在浏览器中,session数据放在服务器中。
  • cookie不安全,别人可以分析存放在本地的cooker并进行cookie欺骗,考虑到安全应当使用session。
  • session会在一定时间内保存在服务器上,考虑到减轻服务器性能方面,应当使用cookie。
  • 可以考虑将登录信息等重要信息存放在session,其他信息如果需保留,可以存放在cookie中。

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

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

相关文章

Lora 中 怎么 实现 矩阵压缩

Lora 中 怎么 实现 矩阵压缩 1. 导入必要的库 import torch import re from datasets import Dataset from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer, \get_cosine_schedule_with_warmup, EarlyStoppingCallback from peft

golang-嵌套结构体

结构体嵌套 golang中没有类,他通过结构体来实现其他编程语言中类的相关功能。 具名结构体 基本语法 基本语法 golang的结构体嵌套特别简单。 type 结构体类型1 struct{字段 类型1字段 类型2 }//这样就实现了结构体的嵌套 type 结构体类型2 struct{字段 类型1字…

基于Spring Boot的大学校园生活信息平台的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

【 利用socket来实现简单远控】

利用socket来实现简单远控 🔹 免责声明⚠️ 重要提示一、什么是socket?二、如何使用socket来实现两台计算机之间的通信?服务端1、首先需要创建一个socket;2、绑定IP以及端口3、开启监听4、接受客户端连接5、客户端连接上之后就是命…

数据可视化在特征分布对比中的应用

数据可视化在特征分布对比中的应用 1. 引言 在机器学习系统开发和维护过程中,特征分布对比是评估数据质量和模型鲁棒性的关键环节。当训练数据与测试数据分布存在偏差,或生产环境中的数据分布随时间发生变化时,模型性能通常会显著下降。有效的数据可视化不仅能帮助检测这些…

依赖倒置 DIP、依赖注入 DI、控制反转 IoC 和工厂模式

1. 依赖倒置 依赖倒置原则(Dependency Inversion Principle, DIP)是 SOLID 原则中的一项,其核心思想是通过抽象解耦高层模块和低层模块,使二者都依赖于抽象而非具体实现。 依赖反转/倒置的体现:传统依赖方向是高层模块…

UnitTest框架管理测试用例——python自动化测试

UnitTest框架 UnitTest是Python自带一个单元测试框架,常用它来做单元测试。 注意:对于测试来说,UnitTest框架的作用是 自动化脚本(用例代码)执行框架————(使用UnitTest框架来管理 运行多个测试用例的) 为什么使用UnitTest框架 能够组织多个用例去执…

Vue 过滤器深度解析与应用实践

文章目录 1. 过滤器概述1.1 核心概念1.2 过滤器生命周期 2. 过滤器基础2.1 过滤器定义2.2 过滤器使用 3. 过滤器高级用法3.1 链式调用3.2 参数传递3.3 动态过滤器 4. 过滤器应用场景4.1 文本格式化4.2 数字处理4.3 数据过滤 5. 性能优化与调试5.1 性能优化策略5.2 调试技巧 6. …

ngx_http_module_t

定义在 src\http\ngx_http_config.h typedef struct {ngx_int_t (*preconfiguration)(ngx_conf_t *cf);ngx_int_t (*postconfiguration)(ngx_conf_t *cf);void *(*create_main_conf)(ngx_conf_t *cf);char *(*init_main_conf)(ngx_conf_t *cf, void *conf);…

每日定投40刀BTC(9)20250312 - 20250315

定投截图 区块链相关新闻 BTC价格一度跌破8万美元 3月14日,BTC价格盘中跌破8万美元,最低报79,954.60美元,日内下跌1.34%,市场情绪一度转为谨慎 BTC价格波动背后的原因 经济环境变化、市场情绪波动以及政策监管动态是导致BTC价…

Matlab 汽车二自由度转弯模型

1、内容简介 Matlab 187-汽车二自由度转弯模型 可以交流、咨询、答疑 2、内容说明 略 摘 要 本文前一部分提出了侧偏角和横摆角速度作为参数。描述了车辆运动的运动状态,其中文中使用的参考模型是二自由度汽车模型。汽车速度被认为是建立基于H.B.Pacejka的轮胎模…

CentOS 6 YUM源切换成国内yum源

由于 CentOS 6 已于 2020 年 11 月进入 EOL(End of Life),官方软件源已不再提供更新,因此你可能会遇到 yum makecache 命令失败的问题。以下是解决该问题的详细步骤: ### 解决方案 1. **备份原有 yum 源文件** bash …

Leetcode 3483. Unique 3-Digit Even Numbers

Leetcode 3483. Unique 3-Digit Even Numbers 1. 解题思路2. 代码实现 题目链接:3483. Unique 3-Digit Even Numbers 1. 解题思路 这一题其实是一个easy的题目,因为限制条件有限,最暴力的方法就是直接遍历一下100到999的全部数字&#xff…

《基于深度学习的高分卫星图像配准模型研发与应用》开题报告

目录 1. 选题的背景和意义 1.1 选题的背景 1.2 国内外研究现状 1.3 发展趋势 2.研究的基本内容 2.1 主要研究内容 (1)训练与测试数据集构建 (2)基于深度学习的高精度卫星影像配准模型 (3&#xff0…

【Python 算法零基础 1.线性枚举】

我装作漠视一切,以为这样就可以不在乎 —— 25.3.17 一、线性枚举的基本概念 1.时间复杂度 线性枚举的时间复杂度为 O(nm),其中 n是线性表的长度。m 是每次操作的量级,对于求最大值和求和来说,因为操作比较简单,所以 …

前端性能优化回答思路

前端性能优化是面试中经常涉及的一个话题,面试官通常希望了解你在实际项目中如何处理性能瓶颈,如何识别和优化性能问题。以下是一些前端性能优化的常见问题以及你可以用来回答的思路: 如何提升页面加载速度? 回答思路&#xff1…

02-Canvas-fabric.ActiveSelection

fabric.ActiveSelection fabric.ActiveSelection 用于表示当前选中的多个对象(即多选状态)。 当用户在画布上选择多个对象时,Fabric.js 会自动将这些对象包装在fabric.ActiveSelection 实例中,以便统一操作(如移动、缩…

Leetcode——151.反转字符串中的单词

题解一 思路 最开始的想法是把一个字符串分为字符串数组,但是不知道一共有几个单词(当时没想起来split()),所以选择了用ArrayList储存字符串,在输出时没有考虑ArrayList可以存储空字符串,所以最开始的输出…

Oracle检索数据

一、Oracle用户模式与模式 对象 1.概念 模式就是数据库对象的集合,数据库对象包括表、函数、索引、视图、过程。 2.示例模式scott SQL> select table_name from user_tables;TABLE_NAME ------------------------------------------------------------------…

Java学习------static、final、this、super关键字

1. static关键字 static修饰的变量叫做静态变量。当所有对象的某个属性的值是相同的,建议将该属性定义为静态变量,来节省内存的开销。静态变量在类加载时初始化,存储在堆中。static修饰的方法叫做静态方法。所有静态变量和静态方法&#xff…