网站根目录文件夹二维码怎么制作出来的
2026/1/29 15:59:22 网站建设 项目流程
网站根目录文件夹,二维码怎么制作出来的,手机怎么制作网站教程视频,wordpress代码块行号前言 在复杂的爬虫场景中#xff08;如多页面交互、弹窗处理、新窗口打开的内容爬取#xff09;#xff0c;Selenium 对标签页 / 窗口的精准控制是核心能力之一。很多动态网站会通过 “新标签页打开详情页”“弹窗窗口展示关键数据” 等方式呈现内容#xff0c;若无法实现…前言在复杂的爬虫场景中如多页面交互、弹窗处理、新窗口打开的内容爬取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, width800,height600))1.3 窗口切换核心逻辑获取目标窗口的句柄通过索引、URL、标题匹配调用driver.switch_to.window(handle)切换到目标窗口操作完成后按需切回原窗口及时关闭无用窗口释放资源。二、标签页切换基础实战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-size1920,1080) driver webdriver.Chrome( serviceService(ChromeDriverManager().install()), optionschrome_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 初始窗口当前URLhttps://music.163.com/ 浏览器已关闭2.1.3 原理说明driver.current_window_handle获取当前活跃窗口的句柄driver.window_handles返回所有窗口句柄的列表顺序为窗口打开顺序driver.execute_script(window.open(url))通过 JavaScript 新建标签页默认在新标签页打开 URLdriver.switch_to.window(handle)切换到指定句柄的窗口切换后所有操作均针对该窗口新建标签页后需等待 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(serviceService(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 原理说明部分网站的链接会通过target_blank自动新建标签页点击后需等待窗口数变化通过列表推导式[h for h in current_handles if h ! original_handle][0]筛选出新标签页句柄driver.close()关闭当前活跃窗口仅关闭标签页不退出浏览器关闭标签页后需显式切回原窗口否则后续操作会报错无活跃窗口。三、窗口切换高级实战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(serviceService(ChromeDriverManager().install())) try: # 1. 打开多个标签页 driver.get(https://music.163.com/) # 标签页1 driver.execute_script(window.open(https://music.163.com/#/playlist?id7555971729)) # 标签页2 driver.execute_script(window.open(https://music.163.com/#/artist?id123456)) # 标签页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歌单 - 网易云音乐 匹配窗口URLhttps://music.163.com/#/playlist?id7555971729 -------------------------------------------------------------------------------- 按URL匹配的句柄CDwindow-99887766554433 匹配窗口标题周杰伦 - 歌手 - 网易云音乐 匹配窗口URLhttps://music.163.com/#/artist?id123456 浏览器已关闭3.1.3 原理说明封装get_handle_by_title/get_handle_by_url函数遍历所有句柄并匹配标题 / URL适合多标签页场景下无法通过索引确定目标窗口的情况如标签页打开顺序不确定匹配时使用in关键字而非精确匹配适配标题 / URL 的动态变化函数返回匹配的句柄便于后续切换和管理。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(serviceService(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/?sPython, _blank, width800,height600,left200,top100 ); ) 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 原理说明window.open()第三个参数可自定义窗口属性width/height窗口尺寸left/top窗口在屏幕的位置_blank打开独立窗口driver.set_window_size()/driver.set_window_position()动态调整窗口尺寸和位置driver.get_window_position()/driver.get_window_size()获取窗口当前属性独立窗口适合模拟真实用户多窗口操作场景降低反爬检测风险。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(serviceService(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(fwindow.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窗口{idx1}) 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 标题网易云音乐 URLhttps://music.163.com/ 是否主窗口True ------------------------------------------------------------ 窗口2 句柄CDwindow-555666777888 标题网易云音乐-发现 URLhttps://music.163.com/#/discover 是否主窗口False ------------------------------------------------------------ 窗口3 句柄CDwindow-999000111222 标题网易云音乐-排行榜 URLhttps://music.163.com/#/rank 是否主窗口False ------------------------------------------------------------ 窗口4 句柄CDwindow-333444555666 标题网易云音乐-歌单 URLhttps://music.163.com/#/playlist 是否主窗口False ------------------------------------------------------------ 窗口5 句柄CDwindow-777888999000 标题网易云音乐-歌手 URLhttps://music.163.com/#/artist 是否主窗口False ------------------------------------------------------------ 已关闭窗口CDwindow-555666777888 已关闭窗口CDwindow-999000111222 已关闭窗口CDwindow-333444555666 已关闭窗口CDwindow-777888999000 清理后剩余窗口数1 当前活跃窗口CDwindow-111222333444 浏览器已关闭3.3.3 原理说明批量打开标签页时按顺序执行window.open()并添加短延迟避免加载冲突遍历所有句柄收集窗口信息句柄、标题、URL、是否主窗口便于管理清理非主窗口时需先切换到目标窗口再执行driver.close()批量清理可避免浏览器打开过多标签页导致的内存泄漏和性能下降。四、反爬场景下的窗口操作优化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(fwindow.scrollBy(0, {random.randint(100, 500)});) # 实战使用 driver webdriver.Chrome(serviceService(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-featuresAutomationControlled) # 禁用弹窗拦截避免窗口操作被拦截 chrome_options.add_argument(--disable-popup-blocking) # 启用默认浏览器配置模拟真实用户 chrome_options.add_argument(--user-data-dirC:\\Users\\[你的用户名]\\AppData\\Local\\Google\\Chrome\\User Data) # 禁用开发者工具避免特征暴露 chrome_options.add_argument(--disable-dev-shm-usage) # 启动浏览器 driver webdriver.Chrome( serviceService(ChromeDriverManager().install()), optionschrome_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 合规性说明遵守网易云音乐robots.txt协议https://music.163.com/robots.txt窗口操作频率控制在人类行为范围内切换间隔≥1 秒仅爬取公开的音乐信息不得爬取付费内容或用户隐私数据避免批量打开大量窗口建议同时打开≤5 个减轻服务器压力。6.2 最佳实践总结句柄管理始终记录主窗口句柄操作完成后切回延迟策略新建 / 切换窗口后添加 1-2 秒延迟确保加载完成精准匹配多窗口场景优先按标题 / URL 匹配句柄而非索引资源清理及时关闭无用窗口避免内存泄漏行为模拟结合随机延迟、鼠标移动模拟人类窗口操作异常处理捕获窗口切换异常执行降级策略如重试切换。七、总结Selenium 切换标签页与窗口是处理多页面动态内容的核心技术其核心在于对窗口句柄的精准管理和切换逻辑的合理设计。本文通过网易云音乐实战场景从基础的标签页切换、自动新建标签页处理到高级的按标题 / URL 匹配、独立窗口操作再到反爬优化和批量管理构建了完整的多窗口操作体系。在实际开发中需结合前文的等待优化、限速延迟、UA 伪装等技术将窗口操作融入整体反爬策略同时遵循合规性原则才能实现多窗口爬虫的稳定运行。至此Python 爬虫实战系列UA 切换、限速延迟、Selenium 模拟操作、等待优化、窗口切换已全部完成覆盖了基础到高级的反爬规避技术可为各类爬虫开发提供完整的技术参考。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询