Python构建本地化城市信息聚合器:多平台数据抓取与结构化分析实战

news2026/5/8 19:18:32
1. 项目概述一个本地化的城市信息聚合器最近在折腾一个挺有意思的小项目叫wangenius/downcity。乍一看这个名字可能有点摸不着头脑但它的核心想法其实非常直接帮你把特定城市比如“北京”、“上海”在主流社交媒体平台上的公开信息“下载”并聚合到本地形成一个可离线浏览、可快速检索的“城市信息快照”。这听起来是不是有点像给城市做一个定期的、可存档的“剪报”没错差不多就是这个意思。我自己在做本地生活研究、市场分析或者单纯想了解一个城市最近的热点话题时常常感到信息过于分散。微博的热搜、小红书的热门笔记、本地论坛的帖子……它们散落在各个App里时效性极强刷过去就没了想回头找或者做横向对比非常麻烦。downcity就是为了解决这个痛点而生的。它不是一个爬虫框架而是一个高度集成、开箱即用的工具链目标用户是像我这样的数据分析师、市场运营、社科研究者或者任何对城市动态有持续观察需求的个人。它的工作流程可以简单概括为你告诉它一个城市名例如“成都”和你想抓取的平台目前主要支持微博、小红书等配置好关键词可以是“美食”、“探店”、“citywalk”等它就能在后台自动运行将相关公开帖子、博文的内容、发布时间、互动数据等结构化信息抓取下来存储到本地的数据库或文件中。这样你就拥有了一个专属的、可按时间、热度、关键词查询的本地数据集。这个项目的价值在于它把“信息获取”这个动作从手动、实时、碎片化的浏览变成了自动、可回溯、结构化的积累为后续的分析提供了扎实的数据基础。2. 核心设计思路与技术选型2.1 为什么是“本地化”与“聚合”在构思downcity时我首先明确了两条核心原则本地化优先和平台聚合。这两点直接决定了项目的架构和技术选型。本地化优先意味着所有抓取的数据默认存储在用户自己的机器上。这不仅仅是出于数据隐私和安全的考虑毕竟谁也不希望自己的分析数据放在别人的服务器上更重要的是为了分析的自主性和灵活性。本地存储的数据你可以用任何你熟悉的工具Pandas, Excel, 甚至直接写SQL进行二次处理可以随时进行全量扫描也可以构建复杂的查询完全不受网络API调用次数、速率限制的困扰。为了实现这一点项目必须包含一个轻量级但可靠的数据持久层。平台聚合则是项目实用性的关键。单一平台的信息是片面的。一个城市的“网红”餐厅可能在微博被吐槽排队太久在小红书被赞美出片率高在本地论坛被讨论是否值得。downcity的目标就是把这些不同视角的信息拉到同一个平面上进行比较。这就要求项目必须设计一套抽象的数据模型能够容纳不同平台来源的数据同时又要为每个平台实现一套适配器来处理各自独特的反爬策略、页面结构和数据格式。基于这些思路技术栈的选择就清晰了编程语言选择了Python。原因无他生态丰富。网络请求有requests、aiohttpHTML解析有BeautifulSoup、lxml模拟浏览器有playwright、selenium数据处理有pandas数据库操作有SQLAlchemy几乎所有的需求都有成熟的轮子。这对于一个需要快速集成多平台抓取逻辑的项目来说是最高效的选择。数据存储为了平衡易用性和性能采用了SQLite作为默认的本地数据库。它无需安装服务器单个文件便于管理和迁移并且通过合理的索引设计完全可以应对百万级数据量的查询。项目使用SQLAlchemy ORM来定义数据模型这样既能保证代码的清晰度也方便未来切换其他数据库如PostgreSQL。爬取框架没有选用 Scrapy 这样的重型框架而是采用了“核心调度器 平台插件”的自定义架构。核心调度器负责任务队列、并发控制、错误重试和通用数据清洗每个平台如weibo_crawler,xiaohongshu_crawler作为一个独立的插件实现具体的页面请求、解析和数据提取逻辑。这种设计使得增加对新平台的支持变得非常模块化。2.2 关键架构组件解析downcity的架构可以分成四个相对独立又协同工作的层调度控制层这是项目的大脑。它接收用户通过配置文件或命令行传入的参数城市、关键词、时间范围、目标平台将这些参数转化为具体的抓取任务Task。每个任务包含了要访问的URL、需要携带的请求头如Cookie、User-Agent、以及解析回调函数。调度器会管理一个任务队列并控制并发爬虫的数量避免对目标网站造成过大压力同时也防止自己的IP被封锁。平台插件层这是项目的手和眼睛是与各个网站直接打交道的部分。每个插件都必须实现一套标准的接口比如generate_search_urls(keywords, city)用于根据关键词和城市生成搜索列表页URLparse_list_page(html)用于从列表页HTML中解析出详情页链接parse_detail_page(html)用于从详情页提取最终需要的结构化数据标题、正文、发布时间、点赞数、评论数等。由于各大平台都有反爬措施这里需要大量实战经验比如处理动态加载用playwright模拟滚动、破解加密参数、维护有效的Cookie池等。数据模型与存储层这是项目的记忆中枢。我设计了一个核心的Post数据表包含以下关键字段id (主键), platform (来源平台如 ‘weibo‘, ‘xiaohongshu‘), city (城市名), keyword (触发抓取的关键词), title (标题/内容摘要), content (正文全文或截断后文本), publish_time (发布时间), likes (点赞数), comments (评论数), reposts (转发数微博特有), url (原始链接), raw_data (原始JSON或HTML用于备份和深度挖掘), created_at (数据入库时间)使用ORM定义这个模型使得在代码中操作数据就像操作普通Python对象一样方便。存储层负责将插件层提取的数据清洗、去重后持久化到SQLite数据库中。用户接口层为了降低使用门槛项目提供了两种主要使用方式。一是通过编辑YAML配置文件用户可以像填表格一样设置抓取任务。二是通过命令行接口(CLI)对于熟练用户一行命令就能启动抓取。未来还可以考虑增加一个简单的Web UI用于查看抓取状态和预览数据。注意在设计和开发平台插件时必须严格遵守目标网站的robots.txt协议并设置合理的请求间隔如每次请求间随机休眠1-3秒。我们的目的是进行小规模的、用于个人研究的公开信息收集绝非恶意爬取或攻击。过快的请求频率不仅不道德也极易导致IP被封使整个工具失效。3. 实战部署与核心环节实现3.1 环境准备与初始化让我们从零开始手把手部署并使用一次downcity。假设我们的目标是抓取过去24小时内微博和小红书上关于“深圳”和“咖啡”的公开帖子。首先你需要一个Python环境3.8及以上版本。我强烈建议使用conda或venv创建独立的虚拟环境避免包依赖冲突。# 1. 克隆项目代码假设项目已开源在GitHub git clone https://github.com/wangenius/downcity.git cd downcity # 2. 创建并激活虚拟环境以venv为例 python -m venv venv # Windows: venv\Scripts\activate # Linux/Mac: source venv/bin/activate # 3. 安装依赖 pip install -r requirements.txtrequirements.txt文件里通常包含了核心依赖比如requests,beautifulsoup4,sqlalchemy,playwright等。如果项目使用了playwright来应对动态页面你还需要安装浏览器驱动playwright install chromium接下来是初始化项目配置。项目根目录下通常会有一个config.example.yaml文件将其复制为config.yaml并进行修改。# config.yaml database: path: ./data/city_data.db # 数据库文件存放路径 scheduler: max_workers: 3 # 并发爬虫数建议不要超过5 request_delay: 2 # 基础请求延迟秒数会在其基础上随机浮动 platforms: weibo: enabled: true # 这里可能需要配置Cookie。获取方式登录微博网页版后通过浏览器开发者工具获取。 # 注意Cookie是个人隐私凭证切勿泄露或上传至公开仓库。 cookies: 你的微博Cookie字符串 keywords: [深圳, 咖啡] max_pages_per_keyword: 10 # 每个关键词最多抓取多少页列表 xiaohongshu: enabled: true # 小红书可能需要更复杂的参数如token具体看插件实现要求 keywords: [深圳, 咖啡] max_pages_per_keyword: 15一个关键的实操心得关于Cookie的获取和管理。这是爬取社交媒体平台最棘手但绕不开的一环。以微博为例最稳妥的方式是手动登录网页版微博然后打开开发者工具F12切换到Network网络选项卡刷新页面找到任意一个对weibo.com的请求在Request Headers请求头里找到Cookie字段将其完整复制出来。这个Cookie通常有有效期过期后需要重新获取。在项目中你可以将Cookie字符串保存在本地的.env文件或系统环境变量中然后在配置文件中引用而不是明文写在config.yaml里这样更安全。3.2 运行抓取任务与数据入库配置好后运行抓取就非常简单了。项目通常会提供一个主入口脚本。# 方式一使用CLI命令如果项目实现了CLI python -m downcity.cli run --config config.yaml --city 深圳 # 方式二直接运行主脚本更常见 python main.py --config config.yaml运行后你会在控制台看到详细的日志输出例如[INFO] 开始调度任务: city深圳, platformweibo, keyword咖啡 [INFO] 爬虫-1 正在处理页面: https://s.weibo.com/weibo?q咖啡 深圳 [DEBUG] 从列表页解析到15条详情链接。 [INFO] 爬虫-2 正在抓取详情页: https://weibo.com/1234567890/xxx [SUCCESS] 数据入库成功: post_id1001, title‘深圳新开的这家咖啡馆绝了‘这个过程可能会持续几分钟到几十分钟取决于你设置的关键词数量和最大页数。所有被抓取到的数据都会实时存入你指定的SQLite数据库文件中。数据清洗的细节在数据入库前有一个重要的“清洗”步骤。不同平台的文本格式千奇百怪比如微博正文里会有很多“用户”、“#话题#”、表情符号小红书笔记里可能有各种贴纸标记。插件中的parse_detail_page函数在提取到原始文本后会调用一个公共的text_cleaner模块进行如下处理移除或标准化多余的空白字符换行、多个空格。处理或移除平台特定的元信息如“用户”可以保留为超链接文本但分析时可能只想要纯文本。提取正文中的核心文本过滤掉广告、推广等无关内容这通常需要基于一些关键词规则比较复杂。将发布时间字符串统一转换为ISO格式的日期时间对象便于后续按时间排序和筛选。3.3 数据的查询与初步分析抓取完成后数据静静地躺在./data/city_data.db里。怎么用呢项目可能会提供一个简单的查询脚本或者你可以直接用任何能连接SQLite的工具查看。使用项目内置工具查询# 查询深圳地区关于咖啡且点赞超过100的微博 python -m downcity.cli query --city 深圳 --platform weibo --keyword 咖啡 --min-likes 100直接使用SQLite命令行或图形化工具 打开DB Browser for SQLite或使用命令行sqlite3 ./data/city_data.db然后执行SQL查询例如-- 查看数据概览 SELECT platform, city, COUNT(*) as count FROM posts GROUP BY platform, city; -- 查找今天发布的包含‘探店’关键词的小红书笔记按点赞数降序排列 SELECT title, likes, comments, url FROM posts WHERE platform‘xiaohongshu‘ AND date(publish_time) date(‘now‘) AND content LIKE ‘%探店%‘ ORDER BY likes DESC LIMIT 10;使用Python进行更灵活的分析 这才是本地化数据的优势所在。你可以写一个简单的Python脚本用pandas进行数据分析。import sqlite3 import pandas as pd from datetime import datetime, timedelta # 连接数据库 conn sqlite3.connect(‘./data/city_data.db‘) # 读取最近7天的数据到DataFrame query “““ SELECT platform, city, keyword, title, content, publish_time, likes, comments FROM posts WHERE publish_time ? ”““ one_week_ago (datetime.now() - timedelta(days7)).strftime(‘%Y-%m-%d %H:%M:%S‘) df pd.read_sql_query(query, conn, params(one_week_ago,)) conn.close() # 现在你可以做任何分析 # 例如计算各平台的平均互动率 df[‘interaction_rate‘] (df[‘likes‘] df[‘comments‘]) # 简化计算 platform_stats df.groupby(‘platform‘)[‘interaction_rate‘].mean().sort_values(ascendingFalse) print(“各平台平均互动率“, platform_stats) # 找出深圳咖啡话题下互动最高的前5条内容 top_sz_coffee df[(df[‘city‘]‘深圳‘) (df[‘keyword‘]‘咖啡‘)].nlargest(5, ‘interaction_rate‘) print(top_sz_coffee[[‘platform‘, ‘title‘, ‘interaction_rate‘, ‘publish_time‘]])通过这样的分析你可以直观地看到哪个平台在特定话题下更活跃哪些内容更容易获得高互动从而获得数据驱动的洞察。4. 常见问题、反爬策略与优化技巧在实际运行downcity或类似的自研爬虫项目时你一定会遇到各种问题。下面是我踩过坑后总结的一些常见问题与解决方案。4.1 抓取失败与反爬虫应对问题1返回空数据或请求被重定向到登录页/验证码页。原因这是最典型的反爬手段。网站检测到你的请求头不像正常浏览器缺少User-Agent,Accept-Language等或者同一IP在短时间内请求过于频繁。解决方案完善请求头务必模拟一个真实浏览器的请求头。你可以从自己浏览器的开发者工具中复制完整的Headers特别是User-Agent。downcity的每个平台插件都应该内置一套或几套轮换的常用请求头。使用会话(Session)对于需要登录的平台如微博使用requests.Session()对象它会自动管理Cookie模拟一次会话内的连续操作。添加延迟与随机化在调度器中在两个请求之间强制加入随机延迟例如time.sleep(random.uniform(1, 3))。这能极大降低被识别为机器人的概率。处理Cookie与Token对于像小红书这样依赖复杂加密参数和Token的平台可能需要研究其网页或App的接口调用方式模拟其参数生成逻辑。这通常是最困难的部分需要逆向工程能力。终极方案模拟浏览器当上述方法都失效时使用playwright或selenium完全模拟浏览器操作。虽然速度慢、资源消耗大但成功率最高。downcity对小红书这类动态渲染严重的平台就采用了playwright方案。问题2抓取到的数据重复率高。原因不同关键词的搜索结果可能有重叠同一帖子在列表页不同位置出现。解决方案在数据入库前根据platform、原始url或内容MD5值进行去重。SQLAlchemy模型可以设置唯一性约束或者在插入前先查询是否存在。问题3数据库文件越来越大查询变慢。原因持续抓取会导致数据量线性增长。解决方案建立索引在经常用于查询的字段上建立索引如platform,city,keyword,publish_time。这能极大提升查询速度。数据分区/归档可以按时间如每月将旧数据迁移到单独的归档数据库文件中主库只保留最近的热数据。定期清理根据分析需求可以定期删除互动量极低如点赞、评论均为0的“僵尸”数据。4.2 性能与稳定性优化优化1异步并发抓取对于I/O密集型的网络爬虫同步请求会浪费大量时间在等待响应上。可以将核心的请求部分改造成异步使用asyncio和aiohttp。这能让你用少量的线程/协程同时发起数十个请求抓取效率成倍提升。downcity的调度器设计之初就考虑了这一点可以平滑切换到异步模式。优化2实现断点续抓长时间抓取任务可能因网络波动、程序异常而中断。一个健壮的系统应该支持断点续抓。实现思路是将每个抓取任务如“微博-深圳-咖啡-第5页”的状态待执行、执行中、已完成、失败持久化到数据库或文件中。程序启动时先加载所有“未完成”的任务继续执行。优化3日志与监控完善的日志系统是调试和运维的基石。使用Python的logging模块为不同组件设置不同日志级别DEBUG, INFO, WARNING, ERROR。将日志同时输出到控制台和文件便于事后排查问题。可以记录每个任务的开始结束时间、成功失败状态、抓取数据量等用于监控整体健康度。优化4配置化管理将所有可变的参数如数据库路径、请求延迟、各平台配置都放到配置文件如YAML中。这样无需修改代码就能调整行为也便于不同环境开发、生产的部署。4.3 法律与伦理边界这是一个必须严肃对待的话题。downcity作为一个工具其用途完全取决于使用者。仅抓取公开信息务必确保你抓取的是无需登录即可访问或在你已登录账户权限范围内的公开信息。切勿尝试破解权限、访问非公开数据。尊重robots.txt在抓取前检查目标网站的robots.txt文件如https://weibo.com/robots.txt遵守其中关于爬虫禁区的规定。控制抓取频率以不对目标网站服务器造成明显压力为准则。我们的目的是收集数据不是攻击网站。数据用途将抓取的数据用于个人研究、学习、分析是合理的。但严禁用于商业售卖、 spam、骚扰用户或其他任何非法用途。版权与隐私虽然抓取的是公开帖子但内容版权仍属于原作者。在公开发布任何基于这些数据的报告或结论时应进行匿名化聚合处理避免直接暴露用户个人身份信息。开发和使用这类工具始终要怀有敬畏之心在技术探索与合规合法之间找到平衡点。downcity项目本身提供了实现这些功能的基础框架但最终如何合规地使用它是每个使用者需要自己承担的责任。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…