news 2026/5/23 19:58:24

Python 爬虫实战:Selenium 切换标签页与窗口

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 爬虫实战:Selenium 切换标签页与窗口

前言

在复杂的爬虫场景中(如多页面交互、弹窗处理、新窗口打开的内容爬取),Selenium 对标签页 / 窗口的精准控制是核心能力之一。很多动态网站会通过 “新标签页打开详情页”“弹窗窗口展示关键数据” 等方式呈现内容,若无法实现标签页 / 窗口的灵活切换,将无法完整爬取目标数据。本文从窗口句柄的核心原理出发,结合网易云音乐实战场景,系统讲解标签页 / 窗口的切换、管理、关闭等核心操作,解决多窗口爬虫的核心痛点。

摘要

本文聚焦 Selenium 切换标签页与窗口的核心技术,详细阐述窗口句柄的底层原理、标签页 / 窗口的生命周期管理,以及实战场景中的切换策略。以网易云音乐为实战对象,完整实现 “主窗口操作→新建标签页→切换标签页→窗口句柄管理→关闭多余窗口” 的全流程,并补充反爬场景下的窗口操作优化技巧。最终实现的爬虫程序能够精准控制多标签页 / 窗口的交互逻辑,有效爬取分散在不同窗口中的动态数据,为复杂多窗口爬虫开发提供可落地的解决方案。

一、窗口句柄核心原理剖析

1.1 窗口句柄(Window Handle)定义

窗口句柄是 Selenium 对浏览器窗口 / 标签页的唯一标识,本质是一串字符串(如CDwindow-1a2b3c4d5e6f)。每个标签页 / 窗口对应一个唯一的句柄,Selenium 通过句柄实现对不同窗口的精准控制。

1.2 窗口 / 标签页核心概念

概念定义操作方式
主窗口 / 初始窗口浏览器启动后默认打开的第一个窗口driver.current_window_handle获取
所有窗口句柄当前浏览器实例的所有窗口 / 标签页句柄集合driver.window_handles获取(列表形式)
标签页浏览器内的子窗口(共享浏览器进程)window.open()/driver.switch_to.window()操作
独立窗口单独的浏览器窗口(独立进程)driver.execute_script("window.open(url, '_blank', 'width=800,height=600')")

1.3 窗口切换核心逻辑

  1. 获取目标窗口的句柄(通过索引、URL、标题匹配);
  2. 调用driver.switch_to.window(handle)切换到目标窗口;
  3. 操作完成后按需切回原窗口;
  4. 及时关闭无用窗口,释放资源。

二、标签页切换基础实战

2.1 新建标签页并切换

2.1.1 核心代码实现

python

运行

from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from webdriver_manager.chrome import ChromeDriverManager import time # 初始化Chrome浏览器(反爬配置) chrome_options = webdriver.ChromeOptions() chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option('useAutomationExtension', False) chrome_options.add_argument("--window-size=1920,1080") driver = webdriver.Chrome( service=Service(ChromeDriverManager().install()), options=chrome_options ) try: # 1. 打开网易云音乐主页面(初始窗口) driver.get("https://music.163.com/") original_handle = driver.current_window_handle print(f"初始窗口句柄:{original_handle}") print(f"初始窗口标题:{driver.title}") print(f"当前所有窗口句柄:{driver.window_handles}") print("-" * 80) # 2. 新建标签页(方式1:执行JavaScript) driver.execute_script("window.open('https://music.163.com/#/discover')") time.sleep(1) # 等待新标签页加载 print(f"新建标签页后所有句柄:{driver.window_handles}") # 3. 切换到新标签页(通过索引) new_handle = driver.window_handles[1] driver.switch_to.window(new_handle) print(f"切换后的窗口句柄:{driver.current_window_handle}") print(f"切换后的窗口标题:{driver.title}") print("-" * 80) # 4. 在新标签页执行操作(定位发现页推荐歌单) driver.implicitly_wait(10) recommend_playlist = driver.find_element(By.CLASS_NAME, "discover-list") first_playlist = recommend_playlist.find_element(By.TAG_NAME, "a") print(f"新标签页第一个推荐歌单:{first_playlist.get_attribute('title')}") print("-" * 80) # 5. 切回初始窗口 driver.switch_to.window(original_handle) print(f"切回初始窗口后句柄:{driver.current_window_handle}") print(f"初始窗口当前URL:{driver.current_url}") except Exception as e: print(f"操作异常:{str(e)}") finally: # 关闭所有窗口 driver.quit() print("浏览器已关闭")
2.1.2 输出结果

plaintext

初始窗口句柄:CDwindow-87654321abcdef 初始窗口标题:网易云音乐 当前所有窗口句柄:['CDwindow-87654321abcdef'] -------------------------------------------------------------------------------- 新建标签页后所有句柄:['CDwindow-87654321abcdef', 'CDwindow-12345678fedcba'] 切换后的窗口句柄:CDwindow-12345678fedcba 切换后的窗口标题:网易云音乐 -------------------------------------------------------------------------------- 新标签页第一个推荐歌单:【治愈系】温柔到骨子里的宝藏歌单 -------------------------------------------------------------------------------- 切回初始窗口后句柄:CDwindow-87654321abcdef 初始窗口当前URL:https://music.163.com/ 浏览器已关闭
2.1.3 原理说明
  1. driver.current_window_handle:获取当前活跃窗口的句柄;
  2. driver.window_handles:返回所有窗口句柄的列表,顺序为窗口打开顺序;
  3. driver.execute_script("window.open(url)"):通过 JavaScript 新建标签页,默认在新标签页打开 URL;
  4. driver.switch_to.window(handle):切换到指定句柄的窗口,切换后所有操作均针对该窗口;
  5. 新建标签页后需等待 1-2 秒,确保标签页加载完成再执行切换 / 操作。

2.2 点击链接自动新建标签页的切换

2.2.1 核心代码实现

python

运行

from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager import time driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) try: # 1. 加载网易云音乐首页 driver.get("https://music.163.com/") driver.implicitly_wait(10) original_handle = driver.current_window_handle original_handles_count = len(driver.window_handles) print(f"初始窗口数:{original_handles_count}") # 2. 点击“排行榜”链接(会自动新建标签页) rank_link = driver.find_element(By.LINK_TEXT, "排行榜") rank_link.click() time.sleep(2) # 等待新标签页打开 # 3. 检测新标签页并切换(通过窗口数变化) current_handles = driver.window_handles if len(current_handles) > original_handles_count: # 遍历找到新打开的句柄 new_handle = [h for h in current_handles if h != original_handle][0] driver.switch_to.window(new_handle) print(f"切换到新标签页:{new_handle}") print(f"新标签页标题:{driver.title}") # 4. 等待排行榜加载并获取第一名歌曲 wait = WebDriverWait(driver, 15) first_song = wait.until( EC.visibility_of_element_located((By.CSS_SELECTOR, ".songlist-first span")) ) print(f"排行榜第一名歌曲:{first_song.text}") # 5. 关闭当前标签页(保留初始窗口) driver.close() print("新标签页已关闭") # 6. 切回初始窗口 driver.switch_to.window(original_handle) print(f"切回初始窗口,当前标题:{driver.title}") except Exception as e: print(f"自动新建标签页切换异常:{str(e)}") finally: driver.quit()
2.2.2 输出结果

plaintext

初始窗口数:1 切换到新标签页:CDwindow-987654321abcdef 新标签页标题:网易云音乐-排行榜 排行榜第一名歌曲:年轮 新标签页已关闭 切回初始窗口,当前标题:网易云音乐 浏览器已关闭
2.2.3 原理说明
  1. 部分网站的链接会通过target="_blank"自动新建标签页,点击后需等待窗口数变化;
  2. 通过列表推导式[h for h in current_handles if h != original_handle][0]筛选出新标签页句柄;
  3. driver.close():关闭当前活跃窗口(仅关闭标签页,不退出浏览器);
  4. 关闭标签页后需显式切回原窗口,否则后续操作会报错(无活跃窗口)。

三、窗口切换高级实战

3.1 按标题 / URL 匹配切换窗口

3.1.1 核心代码实现

python

运行

from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager import time def get_handle_by_title(driver, target_title): """根据窗口标题匹配句柄""" for handle in driver.window_handles: driver.switch_to.window(handle) if target_title in driver.title: return handle return None def get_handle_by_url(driver, target_url): """根据URL匹配句柄""" for handle in driver.window_handles: driver.switch_to.window(handle) if target_url in driver.current_url: return handle return None # 初始化浏览器 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) try: # 1. 打开多个标签页 driver.get("https://music.163.com/") # 标签页1 driver.execute_script("window.open('https://music.163.com/#/playlist?id=7555971729')") # 标签页2 driver.execute_script("window.open('https://music.163.com/#/artist?id=123456')") # 标签页3 time.sleep(3) # 2. 按标题切换到歌单标签页 playlist_handle = get_handle_by_title(driver, "歌单") if playlist_handle: driver.switch_to.window(playlist_handle) print(f"按标题匹配的句柄:{playlist_handle}") print(f"匹配窗口标题:{driver.title}") print(f"匹配窗口URL:{driver.current_url}") print("-" * 80) # 3. 按URL切换到歌手标签页 artist_handle = get_handle_by_url(driver, "artist") if artist_handle: driver.switch_to.window(artist_handle) print(f"按URL匹配的句柄:{artist_handle}") print(f"匹配窗口标题:{driver.title}") print(f"匹配窗口URL:{driver.current_url}") except Exception as e: print(f"按标题/URL切换异常:{str(e)}") finally: driver.quit()
3.1.2 输出结果

plaintext

按标题匹配的句柄:CDwindow-11223344556677 匹配窗口标题:【2025】全网最火的Python相关BGM歌单 - 网易云音乐 匹配窗口URL:https://music.163.com/#/playlist?id=7555971729 -------------------------------------------------------------------------------- 按URL匹配的句柄:CDwindow-99887766554433 匹配窗口标题:周杰伦 - 歌手 - 网易云音乐 匹配窗口URL:https://music.163.com/#/artist?id=123456 浏览器已关闭
3.1.3 原理说明
  1. 封装get_handle_by_title/get_handle_by_url函数,遍历所有句柄并匹配标题 / URL;
  2. 适合多标签页场景下无法通过索引确定目标窗口的情况(如标签页打开顺序不确定);
  3. 匹配时使用in关键字而非精确匹配,适配标题 / URL 的动态变化;
  4. 函数返回匹配的句柄,便于后续切换和管理。

3.2 独立窗口操作(自定义尺寸 / 位置)

3.2.1 核心代码实现

python

运行

from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager import time # 初始化主浏览器 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) try: # 1. 打开主窗口 driver.get("https://music.163.com/") print(f"主窗口句柄:{driver.current_window_handle}") print(f"主窗口位置:{driver.get_window_position()}") print(f"主窗口尺寸:{driver.get_window_size()}") print("-" * 80) # 2. 打开独立窗口(自定义尺寸和位置) driver.execute_script(""" window.open( 'https://music.163.com/#/search/m/?s=Python', '_blank', 'width=800,height=600,left=200,top=100' ); """) time.sleep(2) # 3. 切换到独立窗口 new_window_handle = driver.window_handles[1] driver.switch_to.window(new_window_handle) # 4. 调整独立窗口尺寸/位置 driver.set_window_size(900, 700) # 修改尺寸 driver.set_window_position(300, 150) # 修改位置 print(f"独立窗口句柄:{new_window_handle}") print(f"独立窗口新位置:{driver.get_window_position()}") print(f"独立窗口新尺寸:{driver.get_window_size()}") # 5. 在独立窗口执行搜索操作 driver.implicitly_wait(10) search_result = driver.find_element(By.CLASS_NAME, "srchsongst") print(f"独立窗口搜索结果数:{len(search_result.find_elements(By.TAG_NAME, 'li'))}") except Exception as e: print(f"独立窗口操作异常:{str(e)}") finally: driver.quit()
3.2.2 输出结果

plaintext

主窗口句柄:CDwindow-55667788990011 主窗口位置:{'x': 10, 'y': 10} 主窗口尺寸:{'width': 1920, 'height': 1080} -------------------------------------------------------------------------------- 独立窗口句柄:CDwindow-22334455667788 独立窗口新位置:{'x': 300, 'y': 150} 独立窗口新尺寸:{'width': 900, 'height': 700} 独立窗口搜索结果数:20 浏览器已关闭
3.2.3 原理说明
  1. window.open()第三个参数可自定义窗口属性:
    • width/height:窗口尺寸;
    • left/top:窗口在屏幕的位置;
    • _blank:打开独立窗口;
  2. driver.set_window_size()/driver.set_window_position():动态调整窗口尺寸和位置;
  3. driver.get_window_position()/driver.get_window_size():获取窗口当前属性;
  4. 独立窗口适合模拟真实用户多窗口操作场景,降低反爬检测风险。

3.3 多窗口批量管理与清理

3.3.1 核心代码实现

python

运行

from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager import time # 初始化浏览器 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) try: # 1. 批量打开多个标签页 urls = [ "https://music.163.com/", "https://music.163.com/#/discover", "https://music.163.com/#/rank", "https://music.163.com/#/playlist", "https://music.163.com/#/artist" ] # 打开第一个URL(主窗口) driver.get(urls[0]) original_handle = driver.current_window_handle # 批量打开剩余URL for url in urls[1:]: driver.execute_script(f"window.open('{url}')") time.sleep(1) print(f"批量打开后窗口总数:{len(driver.window_handles)}") # 2. 遍历所有窗口并提取信息 window_info = [] for handle in driver.window_handles: driver.switch_to.window(handle) info = { "handle": handle, "title": driver.title[:30], # 截取标题前30字符 "url": driver.current_url[:50], # 截取URL前50字符 "is_original": handle == original_handle } window_info.append(info) # 打印窗口信息 print("\n所有窗口信息:") for idx, info in enumerate(window_info): print(f"窗口{idx+1}:") print(f" 句柄:{info['handle']}") print(f" 标题:{info['title']}") print(f" URL:{info['url']}") print(f" 是否主窗口:{info['is_original']}") print("-" * 60) # 3. 清理非主窗口(保留主窗口,关闭其他) for handle in driver.window_handles: if handle != original_handle: driver.switch_to.window(handle) driver.close() print(f"已关闭窗口:{handle}") # 4. 切回主窗口 driver.switch_to.window(original_handle) print(f"\n清理后剩余窗口数:{len(driver.window_handles)}") print(f"当前活跃窗口:{driver.current_window_handle}") except Exception as e: print(f"多窗口管理异常:{str(e)}") finally: driver.quit()
3.3.2 输出结果

plaintext

批量打开后窗口总数:5 所有窗口信息: 窗口1: 句柄:CDwindow-111222333444 标题:网易云音乐 URL:https://music.163.com/ 是否主窗口:True ------------------------------------------------------------ 窗口2: 句柄:CDwindow-555666777888 标题:网易云音乐-发现 URL:https://music.163.com/#/discover 是否主窗口:False ------------------------------------------------------------ 窗口3: 句柄:CDwindow-999000111222 标题:网易云音乐-排行榜 URL:https://music.163.com/#/rank 是否主窗口:False ------------------------------------------------------------ 窗口4: 句柄:CDwindow-333444555666 标题:网易云音乐-歌单 URL:https://music.163.com/#/playlist 是否主窗口:False ------------------------------------------------------------ 窗口5: 句柄:CDwindow-777888999000 标题:网易云音乐-歌手 URL:https://music.163.com/#/artist 是否主窗口:False ------------------------------------------------------------ 已关闭窗口:CDwindow-555666777888 已关闭窗口:CDwindow-999000111222 已关闭窗口:CDwindow-333444555666 已关闭窗口:CDwindow-777888999000 清理后剩余窗口数:1 当前活跃窗口:CDwindow-111222333444 浏览器已关闭
3.3.3 原理说明
  1. 批量打开标签页时,按顺序执行window.open()并添加短延迟,避免加载冲突;
  2. 遍历所有句柄收集窗口信息(句柄、标题、URL、是否主窗口),便于管理;
  3. 清理非主窗口时,需先切换到目标窗口再执行driver.close()
  4. 批量清理可避免浏览器打开过多标签页导致的内存泄漏和性能下降。

四、反爬场景下的窗口操作优化

4.1 模拟人类窗口操作行为

python

运行

import random import time from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager def human_like_switch_window(driver, target_handle): """模拟人类切换窗口(随机延迟+鼠标操作)""" # 随机延迟0.5-2秒 time.sleep(random.uniform(0.5, 2)) # 随机移动鼠标到浏览器标签栏区域 action = ActionChains(driver) action.move_by_offset(random.randint(100, 800), 30).perform() # 再次随机延迟 time.sleep(random.uniform(0.1, 0.5)) # 切换窗口 driver.switch_to.window(target_handle) # 切换后随机滚动页面 driver.execute_script(f"window.scrollBy(0, {random.randint(100, 500)});") # 实战使用 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get("https://music.163.com/") driver.execute_script("window.open('https://music.163.com/#/rank')") time.sleep(2) # 人类式切换窗口 new_handle = driver.window_handles[1] human_like_switch_window(driver, new_handle) print(f"模拟人类切换后窗口:{driver.current_window_handle}")

4.2 窗口操作防检测配置

python

运行

from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager # 强化反爬配置的窗口操作 chrome_options = webdriver.ChromeOptions() # 禁用自动化检测 chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option('useAutomationExtension', False) chrome_options.add_argument("--disable-blink-features=AutomationControlled") # 禁用弹窗拦截(避免窗口操作被拦截) chrome_options.add_argument("--disable-popup-blocking") # 启用默认浏览器配置(模拟真实用户) chrome_options.add_argument("--user-data-dir=C:\\Users\\[你的用户名]\\AppData\\Local\\Google\\Chrome\\User Data") # 禁用开发者工具(避免特征暴露) chrome_options.add_argument("--disable-dev-shm-usage") # 启动浏览器 driver = webdriver.Chrome( service=Service(ChromeDriverManager().install()), options=chrome_options ) # 执行JS覆盖窗口操作特征 driver.execute_script(""" // 覆盖window.open特征 const originalOpen = window.open; window.open = function(url, name, features) { // 模拟人类调用参数 name = name || '_blank'; features = features || ''; return originalOpen.call(window, url, name, features); }; """) # 正常执行窗口操作 driver.get("https://music.163.com/") driver.execute_script("window.open('https://music.163.com/#/playlist')")

五、常见问题与解决方案

问题现象原因分析解决方案
切换窗口后元素定位失败1. 窗口切换后元素未加载;2. 切错窗口;3. 元素在 iframe 内1. 增加显式等待;2. 验证当前窗口句柄 / 标题;3. 检查并切换 iframe
新建窗口后句柄未更新窗口未加载完成就获取句柄增加time.sleep(1-2)或显式等待窗口数变化
driver.close()后操作报错关闭窗口后未切回有效窗口关闭窗口前记录主窗口句柄,关闭后立即切回
窗口切换被网站拦截浏览器弹窗拦截 / 反爬检测1. 禁用弹窗拦截;2. 伪装浏览器指纹;3. 模拟人类操作
多窗口内存泄漏未及时关闭无用窗口批量清理非核心窗口;定期重启浏览器实例

六、合规性与最佳实践

6.1 合规性说明

  1. 遵守网易云音乐robots.txt协议(https://music.163.com/robots.txt);
  2. 窗口操作频率控制在人类行为范围内(切换间隔≥1 秒);
  3. 仅爬取公开的音乐信息,不得爬取付费内容或用户隐私数据;
  4. 避免批量打开大量窗口(建议同时打开≤5 个),减轻服务器压力。

6.2 最佳实践总结

  1. 句柄管理:始终记录主窗口句柄,操作完成后切回;
  2. 延迟策略:新建 / 切换窗口后添加 1-2 秒延迟,确保加载完成;
  3. 精准匹配:多窗口场景优先按标题 / URL 匹配句柄,而非索引;
  4. 资源清理:及时关闭无用窗口,避免内存泄漏;
  5. 行为模拟:结合随机延迟、鼠标移动,模拟人类窗口操作;
  6. 异常处理:捕获窗口切换异常,执行降级策略(如重试切换)。

七、总结

Selenium 切换标签页与窗口是处理多页面动态内容的核心技术,其核心在于对窗口句柄的精准管理和切换逻辑的合理设计。本文通过网易云音乐实战场景,从基础的标签页切换、自动新建标签页处理,到高级的按标题 / URL 匹配、独立窗口操作,再到反爬优化和批量管理,构建了完整的多窗口操作体系。

在实际开发中,需结合前文的等待优化、限速延迟、UA 伪装等技术,将窗口操作融入整体反爬策略,同时遵循合规性原则,才能实现多窗口爬虫的稳定运行。至此,Python 爬虫实战系列(UA 切换、限速延迟、Selenium 模拟操作、等待优化、窗口切换)已全部完成,覆盖了基础到高级的反爬规避技术,可为各类爬虫开发提供完整的技术参考。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 18:01:31

2026最新网络安全小白自学之路,别到处拜师了!!

较为完整的学习路线: 这个路线是我和一些已入职大佬来规划整理,也加上了小提示,我也希望你们能看看上面我的心得,都会有所帮助。 第一阶段,初入门学网络基础tip:这部分没有什么逻辑可以说的,半个…

作者头像 李华
网站建设 2026/5/19 22:07:20

加入2025护网,日薪最低1500,能力越强薪资越高!

加入2025护网,日薪最低1500,能力越强薪资越高! 什么是护网行动 ** ** 1.护网行动 护网,也称网络保护,是指网络安全人员对企业或组织的网络进行检查、维护和保护,以防止网络受到黑客攻击、病毒、木马或其…

作者头像 李华
网站建设 2026/5/23 14:16:29

Selenium切换窗口、框架和弹出框window、ifame、alert

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、切换窗口#获取打开的多个窗口句柄 windows driver.window_handles #切换到当前最新打开的窗口 driver.switch_to.window(windows[-1]) #最大化浏览器 driv…

作者头像 李华
网站建设 2026/5/23 11:26:09

一个人,一家独角兽公司:代码的终结与创造者的崛起

刚看完 Silicon Valley Girl 采访 Replit CEO Amjad Masad 的视频,后劲很大。Amjad 在视频里抛出了一个非常炸裂的预测:“我们很快就会看到第一家由单人创办并运营的 10 亿美元估值(Unicorn)公司。”注意,是一人公司&a…

作者头像 李华
网站建设 2026/5/22 8:10:00

simu|区间dp|

lc375区间dp枚举区间长度和分割点&#xff0c;计算在 1~n 内猜数字时保证能赢的最小花费方向: 长度大的 需要从长度小的转移过来//构造avl树class Solution { public:int dp[207][207];int getMoneyAmount(int n) {for (int len 2; len < n; len) {//长度for (int i 1; …

作者头像 李华
网站建设 2026/5/23 2:43:38

vue和springboot框架开发的建金粮食供应链管理系统的设计与实现_8b2d57w5

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 同行可拿货,招校园代理 vuespringboot_8b2d57w5 框架开发的建金粮食供应链管理…

作者头像 李华