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

Selenium与Pandas实战:动态网页数据爬取与金融数据处理

1. 项目概述与价值解析

看到“Selenium+Pandas实战:5分钟搞定新浪财经资产负债表爬取”这个标题,很多做数据分析、金融研究或者刚入门Python爬虫的朋友眼睛肯定会一亮。新浪财经作为国内权威的金融数据源之一,其上市公司财报数据是许多量化分析、基本面研究不可或缺的原材料。但手动一个个去复制粘贴?那简直是噩梦,效率低还容易出错。直接请求接口?对于动态渲染的复杂页面,尤其是像新浪财经这样经过反爬处理的站点,单纯的requests库常常会吃闭门羹,返回一堆看不懂的JavaScript代码,根本拿不到我们想要的表格数据。

这正是Selenium大显身手的地方。它不是一个简单的HTTP请求库,而是一个浏览器自动化工具。你可以把它理解为一个“机器人程序员”,它能按照你的指令,真实地打开一个浏览器(比如Chrome),像真人一样点击、输入、滚动页面,等到页面完全加载、所有数据都渲染出来后,再去抓取我们看到的最终内容。这就完美绕开了前端JavaScript动态加载数据的反爬机制。而Pandas,则是数据处理和分析的“瑞士军刀”,它最擅长的就是把网页上抓取到的杂乱表格,瞬间变成整洁、结构化的DataFrame,方便我们进行后续的清洗、分析和保存。

所以,这个项目的核心价值在于:提供一套稳定、可复现的自动化方案,将新浪财经上结构复杂的资产负债表,从网页变成结构化的数据(如CSV或Excel文件)。无论是想批量分析多家公司多年的财务趋势,还是构建自己的初级财务数据库,这个技能都极其实用。接下来,我就以一个实际爬取“贵州茅台”资产负债表的过程为例,带你一步步拆解,并分享我趟过的坑和总结的技巧。

2. 环境准备与核心工具选型

工欲善其事,必先利其器。这个项目对环境的要求非常明确,我们需要搭建一个能让Selenium驱动浏览器、并用Pandas处理数据的Python环境。

2.1 Python与库安装

首先,确保你安装了Python(3.7及以上版本均可)。然后,通过pip安装核心库:

pip install selenium pandas
  • Selenium:本项目的主力爬取工具。注意,安装selenium库只是安装了控制浏览器的Python接口,我们还需要一个具体的“浏览器驱动程序”。
  • Pandas:数据处理核心,用于将爬取的HTML表格转换为DataFrame并输出。

这里有个常见的坑:网络问题导致的安装缓慢或失败。你可以尝试使用国内的镜像源来加速,例如:

pip install selenium pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

2.2 浏览器驱动配置

这是Selenium项目中最关键也最容易出问题的一步。Selenium需要通过一个驱动程序(如chromedriver)来与实际的Chrome浏览器通信。

  1. 查看Chrome浏览器版本:打开Chrome,点击右上角三个点 -> 帮助 -> 关于Google Chrome,记下版本号(例如:124.0.6367.91)。
  2. 下载对应版本的ChromeDriver
    • 访问ChromeDriver官方下载站或国内镜像站。
    • 关键点:驱动版本必须与你的Chrome浏览器主版本号完全一致(例如都是124)。如果版本不匹配,Selenium很可能无法启动浏览器或运行时报错。
  3. 放置驱动并配置路径:下载后,你会得到一个可执行文件(Windows是chromedriver.exe)。你有两种方式让Python找到它:
    • 方法A(推荐,简单):将chromedriver.exe文件直接放在你的Python脚本所在的同一个目录下。
    • 方法B(一劳永逸):将chromedriver.exe所在目录添加到系统的环境变量PATH中。

注意:对于macOS或Linux系统,步骤类似,但驱动文件不同,且可能需要通过终端赋予执行权限(chmod +x chromedriver)。

2.3 可选工具:IDE与调试技巧

我强烈建议使用PyCharm、VSCode等集成开发环境(IDE)。它们的好处在于:

  • 代码提示:输入selenium.pd.时,会自动提示方法,减少记忆负担和拼写错误。
  • 调试功能:可以设置断点,逐步执行代码,查看每一步浏览器状态和数据变化,这对于排查复杂的页面元素定位问题至关重要。
  • 变量查看:在调试过程中,可以直观地看到DataFrame里到底抓到了什么数据。

3. 爬虫核心思路与网页结构分析

在写代码之前,我们必须先搞清楚目标网页是怎么工作的,数据藏在哪里。盲目动手只会事倍功半。

3.1 目标页面分析与数据定位

我们以“贵州茅台(600519)”的资产负债表为例。其URL模式通常为:https://vip.stock.finance.sina.com.cn/corp/go.php/vFD_BalanceSheet/stockid/600519/ctrl/part/displaytype/4.phtml

打开这个页面,按F12进入开发者工具。我们需要找到资产负债表对应的HTML表格。

  1. 使用元素选择工具:点击开发者工具左上角箭头图标(或按Ctrl+Shift+C),然后去页面上点击资产负债表的数据区域。
  2. 定位表格元素:开发者工具会自动跳转到对应的HTML代码。通常,财务数据表格会被放在一个<table>标签内,并且会有一个唯一的id或具有辨识度的class。经过检查,新浪财经的资产负债表数据通常在一个id="BalanceSheetNewTable0"<div>容器内,里面包含了多个<table>。我们需要的是包含具体数据(如货币资金、应收账款)的那个主表。
  3. 分析表格结构:找到<table>后,展开它,观察其结构。通常,<thead>里是表头(年份/季度),<tbody>里是各行财务科目和数据。我们的任务就是用Selenium找到这个<table>,然后用Pandas的read_html函数直接把它“读”进来。

3.2 Selenium爬取动态页面的逻辑

为什么不用简单的requests.get()?我们可以在开发者工具的“Network”选项卡中验证。刷新页面,查看“Doc”或XHR类型的请求,你会发现页面初始加载的HTML并不包含表格数据,数据是随后通过JavaScript异步请求加载的。requests只能拿到最初的“空壳”HTML。

Selenium的方案是:

  1. 用WebDriver启动一个真实的Chrome浏览器。
  2. 导航到目标URL。
  3. 等待。这是最关键的一步!等待JavaScript执行完毕,数据表格被动态填充到页面DOM中。
  4. 此时,页面内容与人工肉眼看到的完全一致。我们再使用find_element等方法定位到那个已经充满数据的<table>元素。
  5. 提取该元素的outerHTML(即完整的HTML代码),交给Pandas处理。

这个“等待”的步骤,是Selenium爬虫稳定性的生命线。接下来我们会详细讲如何科学地等待。

4. 代码实战:从零到一爬取数据

理论说得再多,不如一行代码。下面我们分步实现整个爬取流程,并对每一行关键代码进行解读。

4.1 初始化浏览器驱动与页面访问

from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd import time # 1. 初始化浏览器选项(可选,用于优化) options = webdriver.ChromeOptions() # 可选:无头模式,不显示浏览器界面,节省资源 # options.add_argument('--headless') # 可选:禁用GPU加速,避免一些潜在问题 options.add_argument('--disable-gpu') # 可选:禁用沙盒,在某些Linux环境下可能需要 options.add_argument('--no-sandbox') # 2. 启动浏览器 # 如果chromedriver在当前目录,直接写‘chromedriver’或‘chromedriver.exe’ driver = webdriver.Chrome(options=options) # 3. 设置隐式等待(全局等待元素出现的最大时间) driver.implicitly_wait(10) # 单位:秒 # 4. 访问目标页面 url = 'https://vip.stock.finance.sina.com.cn/corp/go.php/vFD_BalanceSheet/stockid/600519/ctrl/part/displaytype/4.phtml' driver.get(url) print("页面加载完成,当前标题:", driver.title)

代码解读与注意事项

  • ChromeOptions():用于添加浏览器启动参数。--headless在服务器运行时非常有用,但调试时建议关闭,以便观察页面加载过程。
  • implicitly_wait(10):设置隐式等待。这行代码告诉WebDriver,在查找任何元素时,如果元素没有立即出现,最多等待10秒。这是一个全局的、兜底性质的等待。
  • driver.get(url):浏览器导航到目标网址。此时浏览器开始加载,但数据可能还没出来。

4.2 显式等待与目标表格定位

隐式等待不够精确,我们需要更智能的“显式等待”,即等待某个特定条件成立。

# 5. 显式等待,直到资产负债表数据表格容器出现 # 这里使用ID定位,新浪财经资产负债表数据的容器id通常是固定的 try: # 等待最多20秒,直到ID为‘BalanceSheetNewTable0’的元素出现在DOM中 table_container = WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.ID, "BalanceSheetNewTable0")) ) print("成功找到资产负债表数据容器") # 6. 在容器内寻找具体的表格(table)元素 # 通过CSS选择器,在容器内找第一个table标签 data_table = table_container.find_element(By.CSS_SELECTOR, "table") # 7. 获取表格的HTML源码 table_html = data_table.get_attribute("outerHTML") except Exception as e: print("在等待或查找表格时出现错误:", e) # 可以在这里截屏,帮助调试 driver.save_screenshot('error_screenshot.png') driver.quit() exit()

代码解读与注意事项

  • WebDriverWait(driver, 20).until(...):这是显式等待的标准写法。它比隐式等待更精确,只针对EC.presence_of_element_located这个条件(即元素出现在页面DOM中)进行等待,最多等20秒。条件成立则立即继续,不成立则超时抛异常。
  • By.IDBy.CSS_SELECTOR:这是Selenium定位元素的两种常用方式。ID应该是唯一的,最快最准。CSS选择器非常灵活,“table”表示选择所有<table>标签,“.class-name”表示选择特定class的元素。
  • get_attribute(“outerHTML”):这是关键操作!它获取的是该<table>元素完整的HTML字符串,包括其自身的标签和内部所有子标签(<tr>,<td>等),这正是Pandasread_html所需要的原料。
  • 异常处理:用try...except包裹可能出错的代码是好习惯。一旦超时或找不到元素,程序不会崩溃,而是打印错误并截屏(save_screenshot),这能极大提升调试效率。截图文件会保存在脚本同级目录。

4.3 使用Pandas解析HTML并保存数据

拿到table_html后,剩下的就是Pandas的表演时间了。

# 8. 使用Pandas的read_html函数解析HTML表格 # read_html会返回一个DataFrame的列表,因为一个页面可能有多个表格 df_list = pd.read_html(table_html, encoding='utf-8', flavor='html5lib') # 通常,我们需要的资产负债表是列表中的第一个DataFrame if df_list: df = df_list[0] # 取第一个表格 print(f"成功解析表格,形状为:{df.shape}") # 打印行列数 # 9. 查看前几行数据,确认爬取正确 print("\n表格前5行预览:") print(df.head()) # 10. 数据清洗(根据实际情况调整) # 新浪财经的表格通常第一行是空行或标题行,第二行才是表头(年份) # 我们需要设置正确的表头 # 假设原DataFrame第0行是中文科目,第1行是年份 df.columns = df.iloc[1] # 将第1行的值(年份)设置为列名 df = df[2:] # 删除前两行(旧表头和年份行) df = df.reset_index(drop=True) # 重置索引 df.iloc[:, 0] = df.iloc[:, 0].ffill() # 第一列(科目)可能有合并单元格,向前填充 print("\n清洗后表格前5行预览:") print(df.head()) # 11. 保存数据到CSV文件 output_filename = '贵州茅台_资产负债表.csv' df.to_csv(output_filename, index=False, encoding='utf-8-sig') # utf-8-sig解决Excel中文乱码 print(f"\n数据已成功保存到:{output_filename}") else: print("未从HTML中解析出任何表格。")

代码解读与注意事项

  • pd.read_html():这是一个神器,它专门用于从HTML字符串或URL中抓取<table>标签并自动转换为DataFrame列表。参数flavor=’html5lib’指定了解析器,它对不规范的HTML容错性更好。
  • 数据清洗是重头戏:直接解析出来的DataFrame往往很乱。你需要根据网页表格的实际结构进行调整。常见的操作包括:
    • df.iloc[]:基于位置的索引,用于选取特定的行或列。
    • df.columns = ...:重新指定列名。
    • df.reset_index(drop=True):重置行索引,drop=True表示不保留旧的索引列。
    • df.ffill():向前填充,用于处理合并单元格导致的NaN值(比如“流动资产”下面有多个子科目,但“流动资产”只出现在第一行)。
  • to_csv(…, encoding=’utf-8-sig’):保存为CSV。utf-8-sig编码会在文件开头添加一个BOM标记,让Windows系统的Excel正确识别中文,避免乱码。index=False表示不保存行索引。

4.4 完整代码整合与优雅退出

最后,我们把所有步骤整合起来,并确保浏览器被正确关闭。

# 整合后的完整示例代码框架 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd def fetch_financial_statement(stock_code): options = webdriver.ChromeOptions() # options.add_argument('--headless') driver = webdriver.Chrome(options=options) driver.implicitly_wait(10) try: url = f'https://vip.stock.finance.sina.com.cn/corp/go.php/vFD_BalanceSheet/stockid/{stock_code}/ctrl/part/displaytype/4.phtml' driver.get(url) # 等待并定位表格 table_container = WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.ID, "BalanceSheetNewTable0")) ) data_table = table_container.find_element(By.CSS_SELECTOR, "table") table_html = data_table.get_attribute("outerHTML") # 解析数据 df_list = pd.read_html(table_html, flavor='html5lib') if not df_list: print("未找到表格数据。") return None df = df_list[0] # --- 这里插入上述数据清洗步骤 --- # 设置列名、清理行等 df.columns = df.iloc[1] df = df[2:].reset_index(drop=True) df.iloc[:, 0] = df.iloc[:, 0].ffill() # --- 清洗结束 --- # 保存 filename = f'{stock_code}_资产负债表.csv' df.to_csv(filename, index=False, encoding='utf-8-sig') print(f"数据已保存至 {filename}") return df except Exception as e: print(f"爬取过程中发生错误:{e}") driver.save_screenshot(f'error_{stock_code}.png') return None finally: # 无论成功与否,最后都关闭浏览器 driver.quit() # 调用函数 if __name__ == "__main__": df_result = fetch_financial_statement('600519') # 爬取贵州茅台 if df_result is not None: print(df_result.head())

代码解读与注意事项

  • 函数化:将流程封装成函数fetch_financial_statement,传入股票代码即可,提高了代码的复用性。
  • 健壮性:使用了try...except...finally结构。finally块里的driver.quit()确保无论爬取成功还是中途出错,浏览器都会被关闭,释放系统资源。这是一个非常重要的好习惯,避免留下无用的浏览器进程。
  • 通用性:通过字符串格式化(f-string)动态生成URL和文件名,使得这个函数可以轻松用于爬取其他公司的数据,只需改变stock_code参数。

5. 反爬应对策略与稳定性优化

新浪财经这类网站肯定有反爬机制。直接运行上述脚本可能一开始成功,但频繁访问后就会遇到问题。以下是我总结的几种应对策略,按推荐顺序排列:

5.1 基础策略:添加等待与随机延迟

这是最有效且必须遵守的礼仪。

  • 显式等待:如前所述,必须用WebDriverWait等待目标元素,而不是用time.sleep(固定秒数)。这既是稳定性需要,也减少了不必要的等待时间。
  • 操作间延迟:在连续进行多个页面操作(如爬取多家公司)时,在每次driver.get()或关键操作后,添加一个随机延时,模拟人类阅读时间。
    import random time.sleep(random.uniform(2, 5)) # 等待2到5秒之间的一个随机时间

5.2 中级策略:修改浏览器特征与使用代理

  • 禁用自动化特征:新版Chrome可以通过options.add_experimental_option(“excludeSwitches”, [“enable-automation”])options.add_argument(‘–disable-blink-features=AutomationControlled’)来隐藏“Chrome正受到自动测试软件控制”的提示,但网站仍可能通过其他特征检测。
  • 使用用户代理(User-Agent):可以随机切换不同的UA,但Selenium的UA特征比较明显,高级反爬能识别。
  • 代理IP:如果IP被封锁,需要考虑使用代理池。Selenium可以通过options.add_argument(‘–proxy-server=http://ip:port’)来设置代理。但免费代理质量不稳定,商业代理需要成本。

5.3 高级策略:降级到无头模式与终极方案

  • 谨慎使用无头模式–headless模式下的浏览器指纹与普通模式有差异,更容易被一些反爬服务识别。在调试稳定后,如果确实需要无头模式,可以考虑配合更复杂的参数来掩盖。
  • 终极方案:检测到验证码时手动干预:对于登录验证码或滑动验证码,一个务实的方案是:当脚本检测到出现验证码页面时(可以通过判断特定元素是否存在),自动暂停,并提示用户进行手动验证。验证完成后,脚本再继续执行。这虽然不够全自动,但在对抗强反爬时是最可靠的方法。实现思路是使用while循环和input()函数等待用户确认。

重要心得:对于新浪财经这类非公开API的数据源,我们的爬虫策略应该定位为“低频、间歇性的数据采集”,用于个人学习或研究。避免在短时间内发起海量请求,这是对数据源的尊重,也是保证自己IP不被封禁的最有效方法。如果需要商业级、高频的数据,建议寻找付费的金融数据API服务。

6. 常见问题排查与实战技巧

即使代码看起来完美,实际运行中还是会遇到各种“坑”。这里记录了几个最常见的问题和我的解决方法。

6.1 元素定位失败(NoSuchElementException)

这是最常遇到的错误,意思是Selenium在当前页面找不到你指定的元素。

  • 可能原因1:页面未加载完成
    • 解决:确保使用了WebDriverWait进行显式等待,而不是time.sleep或只靠隐式等待。检查你等待的条件是否正确,有时需要等待元素可点击(EC.element_to_be_clickable)而不仅仅是存在。
  • 可能原因2:元素在iframe或shadow DOM内
    • 解决:如果表格被包裹在<iframe>里,你需要先切换进iframe上下文:driver.switch_to.frame(“iframe_name_or_id”),操作完再切回来driver.switch_to.default_content()。新浪财经的表格一般不在iframe里,但其他网站需要注意。
  • 可能原因3:元素选择器写错了
    • 解决:使用浏览器开发者工具,反复检查元素的ID、Class或XPath是否准确。XPath容易因页面微调而失效,优先使用ID和CSS选择器。

6.2 Pandas读取表格为空或错乱

pd.read_html返回空列表或DataFrame结构奇怪。

  • 可能原因1:传递给read_html的HTML不对
    • 解决:在获取table_html后,可以先将其写入一个临时HTML文件查看:with open(‘debug.html’, ‘w’, encoding=’utf-8’) as f: f.write(table_html)。用浏览器打开这个文件,看里面是否包含完整的表格。如果不包含,说明Selenium定位的<table>不对。
  • 可能原因2:表格结构过于复杂,read_html默认解析器无法识别
    • 解决:尝试更换flavor参数。flavor=’lxml’速度更快,flavor=’html5lib’容错性更好。如果都不行,可以考虑直接用Selenium遍历<tr><td>标签手动解析,虽然麻烦但最可控。

6.3 浏览器被检测为自动化工具

控制台出现“Chrome正受到自动测试软件控制”的提示,或者页面内容异常。

  • 可能原因:网站检测到了WebDriver的特征。
  • 解决
    1. 添加之前提到的实验性选项来排除开关。
    2. 尝试使用undetected-chromedriver这类第三方库,它能更好地隐藏自动化特征(注意:需额外安装pip install undetected-chromedriver,并使用其Chrome类替代原生的)。
    3. 终极方案:如果只是偶尔爬取,遇到验证码时,采用上述“手动干预”策略。

6.4 数据清洗中的合并单元格问题

财务表格中,像“流动资产合计”这样的父科目,其子科目(货币资金、应收账款等)在“科目”这一列是空的,这给分析带来了麻烦。

  • 解决:我们已经在代码中使用了df.iloc[:, 0].ffill()来向前填充第一列。这意味着,将父科目的名称向下填充,直到遇到下一个非空单元格。这样,每一行数据都有其所属的完整科目路径。这是处理财务数据表格的一个非常实用的技巧。

7. 项目扩展与进阶思路

掌握了基础爬取后,你可以将这个项目扩展得更加强大和实用。

7.1 批量爬取多家公司多年数据

核心是构建一个股票代码列表,并循环调用我们的爬取函数。关键点在于控制请求频率,避免被封

stock_list = ['600519', '000858', '000333'] # 茅台,五粮液,美的 for code in stock_list: print(f"正在爬取股票 {code}...") fetch_financial_statement(code) # 每次爬取后随机休眠较长时间 time.sleep(random.uniform(10, 20))

7.2 整合利润表与现金流量表

新浪财经的利润表和现金流量表页面结构类似,只是URL路径不同。你可以抽象出一个通用的爬取函数,通过参数控制报表类型。

def fetch_sina_financial_sheet(stock_code, sheet_type): # sheet_type: 'BalanceSheet'(资产负债表), 'ProfitStatement'(利润表), 'CashFlow'(现金流量表) url_template = f'https://vip.stock.finance.sina.com.cn/corp/go.php/vFD_{sheet_type}/stockid/{stock_code}/ctrl/part/displaytype/4.phtml' # ... 后续爬取和解析逻辑与之前类似,但需要注意不同报表的表格id或结构可能微调 # 需要你手动去分析一下对应页面的HTML结构

7.3 数据自动化分析与可视化

数据爬取下来后,Pandas的舞台才真正开始。你可以:

  • 数据合并:使用pd.concat将多年、多公司的数据合并成一个大的DataFrame
  • 计算财务比率:如资产负债率、流动比率、毛利率等,Pandas的向量化运算让这变得非常简单。
  • 可视化:结合MatplotlibSeaborn库,轻松绘制出资产趋势图、利润构成图等。
  • 定时任务:使用Windows的任务计划程序或Linux的cron,将爬虫脚本设置为每周或每月自动运行,实现数据的自动更新。

这个从爬取到分析的全流程,正是数据科学在金融领域的一个典型微缩应用。通过这个项目,你不仅学会了Selenium和Pandas的基本操作,更重要的是掌握了解决“动态网页数据获取”这一真实问题的完整思路和方法论。在实际操作中,耐心调试、仔细分析页面结构、编写健壮的异常处理代码,这些经验远比记住几个API调用更有价值。

http://www.cnnetsun.cn/news/3443787.html

相关文章:

  • VS Code R即时预览插件:告别Ctrl+Enter,实现毫秒级反馈
  • Windows系统优化全攻略:从卡顿根源到提速方案
  • SD NAND如何优化嵌入式存储方案
  • Linux C语言手搓消息队列:共享内存+信号量实现进程通信
  • C++实现神经元模拟:从M-P模型到逻辑门构建的底层原理与实践
  • VC++深入详解:经典Windows桌面开发教程与示例代码实践指南
  • Windows顽固软件图标删除全攻略
  • C++ STL vector底层原理与模拟实现:从内存管理到迭代器失效
  • Typst + VSCode 排版环境搭建:面向中文写作的现代排版工作流
  • CDD文件制作指南:基于CANdelaStudio的汽车诊断配置实践
  • C++无锁生产者-消费者队列实战:从SPSC到MPSC的原理与实现
  • 2026年酒店智能屏行业现状与三大应用场景解析
  • FPGA按键消抖原理与状态机实现详解
  • Day15 --【Java全栈】面向对象编程[3]继承
  • 百度输入法Linux版深度适配统信UOS技术解析
  • Python数据科学核心工具链与实战技巧详解
  • 华为MetaERP 跨OU的供应商地点与库存组织映射是P2P多OU架构设计的核心难点之一。Oracle EBS原生并未提供直接的“供应商地点→库存组织”映射表,这需要在扩展层自行设计。下面给出经过生产
  • Action Token设计:VLA模型与物理世界的神经接口
  • 世界行动模型WAM与VLA范式对比:泛化能力的四个刚性维度
  • AI模型训练全流程实战:从数据准备到生产部署
  • C++字符串分割六种方法详解:从基础实现到性能优化实战
  • AI辅助3D建模:Claude与Blender MCP插件实战指南
  • 《考研408数据结构》第六章(6.4 图的应用)复习笔记
  • UOS操作系统网络测试与端口连通性实战指南
  • Ubuntu系统清理:彻底卸载软件包的实用指南
  • 中间件的“价值重估”:传统同质化竞争终结,AI智能编排时代开启
  • WMIC:Windows系统管理的命令行利器与实战技巧
  • TRAE+Milvus+MCP:中文开发者零门槛向量数据库实战指南
  • Cesium 绘制图形并导出geojson教程
  • WorldVLN:自回归世界动作模型实现真实无人机零样本导航