网络爬虫-1:发送请求+维持会话+代理设置/超时设置

news2025/3/13 10:29:07

1.基于get发送请求
2.基于post发送请求
3.维持会话
4.代理设置/超时设置

一.基于get发送请求

1.获取网页源码1

使用json库中的json.loads(),将json格式的字符串变为Python的字典形式

以下通过http://httpbin.org/get网址进行基本练习操作

import requests
import json
url='http://httpbin.org/get'  #目标站点url
r=requests.get(url)           #发送get请求
dict_data=json.loads(r.text)
print("网页源码:\n",r.text)
print("网页源码的类型:\n",type(r.text))
print("键值对形式:\n",dict_data)
print("响应状态码:\n",r.status_code)     

1.网页源码通常为 HTML、JSON 或其他文本格式。

2.通过type函数可知,返回的网页源码是JSON 格式的字符串

3.响应状态码一般有:200(请求成功),404(未找到),500(服务器内部错误)。

通过以上操作就获得了一个简单的网页源码爬取

网页源码:
 {
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.32.3", 
    "X-Amzn-Trace-Id": "Root=1-67b6f01c-2e488d805a9188994c10307a"
  }, 
  "origin": "112.240.55.236", 
  "url": "http://httpbin.org/get"
}

网页源码的类型:
 <class 'str'>
键值对形式:
 {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.32.3', 'X-Amzn-Trace-Id': 'Root=1-67b6f01c-2e488d805a9188994c10307a'}, 'origin': '112.240.55.236', 'url': 'http://httpbin.org/get'}
响应状态码:
 200

2.获取网页源码2

使用r.json()

import requests
import json
url='http://httpbin.org/get'  #目标站点url
r=requests.get(url)           #发送get请求
dict_data=r.json()
print("键值对形式:\n",dict_data)
键值对形式:
 {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.32.3', 'X-Amzn-Trace-Id': 'Root=1-67b6f1fb-77329c48412b3c3c3c0aa26e'}, 'origin': '112.240.55.236', 'url': 'http://httpbin.org/get'}

3.网页源码(为图片或音频时)

使用r.content

import requests

url='https://www.baidu.com/img/baidu_jgylogo3.gif'  #以图片为例
r = requests.get(url)                               #发送get请求
print(r.content)                                    #获取为二进制形式,图片或音频
print(type(r.content))                              #<class 'bytes'>表示二进制
#保存二进制图片
with open('test.jpg','wb') as f:
    f.write(r.content)

4.设置参数1

该练习网站可以自己设置参数args,通过在网址后面加?,参数后面加&,会在args这一栏显示设置的参数

import requests
url='http://httpbin.org/get?age=12&time=11.9&name=12'#目标站点
r=requests.get(url)
print(r.text)

 在返回的网页源码中,会出现我们在url后面设置的参数

{
  "args": {
    "age": "12", 
    "name": "12", 
    "time": "11.9"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.32.3", 
    "X-Amzn-Trace-Id": "Root=1-67b6e74e-2ecdb89860e0144f3c399d39"
  }, 
  "origin": "112.240.55.236", 
  "url": "http://httpbin.org/get?age=12&time=11.9&name=12"
}

5.设置参数2

推荐使用的参数添加方式:使用字典,并在params参数中加上data,即可实现在网址后加上参数的操作

url='http://httpbin.org/get?'
data={
    'age':12,
    'time':11.9
}
r=requests.get(url,params=data)
print(r.text)
{
  "args": {
    "age": "12", 
    "time": "11.9"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.32.3", 
    "X-Amzn-Trace-Id": "Root=1-67a08088-56abf4e11348b1622190c6ca"
  }, 
  "origin": "123.13.93.50", 
  "url": "http://httpbin.org/get?age=12&time=11.9"
}

6.爬虫伪装-1

import requests
import random
url='https://www.zhihu.com/explore'
#构建用户信息
USER_AGENTS = [
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
"Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
"Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
"Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10"
]
UA={
    'User-Agent': random.choice(USER_AGENTS),
}
#参数设置
data={
    "age":12,
    "time":11.9
}
response=requests.get(url,params=data,headers=UA)
print("响应状态码:\n",response.status_code)
print("网页源码前200:\n",response.text[:200])

二.基于post发送请求

1.获取网页源码1

使用json库中的json.loads(),将json格式的字符串变为Python的字典形式

import requests
import json
url='http://httpbin.org/post'    #目标站点
r = requests.post(url)           #发送post请求
dict_data=json.loads(r.text)     #将JSON 格式的字符串转换为 Python 字典(方便后续通过键名操作)
url_=dict_data["url"]            #获取网页源码中的url
print("输出json形式的网页源码:\n",dict_data)
print(url_)
输出json形式的网页源码:
 {'args': {}, 'data': '', 'files': {}, 'form': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '0', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.32.3', 'X-Amzn-Trace-Id': 'Root=1-67b6ea62-559651c6763bbd4a2659f360'}, 'json': None, 'origin': '112.240.55.236', 'url': 'http://httpbin.org/post'}
http://httpbin.org/post

2.获取网页源码2

使用r.json()

import requests
import json
url='http://httpbin.org/post'#目标站点
r = requests.post(url)
dict_data=r.json()
print(dict_data)
print(dict_data["url"])
{'args': {}, 'data': '', 'files': {}, 'form': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '0', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.32.3', 'X-Amzn-Trace-Id': 'Root=1-67b6ee93-0580883d7de493eb16e3b93a'}, 'json': None, 'origin': '112.240.55.236', 'url': 'http://httpbin.org/post'}
http://httpbin.org/post

3.设置参数

json形式,基于post请求增加参数,使用data=data进行参数的增加

import requests

url='http://httpbin.org/post'  #目标站点post请求
data={
    "age":12,
    "time":11.9
}                              #参数
response = requests.post(url,data=data)
print("网页源码:\n",response.text)
print("网页源码(键值对形式):\n",response.json())
网页源码:
 {
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "age": "12", 
    "time": "11.9"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "16", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.32.3", 
    "X-Amzn-Trace-Id": "Root=1-67b6f31c-37e0c7ac11daa02a0d09daad"
  }, 
  "json": null, 
  "origin": "112.240.55.236", 
  "url": "http://httpbin.org/post"
}

网页源码(键值对形式):
 {'args': {}, 'data': '', 'files': {}, 'form': {'age': '12', 'time': '11.9'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '16', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.32.3', 'X-Amzn-Trace-Id': 'Root=1-67b6f31c-37e0c7ac11daa02a0d09daad'}, 'json': None, 'origin': '112.240.55.236', 'url': 'http://httpbin.org/post'}

三.维持会话

用途:登录网站使用 Cookies 或 Session 维持登录状态,访问需要登录的页面。

3.1通过cookies维持会话

import requests
#好处:容易请求到需要登录的请求
#坏处:容易被反爬封号
head={
    "cookie":"...............",
    
    "user-agent":"................"
}
url='https://www.jianshu.com'
response=requests.get(url,headers=head)

3.2通过session维持会话

import requests

s=requests.Session()
url='https://www.jianshu.com'
response1 = s.get(url,headers=head)

Cookies 和 Session 的区别

特性CookiesSession
存储位置客户端(浏览器或爬虫)服务器端
数据安全性较低(可以被客户端修改)较高(存储在服务器)
生命周期可以设置过期时间通常随会话结束而失效
性能影响每次请求都会携带 Cookies,增加带宽服务器需要存储 Session 数据
适用场景简单的状态维持(如登录状态)复杂的状态管理(如购物车、多步操作)

四.代理设置/超时设置

使用proxies携带ip地址,使用timeout进行超时反馈,当ip不能用时,防止一直访问而不自知

超时(Timeout)是指爬虫在发送请求后,等待服务器响应的最长时间。如果超过这个时间仍未收到响应,爬虫会停止等待并抛出异常。

url='https://www.jianshu.com'
ip = {
    "https":"172.16.17.32:8000",
}
response2=requests.get(url,proxies=ip,timeout=4)

 超时参数详解

  • timeout=5:表示总超时时间为 5 秒(包括连接时间和读取时间)。

  • timeout=(3, 5):表示连接超时为 3 秒,读取超时为 5 秒。

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

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

相关文章

Redis 2025/3/9

Redis主从集群 搭建主从集群 Redis并发能力非常强&#xff0c;单节点能够达到数万的并发。 不过对一些用户规模大&#xff0c;并发量比较高的应用来讲&#xff0c;数万并发不太够。这时候就用到redis的集群了。因为Redis中的数据通常读多写少&#xff0c;所以最常用的集群方…

2min搞定~Mac Pro 编译安装 Nginx 1.8.1

2min搞定&#xff5e;Mac Pro 编译安装 Nginx 1.8.1 一安装流程简述1、编译源码前&#xff0c;获取要依赖的源码包2、进行编译、安装nginx3、启动 二、实战部分&#xff1a;测试demo1、nginx.conf改动2、代码改动3、访问 一安装流程简述 阿哟啊哟老铁&#xff0c;别嫌我啰嗦奥…

要在Unreal Engine 5(UE5)中实现角色打击怪物并让怪物做出受击反应,

UE5系列文章目录 文章目录 UE5系列文章目录前言一、实现思路二、最终效果 前言 ue5角色受击没有播放受击动画&#xff0c;主角达到怪物身上没有反应 一、实现思路 要在Unreal Engine 5&#xff08;UE5&#xff09;中实现角色打击怪物并让怪物做出受击反应&#xff0c;你需要…

C++蓝桥杯基础篇(十一)

片头 嗨~小伙伴们&#xff0c;大家好&#xff01;今天我们来学习C蓝桥杯基础篇&#xff08;十一&#xff09;&#xff0c;学习类&#xff0c;结构体&#xff0c;指针相关知识&#xff0c;准备好了吗&#xff1f;咱们开始咯~ 一、类与结构体 类的定义&#xff1a;在C中&#x…

Leetcode 698-划分为k个相等的子集

给定一个整数数组 nums 和一个正整数 k&#xff0c;找出是否有可能把这个数组分成 k 个非空子集&#xff0c;其总和都相等。 示例 1&#xff1a; 输入&#xff1a; nums [4, 3, 2, 3, 5, 2, 1], k 4 输出&#xff1a; True 说明&#xff1a; 有可能将其分成 4 个子集&#…

Word 小黑第2套

对应大猫42 Word1 从文件中导入新样式 样式组 -管理样式 -导入导出 -关闭Normal文件 -打开文件 -修改文件 -选中所需 -复制 调整字符宽度 调整字符间距 -字体组 加宽 适当修改磅值 文字效果通过文字组修改 另起一页&#xff0c;分隔符&#xff08;布局 -分隔符 -分节符 -下一…

ctfshow做题笔记—栈溢出—pwn69~pwn72

目录 前言 一、pwn69(可以尝试用ORW读flag flag文件位置为/ctfshow_flag) 二、pwn70(可以开始你的个人秀了 flag文件位置为/flag) 三、pwn71(32位的ret2syscall) 四、pwn72 前言 学了一些新的东西&#xff0c;pwn69的文档忘保存了&#xff08;悲&#xff09;&#xff0c…

同盾v2 2025版 blackbox , wasm加解密,逆向协议算法生成,小盾安全

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; # 欢迎交流 wjxch1004

c++领域展开第十六幕——STL(vector容器的了解以及模拟实现、迭代器失效问题)超详细!!!!

文章目录 前言一、vector的介绍和使用1.1 vector的介绍1.2 vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector的空间增长问题1.2.4 vector的增删改查 二、vector在 oj 中的使用只出现一次的数删除有序数组中的重复项杨辉三角 总结 前言 在c专栏的上一篇…

ubuntu2404 安装 过程中 手动设置网络

ubuntu2404 安装 过程中 手动设置网络 https://blog.csdn.net/2401_83947353/article/details/138454379 6.1 可以直接Done&#xff08;不配置P&#xff09; 6.2 可以配置ip地址&#xff0c;选择manual 6.2.1 search domains填 6.2.2 search domains不填 6.3 更深层次的…

去北京的前端实习经历

趁现在对这部分还有深刻的感受记忆&#xff0c;赶紧记录下来。因为工作久了会发现真的对以前的事记不起来了。 公司&#xff1a; 北京的实习公司首先有学长学姐在&#xff0c;而且这个公司知名度还挺高的&#xff0c;但是工资比较低&#xff0c;3k左右吧&#xff0c;但是管2顿…

力扣热题 100:动态规划专题经典题解析

系列文章目录 力扣热题 100&#xff1a;哈希专题三道题详细解析(JAVA) 力扣热题 100&#xff1a;双指针专题四道题详细解析(JAVA) 力扣热题 100&#xff1a;滑动窗口专题两道题详细解析&#xff08;JAVA&#xff09; 力扣热题 100&#xff1a;子串专题三道题详细解析(JAVA) 力…

变量赋值汇编

一、核心概念 寄存器&#xff1a;CPU内部的高速存储单元&#xff08;如EAX、EBX、x86中的RAX、ARM中的R0等&#xff09; 内存地址&#xff1a;变量存储在内存中的位置&#xff08;如 0x1000&#xff09; 指令&#xff1a;操作寄存器和内存的命令&#xff08;如 MOV, STR, LDR…

页面白屏出现的原因

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&#…

【大模型统一集成项目】让 AI 聊天更丝滑:WebSocket 实现流式对话!

&#x1f31f; 在这系列文章中&#xff0c;我们将一起探索如何搭建一个支持大模型集成项目 NexLM 的开发过程&#xff0c;从 架构设计 到 代码实战&#xff0c;逐步搭建一个支持 多种大模型&#xff08;GPT-4、DeepSeek 等&#xff09; 的 一站式大模型集成与管理平台&#xff…

【2025】Electron Git Desktop 实战一(上)(架构及首页设计开发)

源代码仓库&#xff1a; Github仓库【electron_git】 Commit &#xff1a; bb40040 Github Desktop 页面分析 本节目标&#xff1a; 1、实现类似Github Desktop的「空仓库」提示页 2、添加本地仓库逻辑编写从 Github Desktop 我们看到 他的 主要页面分为三个区域 Head头部区域…

14 | fastgo 三层架构设计

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b; 在实现业务代码之前&#xff0c;还需要先设计一个合理的软件架构。一个好的软件架构不仅可以大大提高项目的迭代速度&#xff0c;还可以降低项目的阅读和维护难度。目前&#xff0c;行业中…

【机器学习-基础知识】统计和贝叶斯推断

1. 概率论基本概念回顾 1. 概率分布 定义: 概率分布(Probability Distribution)指的是随机变量所有可能取值及其对应概率的集合。它描述了一个随机变量可能取的所有值以及每个值被取到的概率。 对于离散型随机变量,使用概率质量函数来描述。对于连续型随机变量,使用概率…

面向对象Demo01

面向对象 什么是面向对象 回顾方法的定义 package oop; ​ import java.io.IOException; ​ public class Demo01 {public static void main(String[] args) {}//public String sayHello() {return "hello, world!";}public void sayHi() {return;}public int max(i…

C++设计模式-抽象工厂模式:从原理、适用场景、使用方法,常见问题和解决方案深度解析

一、模式基本概念 1.1 定义与核心思想 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是创建型设计模式的集大成者&#xff0c;它通过提供统一的接口来创建多个相互关联或依赖的对象族&#xff0c;而无需指定具体类。其核心思想体现在两个维度&#xff1a; …