From a3bd794069a33bdbe4cbc0a0d9b54458d49e81f2 Mon Sep 17 00:00:00 2001 From: Cheer Date: Wed, 29 Apr 2026 22:31:47 +0800 Subject: [PATCH 1/7] Create feat_information_management.md --- src/zzz/zh/feat_information_management.md | 124 ++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 src/zzz/zh/feat_information_management.md diff --git a/src/zzz/zh/feat_information_management.md b/src/zzz/zh/feat_information_management.md new file mode 100644 index 00000000..6505c5e0 --- /dev/null +++ b/src/zzz/zh/feat_information_management.md @@ -0,0 +1,124 @@ +# 前言 +此系统旨在为一条龙应用提供标准化接口,为仓库扫描系统的开发提供数据决策支持 +## 代理人信息管理 +image (1) + +- 优先级自动分配 +用户通过在优先级表格中选择对应的词条后点击一键生成权重,系统将会自动针对权重进行分配到右侧权重配置表格中 + +- 最优音擎管理 +此功能目前还未得到开发,后续会根据仓库扫描的开发情况进行添加 + +- 角色基础信息 +可根据需要对角色的名称,类型,属性,稀有度,code进行修改 + +## 驱动盘信息管理 +image (3) +定义了驱动盘的基础信息,可根据需要自行修改 + +## 音擎信息管理 +image (4) + +定义了音擎的基础信息,可根据需要自行修改 + +## 数据交互方式 + +### 方式1:通过信息管理GUI界面修改(推荐) +根据上述介绍,开发者可根据需要对信息进行维护和开发 + +### 方式2:直接修改配置文件 + +> 角色配置路径:assets\game_data\agent + +> 驱动盘配置路径:assets\game_data\drive_disk + +> 音擎配置路径:assets\game_data\engine_weapon + +访问对应的路径后,即可对其中定义的yml文件进行直接修改 + +稀有度映射: +```python +class RareTypeEnum(Enum): + S = 'S' + A = 'A' + B = 'B' + UNKNOWN = '未知' +``` +角色 +```yml +agent_name: 爱芮 #代理人名称 +agent_type: ANOMALY #代理人类型 +dmg_type: ETHER #伤害类型 +rare_type: S #稀有度 +code: aria #代码最好为英文 +weight: #权重配置 + 生命值: 0.0 #权重值的范围为0-1 + 攻击力: 0.75 + 防御力: 0.0 + 穿透率: 0.75 + 冲击力: 0.0 + 暴击率: 0.0 + 暴击伤害: 0.0 + 物理伤害加成: 0.0 + 以太伤害加成: 1.0 + 火属性伤害加成: 0.0 + 冰属性伤害加成: 0.0 + 电属性伤害加成: 0.0 + 异常掌控: 1.0 + 异常精通: 1.0 + 能量自动回复: 0.0 + 小攻击: 0.25 + 小生命: 0.0 + 小防御: 0.0 + 穿透值: 0.25 +``` + +其中代理人类型映射(src\zzz_od\game_data\agent.py): +```python +class AgentTypeEnum(Enum): + + ATTACK = '强攻' + STUN = '击破' + SUPPORT = '支援' + DEFENSE = '防护' + ANOMALY = '异常' + RUPTURE = '命破' + UNKNOWN = '未知' +``` + +其中代理人伤害类型映射(src\zzz_od\game_data\agent.py): +```python +class DmgTypeEnum(Enum): + + ELECTRIC = '电属性' + ETHER = '以太' + PHYSICAL = '物理' + FIRE = '火属性' + ICE = '冰属性' + UNKNOWN = '未知' +``` + +驱动盘 +```yml +set_name: "沧浪行歌" #驱动盘名称 +mission_type_name: "诡步与重壁" #任务类型名称 +code: canglang_song #驱动盘代码 +``` +音擎 +```yml +weapon_name: 「灰烬」-钴蓝 #音擎名称 +rarity: B #音擎稀有度 +code: "[Cinder] Cobalt" #音擎代码 +``` + +>注:在编辑时如果遇到了yml解析的问题,可使用""包裹 + + +## 关于运维 +可通过python爬虫脚本来实现 + + + + + + From 225f4d9ac03dff8b517c843703d9158bd3955c8b Mon Sep 17 00:00:00 2001 From: Cheer Date: Wed, 29 Apr 2026 22:40:21 +0800 Subject: [PATCH 2/7] Fix file path formatting in documentation Updated file paths in feat_information_management.md to use forward slashes. --- src/zzz/zh/feat_information_management.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/zzz/zh/feat_information_management.md b/src/zzz/zh/feat_information_management.md index 6505c5e0..5e74d564 100644 --- a/src/zzz/zh/feat_information_management.md +++ b/src/zzz/zh/feat_information_management.md @@ -28,11 +28,11 @@ ### 方式2:直接修改配置文件 -> 角色配置路径:assets\game_data\agent ++> 角色配置路径:`assets/game_data/agent` -> 驱动盘配置路径:assets\game_data\drive_disk ++> 驱动盘配置路径:`assets/game_data/drive_disk` -> 音擎配置路径:assets\game_data\engine_weapon ++> 音擎配置路径:`assets/game_data/engine_weapon` 访问对应的路径后,即可对其中定义的yml文件进行直接修改 From 558ca49830d216f46d5caddd0c4c6961ae26d131 Mon Sep 17 00:00:00 2001 From: Cheer Date: Wed, 29 Apr 2026 22:41:33 +0800 Subject: [PATCH 3/7] Improve YAML parsing instructions in documentation Updated YAML parsing note for clarity and examples. --- src/zzz/zh/feat_information_management.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/zzz/zh/feat_information_management.md b/src/zzz/zh/feat_information_management.md index 5e74d564..e729809b 100644 --- a/src/zzz/zh/feat_information_management.md +++ b/src/zzz/zh/feat_information_management.md @@ -111,7 +111,9 @@ rarity: B #音擎稀有度 code: "[Cinder] Cobalt" #音擎代码 ``` ->注:在编辑时如果遇到了yml解析的问题,可使用""包裹 ++> 注:在编辑时如果遇到 YAML 解析问题,建议把包含特殊字符的字符串用英文双引号 `"` 包起来。 + ++> 例如:weapon_name: "「灰烬」-钴蓝" ## 关于运维 From 692d7a49481b1352c96dfad5a099ae72cc9b74fc Mon Sep 17 00:00:00 2001 From: Cheer Date: Wed, 29 Apr 2026 23:04:01 +0800 Subject: [PATCH 4/7] =?UTF-8?q?feat(=E6=96=87=E6=A1=A3):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BF=A1=E6=81=AF=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=92=8C=E5=9B=BE=E7=89=87=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加信息管理功能的相关文档内容,包括代理人、驱动盘和音擎信息管理 更新导航栏和侧边栏配置以包含新功能入口 将图片资源从外部链接替换为本地存储 --- src/.vuepress/navbar/zh.ts | 4 ++++ src/.vuepress/sidebar/zh.ts | 4 ++++ src/zzz/zh/feat_information_management.md | 6 +++--- .../feat_information_management_image_1.png | Bin 0 -> 98608 bytes .../feat_information_management_image_2.png | Bin 0 -> 90966 bytes .../feat_information_management_image_3.png | Bin 0 -> 80085 bytes 6 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 src/zzz/zh/feat_information_management/feat_information_management_image_1.png create mode 100644 src/zzz/zh/feat_information_management/feat_information_management_image_2.png create mode 100644 src/zzz/zh/feat_information_management/feat_information_management_image_3.png diff --git a/src/.vuepress/navbar/zh.ts b/src/.vuepress/navbar/zh.ts index b45dcfa3..ff1464f2 100644 --- a/src/.vuepress/navbar/zh.ts +++ b/src/.vuepress/navbar/zh.ts @@ -85,6 +85,10 @@ export const zhNavbar = navbar([ text: "功能-游戏助手", link: "feat_game_assistant" }, + { + text: "功能-信息管理", + link: "feat_information_management" + }, { text: "功能-一条龙", link: "feat_one_dragon/onedragon" diff --git a/src/.vuepress/sidebar/zh.ts b/src/.vuepress/sidebar/zh.ts index 7af41b90..f6388d5d 100644 --- a/src/.vuepress/sidebar/zh.ts +++ b/src/.vuepress/sidebar/zh.ts @@ -66,6 +66,10 @@ export const zhSidebar = sidebar({ text: "功能-游戏助手", link: "feat_game_assistant" }, + { + text: "功能-信息管理", + link: "feat_information_management" + }, { text: "功能-一条龙", collapsible: true, diff --git a/src/zzz/zh/feat_information_management.md b/src/zzz/zh/feat_information_management.md index e729809b..7e2bb51e 100644 --- a/src/zzz/zh/feat_information_management.md +++ b/src/zzz/zh/feat_information_management.md @@ -1,7 +1,7 @@ # 前言 此系统旨在为一条龙应用提供标准化接口,为仓库扫描系统的开发提供数据决策支持 ## 代理人信息管理 -image (1) +![feat_information_management_image_1.png](feat_information_management/feat_information_management_image_1.png) - 优先级自动分配 用户通过在优先级表格中选择对应的词条后点击一键生成权重,系统将会自动针对权重进行分配到右侧权重配置表格中 @@ -13,11 +13,11 @@ 可根据需要对角色的名称,类型,属性,稀有度,code进行修改 ## 驱动盘信息管理 -image (3) +![feat_information_management_image_2.png](feat_information_management/feat_information_management_image_2.png) 定义了驱动盘的基础信息,可根据需要自行修改 ## 音擎信息管理 -image (4) +![feat_information_management_image_3.png](feat_information_management/feat_information_management_image_3.png) 定义了音擎的基础信息,可根据需要自行修改 diff --git a/src/zzz/zh/feat_information_management/feat_information_management_image_1.png b/src/zzz/zh/feat_information_management/feat_information_management_image_1.png new file mode 100644 index 0000000000000000000000000000000000000000..24cd4b2ef8e8339c77e46025e93497d0a5666c31 GIT binary patch literal 98608 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 literal 0 HcmV?d00001 diff --git a/src/zzz/zh/feat_information_management/feat_information_management_image_2.png b/src/zzz/zh/feat_information_management/feat_information_management_image_2.png new file mode 100644 index 0000000000000000000000000000000000000000..cc53e1ff6219705e33f08c1a53c3b7dc865add1b GIT binary patch literal 90966 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

kd)$cLv;;G4cIDCP2j-hhaBhk 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 C^)811 literal 0 HcmV?d00001 diff --git a/src/zzz/zh/feat_information_management/feat_information_management_image_3.png b/src/zzz/zh/feat_information_management/feat_information_management_image_3.png new file mode 100644 index 0000000000000000000000000000000000000000..2c5c3fae82ad7fc8012d1e4bbe090063cbb20475 GIT binary patch literal 80085 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 literal 0 HcmV?d00001 From 488099c0f4eb6eb3b5d7cd13fd6d1a5eccbcfd53 Mon Sep 17 00:00:00 2001 From: Cheer Date: Wed, 29 Apr 2026 23:11:22 +0800 Subject: [PATCH 5/7] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除代理人信息管理部分的冗余空行并调整驱动盘信息管理格式 --- src/zzz/zh/feat_information_management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zzz/zh/feat_information_management.md b/src/zzz/zh/feat_information_management.md index 7e2bb51e..21b79df4 100644 --- a/src/zzz/zh/feat_information_management.md +++ b/src/zzz/zh/feat_information_management.md @@ -2,7 +2,6 @@ 此系统旨在为一条龙应用提供标准化接口,为仓库扫描系统的开发提供数据决策支持 ## 代理人信息管理 ![feat_information_management_image_1.png](feat_information_management/feat_information_management_image_1.png) - - 优先级自动分配 用户通过在优先级表格中选择对应的词条后点击一键生成权重,系统将会自动针对权重进行分配到右侧权重配置表格中 @@ -14,6 +13,7 @@ ## 驱动盘信息管理 ![feat_information_management_image_2.png](feat_information_management/feat_information_management_image_2.png) + 定义了驱动盘的基础信息,可根据需要自行修改 ## 音擎信息管理 From 11bb626b9eac283ae8081a618d489c38164a7208 Mon Sep 17 00:00:00 2001 From: Cheer Date: Wed, 29 Apr 2026 23:23:42 +0800 Subject: [PATCH 6/7] =?UTF-8?q?feat(=E4=BF=A1=E6=81=AF=E7=AE=A1=E7=90=86):?= =?UTF-8?q?=20=E6=96=B0=E5=A2=9E=E9=A9=B1=E5=8A=A8=E7=9B=98=E3=80=81?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=92=8C=E9=9F=B3=E6=93=8E=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=88=AC=E5=8F=96=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加三个爬虫脚本分别用于获取绝区零游戏中的驱动盘、角色和音擎数据,并转换为YAML格式存储: 1. fetch_drive_disk.py - 从萌娘百科抓取驱动盘信息 2. fetch_agent.py - 异步爬取角色数据 3. fetch_engine.py - 使用Playwright获取音擎详情 所有脚本均包含错误处理和重试机制,支持数据格式转换和本地存储 --- .../fetch_agent.py | 493 +++++++++++++ .../fetch_drive_disk.py | 398 +++++++++++ .../fetch_engine.py | 646 ++++++++++++++++++ 3 files changed, 1537 insertions(+) create mode 100644 src/zzz/zh/feat_information_management/fetch_agent.py create mode 100644 src/zzz/zh/feat_information_management/fetch_drive_disk.py create mode 100644 src/zzz/zh/feat_information_management/fetch_engine.py diff --git a/src/zzz/zh/feat_information_management/fetch_agent.py b/src/zzz/zh/feat_information_management/fetch_agent.py new file mode 100644 index 00000000..e3310105 --- /dev/null +++ b/src/zzz/zh/feat_information_management/fetch_agent.py @@ -0,0 +1,493 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +爬取角色数据并转换为指定格式(异步版本) +""" + +import json +import os +import time +import re +import asyncio +import aiohttp +from bs4 import BeautifulSoup +from urllib.parse import quote + +# 属性映射 +ELEMENT_MAP = { + '电': 'ELECTRIC', + '以太': 'ETHEREAL', + '物理': 'PHYSICAL', + '冰': 'ICE', + '凛刃': 'FROST', + '火': 'FIRE', +} + +# 默认角色类型映射(根据属性推断) +ELEMENT_TO_AGENT_TYPE = { + 'ELECTRIC': 'STUN', + 'ETHEREAL': 'BUFF', + 'PHYSICAL': 'ATK', + 'ICE': 'FREEZE', + 'FROST': 'ATK', + 'FIRE': 'BURNING', + 'WIND': 'ATK', + 'VOID': 'ATK' +} + +# 并发控制 +MAX_CONCURRENT_REQUESTS = 10 + +def load_character_data(json_path='character_data.json'): + """从JSON文件加载角色数据""" + try: + with open(json_path, 'r', encoding='utf-8') as f: + data = json.load(f) + return data + except Exception as e: + print(f"加载角色数据失败: {str(e)}") + return None + +def extract_character_names(character_images): + """从图片名称中提取角色名""" + character_names = [] + for img_name in character_images: + # 去掉 "角色-" 前缀和 ".png" 后缀 + if img_name.startswith('角色-') and img_name.endswith('.png'): + char_name = img_name[3:-4] # 去掉前缀和后缀 + character_names.append(char_name) + return character_names + +async def extract_character_names_from_web(session): + """从角色图鉴网页中提取角色名称(异步版)""" + url = 'https://wiki.biligame.com/zzz/%E8%A7%92%E8%89%B2%E5%9B%BE%E9%89%B4' + + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', + 'Referer': 'https://wiki.biligame.com/zzz/' + } + + try: + print(f"正在从网页获取角色图鉴数据: {url}") + async with session.get(url, headers=headers, timeout=30) as response: + if response.status != 200: + print(f"请求失败,状态码: {response.status}") + return [] + + text = await response.text(encoding='utf-8') + soup = BeautifulSoup(text, 'html.parser') + role_boxes = soup.select('#CardSelectTr .role-box') + character_names = [] + + for box in role_boxes: + name_tag = box.select_one('.role-name a') + if name_tag: + character_names.append(name_tag.get_text(strip=True)) + + return character_names + except Exception as e: + print(f"从网页提取角色名称失败: {str(e)}") + return [] + +async def fetch_character_detail(session, char_name, semaphore): + """抓取单个角色的详细数据(异步版)""" + # URL 编码角色名 + encoded_name = quote(char_name, safe='') + url = f"https://wiki.biligame.com/zzz/{encoded_name}" + + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', + 'Referer': 'https://wiki.biligame.com/zzz/' + } + + async with semaphore: + try: + print(f" 正在抓取: {char_name}") + async with session.get(url, headers=headers, timeout=30) as response: + if response.status != 200: + print(f" 请求失败,状态码: {response.status}") + return None + + text = await response.text(encoding='utf-8') + soup = BeautifulSoup(text, 'html.parser') + + # 提取角色基本信息 + character_info = { + 'name': char_name, + 'url': url, + 'encoded_name': encoded_name, + 'fetch_time': time.strftime('%Y-%m-%d %H:%M:%S') + } + + # 1. 查找角色名称 + title = soup.find('h1', {'id': 'firstHeading'}) + if title: + character_info['title'] = title.get_text(strip=True) + + # 2. 查找角色信息表格 + info_table = soup.find('table', class_=['wikitable', 'infobox']) + if info_table: + info_dict = {} + rows = info_table.find_all('tr') + for row in rows: + th = row.find('th') + td = row.find('td') + if th and td: + key = th.get_text(strip=True) + value = td.get_text(strip=True) + info_dict[key] = value + # 提取全名和英文名称 + if '全名' in key or '本名' in key: + # 支持中文括号和英文括号 + match = re.match(r'(.+?)\s*[((](.+?)[))]', value) + if match: + character_info['full_name'] = match.group(1).strip() + # 将英文名称中的空格替换为下划线 + character_info['english_name'] = match.group(2).strip().replace(' ', '_') + else: + character_info['full_name'] = value.strip() + character_info['english_name'] = None + # 提取属性/元素 + if '属性' in key or '元素' in key or '元素属性' in key: + # 当td中包含img标签时,提取img之后的文本内容 + if td.find('img'): + # 获取img之后的所有文本内容 + element_text = '' + for content in td.contents: + # 跳过img标签 + if hasattr(content, 'name') and content.name == 'img': + continue + # 提取文本内容 + text_content = str(content).strip() + if text_content: + element_text += text_content + character_info['element'] = element_text.strip() + else: + character_info['element'] = value.strip() + # 提取稀有度/品级 + if '稀有度' in key or '品级' in key: + # 稀有度通过图片的alt属性标识,如"角色稀有度S.png" + img_tag = td.find('img') + if img_tag: + alt_text = img_tag.get('alt', '') + # 从alt文本中提取稀有度等级(S/A/B/C) + if '稀有度' in alt_text: + # 查找稀有度等级字母 + match = re.search(r'稀有度([SABC])', alt_text) + if match: + character_info['rarity'] = match.group(1) + else: + # 如果没有匹配到,尝试从文件名中提取 + filename = alt_text.replace('.png', '') + if 'S' in filename: + character_info['rarity'] = 'S' + elif 'A' in filename: + character_info['rarity'] = 'A' + elif 'B' in filename: + character_info['rarity'] = 'B' + elif 'C' in filename: + character_info['rarity'] = 'C' + else: + character_info['rarity'] = value.strip() + # 提取特性 + if '特性' in key: + # 特性通过图片的alt属性标识,如"图标-强攻.png" + img_tag = td.find('img') + if img_tag: + alt_text = img_tag.get('alt', '') + # 从alt文本中提取特性名称(去掉"图标-"和".png") + if '图标-' in alt_text and '.png' in alt_text: + character_info['trait'] = alt_text.replace('图标-', '').replace('.png', '') + else: + # 如果alt属性不符合预期格式,使用td中的文本 + character_info['trait'] = value.strip() + else: + character_info['trait'] = value.strip() + character_info['basic_info'] = info_dict + + # 3. 提取立绘图片URL(官方介绍,非官方介绍2) + character_info['stand_art_url'] = extract_stand_art_url(soup, char_name) + + print(f" ✓ 成功抓取: {char_name}") + return character_info + + except Exception as e: + print(f" ✗ 抓取角色 {char_name} 失败: {str(e)}") + return None + +def extract_stand_art_url(soup, char_name): + """从HTML中提取立绘图片URL(纯立绘,排除官方介绍)""" + try: + # 查找所有包含"角色立绘"的图片 + images = soup.find_all('img', alt=re.compile(r'角色立绘')) + + for img in images: + alt_text = img.get('alt', '') + # 排除包含"官方介绍"的图片,只选择纯"角色立绘-XXX.png" + if '角色立绘' in alt_text and '官方介绍' not in alt_text: + img_url = img.get('src') + if img_url: + print(f" 找到立绘图片: {alt_text}") + return img_url + + print(f" 未找到立绘图片(纯立绘)") + return None + except Exception as e: + print(f" 提取立绘图片URL失败: {str(e)}") + return None + +async def download_stand_art(session, img_url, output_path, english_name): + """下载立绘图片到指定路径(异步版)""" + if not img_url: + print(f" 图片URL为空,跳过下载") + return False + + try: + # 确保输出目录存在 + os.makedirs(output_path, exist_ok=True) + + # 构建文件名 + filename = f"{english_name}.png" + filepath = os.path.join(output_path, filename) + + # 检查文件是否已存在 + if os.path.exists(filepath): + print(f" 文件已存在,跳过下载: {filepath}") + return True + + # 下载图片 + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Referer': 'https://wiki.biligame.com/zzz/' + } + + print(f" 正在下载立绘图片: {img_url}") + async with session.get(img_url, headers=headers, timeout=30) as response: + if response.status != 200: + print(f" 下载失败,状态码: {response.status}") + return False + + # 保存图片 + with open(filepath, 'wb') as f: + f.write(await response.read()) + + print(f" ✓ 立绘图片已保存: {filepath}") + return True + + except Exception as e: + print(f" 下载立绘图片失败: {str(e)}") + return False + +async def fetch_all_characters(session, character_names): + """抓取所有角色的详细数据(异步版)""" + # 创建信号量限制并发数 + semaphore = asyncio.Semaphore(MAX_CONCURRENT_REQUESTS) + + print(f"开始抓取 {len(character_names)} 个角色的详细数据...") + print("=" * 60) + + # 创建所有任务 + tasks = [fetch_character_detail(session, char_name, semaphore) for char_name in character_names] + + # 并发执行 + results = await asyncio.gather(*tasks) + + # 分离成功和失败的结果 + all_characters = [r for r in results if r is not None] + failed_characters = [name for name, result in zip(character_names, results) if result is None] + + print("\n" + "=" * 60) + print(f"抓取完成: 成功 {len(all_characters)} 个, 失败 {len(failed_characters)} 个") + + return { + 'fetch_time': time.strftime('%Y-%m-%d %H:%M:%S'), + 'total': len(character_names), + 'success': len(all_characters), + 'failed': len(failed_characters), + 'failed_list': failed_characters, + 'characters': all_characters + } + +def convert_format(data): + """将数据转换为指定格式""" + if not data: + return None + + characters = data.get('characters', []) + result = { + "character": {} + } + + for char in characters: + # 获取英文名称作为键名 + english_name = char.get('english_name') + if not english_name: + # 如果没有英文名称,使用角色名作为键名 + english_name = char.get('name') + + # 构建角色数据 + char_data = { + "CHS": char.get('full_name', char.get('name')), + "EN": english_name, + "code": english_name, + "element": char.get('element', ''), + "rarity": char.get('rarity', ''), + "trait": char.get('trait', '') + } + + # 添加到结果中 + result["character"][english_name] = char_data + + return result + +def save_agent_yml(char_data, output_dir): + """将单个角色数据保存为YAML文件(直接使用原始数据,不进行属性映射)""" + # 获取数据(直接使用原始值) + chs_name = char_data.get('CHS', '') + code = char_data.get('code', '').lower() + element = char_data.get('element', '') + rarity = char_data.get('rarity', '') + trait = char_data.get('trait', '') + + # 构建YAML内容(忽略weight,将特性填充到agent_type) + yml_content = f"""agent_name: {chs_name} +agent_type: {trait} +dmg_type: {element} +rare_type: {rarity} +code: {code} +""" + + # 确保输出目录存在 + os.makedirs(output_dir, exist_ok=True) + + # 构建文件名 + filename = f"{code}.yml" + filepath = os.path.join(output_dir, filename) + + # 保存文件 + with open(filepath, 'w', encoding='utf-8') as f: + f.write(yml_content) + + return filepath + +def save_all_agent_yml(data, output_dir): + """保存所有角色为单独的YAML文件""" + if not data: + return [] + + saved_files = [] + characters = data.get('character', {}) + + for code, char_data in characters.items(): + filepath = save_agent_yml(char_data, output_dir) + saved_files.append(filepath) + print(f" 已保存: {filepath}") + + return saved_files + +def save_converted_data(data, filename='converted_character_data.json'): + """保存转换后的数据""" + if data: + script_dir = os.path.dirname(os.path.abspath(__file__)) + filepath = os.path.join(script_dir, filename) + with open(filepath, 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=2) + print(f"数据已保存到: {filepath}") + return filepath + +async def main(): + """主函数(异步版)""" + print("=" * 60) + print("角色数据抓取与格式转换工具(异步版)") + print("=" * 60) + + # 创建异步HTTP会话 + async with aiohttp.ClientSession() as session: + # 1. 从网页中提取角色名称 + print("\n从角色图鉴网页提取角色名称...") + character_names = await extract_character_names_from_web(session) + + if not character_names: + print("无法从网页提取角色名称") + return + + print(f"\n从网页中提取到 {len(character_names)} 个角色名:") + for i, name in enumerate(character_names[:10], 1): + print(f" {i}. {name}") + if len(character_names) > 10: + print(f" ... 还有 {len(character_names) - 10} 个角色") + + # 2. 异步抓取所有角色的详细数据 + start_time = time.time() + all_data = await fetch_all_characters(session, character_names) + end_time = time.time() + print(f"\n异步抓取耗时: {end_time - start_time:.2f} 秒") + + # 3. 转换格式 + print("\n转换数据格式...") + converted_data = convert_format(all_data) + + if not converted_data: + print("转换失败") + return + + # 4. 保存数据 + output_path = save_converted_data(converted_data) + + # 5. 保存每个角色为单独的YAML文件 + print("\n" + "=" * 60) + print("保存角色YAML文件") + print("=" * 60) + agent_output_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'agent') + saved_files = save_all_agent_yml(converted_data, agent_output_dir) + print(f"\n✓ 已保存 {len(saved_files)} 个角色YAML文件到: {agent_output_dir}") + + # 6. 下载第一个角色的立绘图片 + print("\n" + "=" * 60) + print("下载立绘图片") + print("=" * 60) + + if all_data['characters']: + first_char = all_data['characters'][0] + english_name = first_char.get('english_name') + stand_art_url = first_char.get('stand_art_url') + + if english_name and stand_art_url: + print(f"\n下载第一个角色的立绘图片:") + print(f" 角色名: {first_char.get('name')}") + print(f" 英文名: {english_name}") + print(f" 图片URL: {stand_art_url}") + + # 获取脚本所在目录 + script_dir = os.path.dirname(os.path.abspath(__file__)) + output_dir = os.path.join(script_dir, 'agent_stand_art') + + # 下载立绘图片 + success = await download_stand_art(session, stand_art_url, output_dir, english_name) + + if success: + print(f"\n✓ 立绘图片下载成功") + else: + print(f"\n✗ 立绘图片下载失败") + else: + print(f"\n第一个角色没有立绘图片信息") + print(f" 英文名: {english_name}") + print(f" 图片URL: {stand_art_url}") + + # 6. 打印摘要 + print("\n" + "=" * 60) + print("处理摘要") + print("=" * 60) + print(f"总角色数: {all_data['total']}") + print(f"成功: {all_data['success']}") + print(f"失败: {all_data['failed']}") + print(f"转换角色数: {len(converted_data.get('character', {}))}") + print(f"输出文件: {output_path}") + +if __name__ == '__main__': + # 运行异步主函数 + asyncio.run(main()) diff --git a/src/zzz/zh/feat_information_management/fetch_drive_disk.py b/src/zzz/zh/feat_information_management/fetch_drive_disk.py new file mode 100644 index 00000000..37b23431 --- /dev/null +++ b/src/zzz/zh/feat_information_management/fetch_drive_disk.py @@ -0,0 +1,398 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +爬取萌娘百科绝区零驱动盘数据 +来源:https://mzh.moegirl.org.cn/%E7%BB%9D%E5%8C%BA%E9%9B%B6/%E9%A9%B1%E5%8A%A8%E7%9B%98 +输出:YAML格式文件,存储在 drive_disk 文件夹中 +""" + +import requests +from bs4 import BeautifulSoup +import os +import re +import time + + +def fetch_drive_disk_data(): + """抓取驱动盘数据""" + url = "https://mzh.moegirl.org.cn/%E7%BB%9D%E5%8C%BA%E9%9B%B6/%E9%A9%B1%E5%8A%A8%E7%9B%98" + delay = 3 # 请求间隔,避免被风控 + + # 创建Session对象,维持连接 + session = requests.Session() + + # 设置更多请求头信息 + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', + 'Accept-Encoding': 'gzip, deflate, br', + 'Connection': 'keep-alive', + 'Referer': 'https://mzh.moegirl.org.cn/', + 'Cache-Control': 'max-age=0', + 'Upgrade-Insecure-Requests': '1' + } + session.headers.update(headers) + + try: + print(f"正在抓取驱动盘数据: {url}") + + # 先访问主页获取Cookie + print(" 正在获取初始Cookie...") + session.get('https://mzh.moegirl.org.cn/', timeout=30) + time.sleep(delay) + + # 添加延迟避免频繁请求 + time.sleep(delay) + + # 发送请求 + response = session.get(url, timeout=30) + response.encoding = 'utf-8' + + print(f"响应状态码: {response.status_code}") + + # 检查是否被限流 + if response.status_code == 429: + print('访问太频繁,自动暂停120s') + time.sleep(120) + # 重新请求 + response = session.get(url, timeout=30) + response.encoding = 'utf-8' + + if response.status_code != 200: + print(f"请求失败,状态码: {response.status_code}") + print("尝试调整请求头后重试...") + + # 尝试调整User-Agent + session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' + time.sleep(delay) + + response = session.get(url, timeout=30) + response.encoding = 'utf-8' + + print(f"重试响应状态码: {response.status_code}") + + if response.status_code != 200: + print("无法从URL获取数据") + return None, None + + # 检查响应内容类型,处理可能的压缩 + content_encoding = response.headers.get('Content-Encoding', '') + print(f"响应头 Content-Encoding: {content_encoding}") + print(f"响应头 Content-Type: {response.headers.get('Content-Type')}") + + # 根据压缩方式解压内容 + raw_content = response.content + try: + if 'br' in content_encoding: + import brotli + html_content = brotli.decompress(raw_content).decode('utf-8') + print("使用 Brotli 解压成功") + elif 'gzip' in content_encoding: + import gzip + html_content = gzip.decompress(raw_content).decode('utf-8') + print("使用 gzip 解压成功") + elif 'deflate' in content_encoding: + import zlib + html_content = zlib.decompress(raw_content, zlib.MAX_WBITS | 16).decode('utf-8') + print("使用 zlib 解压成功") + else: + html_content = response.text + print("无需解压") + except Exception as e: + print(f"解压失败: {e}") + html_content = response.text + + print(f"响应内容长度: {len(html_content)}") + + # 保存获取到的HTML内容用于调试 + debug_file = r"d:\my\project\zzz_drive-disk-rating\.debug\debug_page.html" + with open(debug_file, 'w', encoding='utf-8') as f: + f.write(html_content) + print(f"页面内容已保存到: {debug_file}") + + # 打印前200个字符用于调试 + print(f"页面前200字符: {repr(html_content[:200])}") + + # 使用html.parser解析器(更稳定) + soup = BeautifulSoup(html_content, 'html.parser') + + # 调试:查看页面中的所有表格 + tables = soup.find_all('table') + print(f"页面中找到 {len(tables)} 个表格") + for idx, t in enumerate(tables): + attrs = str(t.attrs)[:100] + print(f" 表格{idx}: {attrs}") + + # ========== 提取驱动盘数据(第一个wikitable表格) ========== + drive_disks = [] + wikitable_tables = soup.find_all('table', class_='wikitable') + + if wikitable_tables: + table = wikitable_tables[0] + print(f"\n[驱动盘数据] 找到表格,属性: {table.attrs}") + + # 尝试使用正则表达式从HTML字符串中提取驱动盘数据 + print("使用正则表达式提取驱动盘数据...") + + # 匹配驱动盘数据的正则表达式 + drive_disk_pattern = re.compile( + r'.*?\s*' # 图片单元格(可能包含figure标签) + r'([^<]+?)\s*' # 名称 + r'([^<]+?)\s*' # 2件套效果 + r'([^<]+?)\s*' # 简介 + r'\s*([^<]+?)', # 4件套效果 + re.DOTALL + ) + + matches = drive_disk_pattern.findall(str(table)) + print(f"找到 {len(matches)} 个驱动盘匹配") + + for match in matches: + name = match[0].strip().replace('\n', '').replace('\r', '') + effect2 = match[1].strip().replace('\n', '').replace('\r', '') + description = match[2].strip().replace('\n', '').replace('\r', '') + effect4 = match[3].strip().replace('\n', '').replace('\r', '') + + if name: + drive_disk = { + 'name': name, + 'effect_2set': effect2, + 'effect_4set': effect4, + 'description': description, + 'image_url': None + } + drive_disks.append(drive_disk) + print(f" 已提取驱动盘: {name}") + + print(f"\n成功提取 {len(drive_disks)} 个驱动盘") + + # ========== 提取驱动盘搭配推荐数据(包含"怪兽与怪客"等内容的表格) ========== + drive_disk_combinations = [] + + # 在所有表格中查找包含"怪兽与怪客"的表格 + for table in tables: + table_str = str(table) + if '怪兽与怪客' in table_str or '驱动盘' in table_str: + # 使用正则表达式提取搭配数据 + # 格式:搭配名称怪物驱动盘组合 + combination_pattern = re.compile( + r'\s*([^<]+?)\s*(.+?)\s*([^<]+?)\s*', + re.DOTALL + ) + + matches = combination_pattern.findall(table_str) + if len(matches) > 3: # 排除小表格 + print(f"\n[搭配推荐] 找到包含 {len(matches)} 条搭配的表格") + + for match in matches: + combo_name = match[0].strip().replace('\n', '').replace('\r', '') + monsters = match[1].strip().replace('\n', '').replace('\r', '') + disks = match[2].strip().replace('\n', '').replace('\r', '') + + # 清理怪物名称(移除链接标签) + monsters_clean = re.sub(r'<[^>]+>', '', monsters) + monsters_clean = re.sub(r'\s+', ' ', monsters_clean).strip() + + if combo_name and disks: + # 拆分驱动盘组合 + disk_list = [d.strip() for d in disks.split('、') if d.strip()] + + combination = { + 'name': combo_name, + 'monsters': monsters_clean, + 'drive_disks': disk_list + } + drive_disk_combinations.append(combination) + print(f" 已提取搭配: {combo_name} -> {', '.join(disk_list)}") + break + + print(f"\n成功提取 {len(drive_disk_combinations)} 条驱动盘搭配推荐") + + return drive_disks, drive_disk_combinations + + except Exception as e: + print(f"抓取失败: {str(e)}") + import traceback + traceback.print_exc() + return None, None + + +def convert_to_code(name): + """将中文名称转换为code格式(混合策略:特殊名称手动映射 + 普通名称拼音转换)""" + # 特殊名称的手动映射(包含所有已知驱动盘) + special_cases = { + # 重金属系列 + '混沌重金属': 'chaos_heavy_metal', + '獠牙重金属': 'fang_heavy_metal', + '雷暴重金属': 'thunder_heavy_metal', + '炎狱重金属': 'inferno_heavy_metal', + '极地重金属': 'polar_heavy_metal', + + # 爵士系列 + '摇摆爵士': 'swing_jazz', + '混沌爵士': 'chaos_jazz', + '自由爵士': 'free_jazz', + + # 朋克系列 + '激素朋克': 'hormone_punk', + '原始朋克': 'primitive_punk', + + # 迪斯科系列 + '震星迪斯科': 'shocking_disco', + + # 电音系列 + '啄木鸟电音': 'woodpecker_electronic', + '河豚电音': 'pufferfish_electronic', + + # 其他 + '灵魂摇滚': 'soul_rock', + '自由蓝调': 'free_blues', + '折枝剑歌': 'broken_branch_sword_song', + '静听嘉音': 'silent_listen_jia_yin', + '如影相随': 'shadow_follower', + '法厄同之歌': 'song_of_phoebus', + '云岿如我': 'cloud_mountain_self', + '山大王': 'mountain_lord', + '拂晓生花': 'dawn_blossom', + '月光骑士颂': 'moonlight_knight_ode', + '雪兔梦游仙境': 'snow_rabbit_wonderland', + '囚徒手记': 'prisoners_notebook', + '沧浪行歌': 'canglang_song', + '流光咏叹': 'flowing_light_aria' + } + + # 优先检查特殊映射 + if name in special_cases: + return special_cases[name] + + # 默认使用拼音转换 + try: + from pypinyin import lazy_pinyin + pinyin_parts = lazy_pinyin(name) + code = '_'.join(pinyin_parts).lower() + # 移除特殊字符 + code = re.sub(r'[^a-z0-9_]', '', code) + return code + except ImportError: + # 如果没有安装pypinyin,回退到简单处理 + code = re.sub(r'[\s]+', '_', name.strip()) + code = re.sub(r'_+', '_', code) + return code.strip('_').lower() + + +def save_as_yaml(drive_disks, output_dir): + """将驱动盘数据保存为YAML文件""" + os.makedirs(output_dir, exist_ok=True) + + for disk in drive_disks: + code = convert_to_code(disk['name']) + filename = f"{code}.yml" + filepath = os.path.join(output_dir, filename) + + # 获取 mission_type_name(优先使用驱动盘数据中的值,默认为"怪物与怪客") + mission_type = disk.get('mission_type_name', '怪物与怪客') + + # YAML格式 + yaml_content = f'set_name: "{disk["name"]}"\n' + yaml_content += f'mission_type_name: "{mission_type}"\n' + yaml_content += f'code: {code}\n' + + with open(filepath, 'w', encoding='utf-8') as f: + f.write(yaml_content) + + print(f" 已保存: {filename}") + + +def main(): + """主函数""" + print("=" * 60) + print("爬取绝区零驱动盘数据") + print("=" * 60) + + # 1. 抓取数据 + print("\n[步骤1] 抓取驱动盘数据") + drive_disks, drive_disk_combinations = fetch_drive_disk_data() + + if not drive_disks: + drive_disks = [] # 初始化空列表 + + # 2. 根据搭配数据补充驱动盘数据 + print("\n[步骤2] 根据搭配推荐补充驱动盘数据") + if drive_disk_combinations: + # 创建已存在的驱动盘名称集合 + existing_names = {disk['name'] for disk in drive_disks} + + # 从搭配推荐中提取所有驱动盘 + disk_to_mission = {} + for combo in drive_disk_combinations: + mission_name = combo['name'] + for disk_name in combo['drive_disks']: + disk_to_mission[disk_name] = mission_name + + # 如果驱动盘不存在,则创建新的驱动盘数据 + if disk_name not in existing_names: + new_disk = { + 'name': disk_name, + 'effect_2set': '', + 'effect_4set': '', + 'description': '', + 'image_url': None, + 'mission_type_name': mission_name + } + drive_disks.append(new_disk) + existing_names.add(disk_name) + print(f" 从搭配推荐补充: {disk_name} -> {mission_name}") + + # 更新已存在驱动盘的 mission_type_name + for disk in drive_disks: + if disk['name'] in disk_to_mission: + disk['mission_type_name'] = disk_to_mission[disk['name']] + else: + disk['mission_type_name'] = "怪物与怪客" # 默认值 + + # 3. 保存驱动盘数据 + print("\n[步骤3] 保存驱动盘为YAML文件") + output_dir = r"d:\my\project\zzz_drive-disk-rating\.debug\drive_disk" + save_as_yaml(drive_disks, output_dir) + + # 4. 保存搭配推荐数据 + if drive_disk_combinations: + print("\n[步骤4] 保存驱动盘搭配推荐") + combinations_file = r"d:\my\project\zzz_drive-disk-rating\.debug\drive_disk_combinations.yml" + save_combinations_as_yaml(drive_disk_combinations, combinations_file) + + # 5. 打印摘要 + print("\n" + "=" * 60) + print("完成摘要") + print("=" * 60) + print(f"共抓取/补充 {len(drive_disks)} 个驱动盘") + print(f"共提取 {len(drive_disk_combinations)} 条搭配推荐") + print(f"输出目录: {output_dir}") + print("\n驱动盘列表:") + for disk in sorted(drive_disks, key=lambda x: x['name']): + mission = disk.get('mission_type_name', '怪物与怪客') + print(f" - {disk['name']} ({mission})") + + +def save_combinations_as_yaml(combinations, filepath): + """将驱动盘搭配推荐保存为YAML文件""" + yaml_content = "# 驱动盘搭配推荐\n" + yaml_content += "# 格式: 搭配名称 -> [推荐驱动盘1, 推荐驱动盘2]\n\n" + + for combo in combinations: + yaml_content += f"- name: \"{combo['name']}\"\n" + yaml_content += f" monsters: \"{combo['monsters']}\"\n" + yaml_content += " drive_disks:\n" + for disk in combo['drive_disks']: + yaml_content += f" - \"{disk}\"\n" + yaml_content += "\n" + + with open(filepath, 'w', encoding='utf-8') as f: + f.write(yaml_content) + + print(f" 已保存搭配推荐: {os.path.basename(filepath)}") + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/src/zzz/zh/feat_information_management/fetch_engine.py b/src/zzz/zh/feat_information_management/fetch_engine.py new file mode 100644 index 00000000..3d29cc20 --- /dev/null +++ b/src/zzz/zh/feat_information_management/fetch_engine.py @@ -0,0 +1,646 @@ +""" +合并获取音擎信息:先获取英文名、品阶、detail_url,再获取中文名,最后生成yml文件 +""" + +import asyncio +import json +import re +import os +from datetime import datetime +from playwright.async_api import async_playwright, TimeoutError as PlaywrightTimeoutError + +async def wait_for_network_idle(page, timeout=30000): + """等待网络空闲""" + start_time = asyncio.get_event_loop().time() + while asyncio.get_event_loop().time() - start_time < timeout / 1000: + try: + await page.wait_for_load_state("networkidle", timeout=5000) + break + except PlaywrightTimeoutError: + continue + +async def scroll_to_load_all_content(page, max_scrolls=50, scroll_delay=4000): + """滚动页面加载所有懒加载内容""" + print("\n=== 开始滚动加载所有内容 ===") + + initial_count = await page.locator(".tw-flex.tw-p-4.tw-rounded-xl").count() + print(f"初始卡片数量: {initial_count}") + + previous_count = initial_count + scroll_count = 0 + consecutive_no_change = 0 + + while scroll_count < max_scrolls: + try: + await page.evaluate("window.scrollTo(0, document.body.scrollHeight)") + print(f"第 {scroll_count + 1} 次滚动...") + + await page.wait_for_timeout(scroll_delay) + await wait_for_network_idle(page) + + current_count = await page.locator(".tw-flex.tw-p-4.tw-rounded-xl").count() + if current_count == 0: + current_count = await page.locator("[class*='tw-flex'][class*='p-4']").count() + if current_count == 0: + current_count = await page.locator("[class*='card']").count() + + print(f"当前卡片数量: {current_count}") + + if current_count == previous_count: + consecutive_no_change += 1 + if consecutive_no_change >= 3: + print("连续3次没有新增内容,停止滚动") + break + else: + consecutive_no_change = 0 + + previous_count = current_count + scroll_count += 1 + + except Exception as e: + print(f"滚动过程中出错: {e}") + break + + await page.evaluate("window.scrollTo(0, 0)") + await page.wait_for_timeout(500) + + print(f"滚动完成,共滚动 {scroll_count} 次,最终卡片数量: {previous_count}") + return previous_count + +async def process_card(card, context, index): + """处理单个卡片,提取音擎信息""" + try: + name_elem = card.locator(".tw-font-zzz") + name = "" + if await name_elem.count() > 0: + name = await name_elem.first.text_content() + name = name.strip() if name else "未知" + else: + name = "未知" + + print(f"\n=== 处理第 {index} 个卡片: {name} ===") + + new_page_event = asyncio.Event() + found_page = None + + async def handle_new_page(page): + nonlocal found_page, new_page_event + try: + await page.wait_for_load_state("domcontentloaded", timeout=10000) + if "/entry/" in page.url: + found_page = page + new_page_event.set() + except: + pass + + context.on("page", handle_new_page) + + try: + await card.click() + + try: + await asyncio.wait_for(new_page_event.wait(), timeout=15) + except asyncio.TimeoutError: + print(f"✗ 第 {index} 个卡片 - 超时未找到新页面") + return { + "success": False, + "index": index, + "card": card, + "name": name, + "data": None + } + + if found_page: + url = found_page.url + match = re.search(r'/entry/(\d+)', url) + if match: + entry_id = match.group(1) + detail_url = f"https://wiki.hoyolab.com/pc/zzz/entry/{entry_id}?lang=en-us" + print(f"✓ 第 {index} 个卡片 - 成功提取entry_id: {entry_id}") + + await found_page.close() + else: + print(f"✗ 第 {index} 个卡片 - URL中未找到entry_id") + if found_page != context.pages[0]: + await found_page.close() + return { + "success": False, + "index": index, + "card": card, + "name": name, + "data": None + } + else: + print(f"✗ 第 {index} 个卡片 - 未找到新页面") + return { + "success": False, + "index": index, + "card": card, + "name": name, + "data": None + } + finally: + context.remove_listener("page", handle_new_page) + + # 正确的稀有度获取逻辑:从带有 alt="rarity" 的 img 标签的 src 中提取 + rarity_num = "" + rarity_elem = card.locator("img[alt='rarity']") + if await rarity_elem.count() > 0: + src = await rarity_elem.first.get_attribute("src") + if src: + # 从 src 中提取文件名(如 "/_nuxt/img/other_s.6038bbd.png" -> "other_s") + filename = src.split('/')[-1].split('.')[0] + # 根据文件名映射稀有度(直接使用字母) + rarity_filename_map = { + "other_s": "S", # S级 + "other_a": "A", # A级 + "other_b": "B", # B级 + "other_c": "C" # C级 + } + rarity_num = rarity_filename_map.get(filename, "") + + print(f" 稀有度获取结果: {rarity_num} (src: {src if src else '未找到'})") + + attr_elem = card.locator(".tw-w-8.tw-h-8") + attr = "" + if await attr_elem.count() > 0: + attr = await attr_elem.first.get_attribute("class") + + attr_name = "" + if attr: + if "physics" in attr.lower(): + attr_name = "物理" + elif "fire" in attr.lower(): + attr_name = "火" + elif "electric" in attr.lower(): + attr_name = "电" + elif "ice" in attr.lower(): + attr_name = "冰" + elif "ether" in attr.lower(): + attr_name = "以太" + + # 输出调试信息 + print(f" ├─ 英文名: {name}") + print(f" ├─ 品级: {rarity_num}") + print(f" ├─ 属性: {attr_name}") + print(f" └─ detail_url: {detail_url}") + + return { + "success": True, + "index": index, + "card": None, + "name": name, + "data": { + "index": index, + "name": name, + "rarity": rarity_num, + "attribute": attr_name, + "entry_id": entry_id, + "detail_url": detail_url + } + } + + except Exception as e: + print(f"处理卡片时出错: {e}") + return { + "success": False, + "index": index, + "card": card, + "name": "未知", + "data": None + } + +async def fetch_engine_detail_urls_inner(): + """内部函数:执行实际的音擎数据获取""" + + en_url = "https://wiki.hoyolab.com/pc/zzz/aggregate/11?lang=en-us" + engine_data = [] + + async with async_playwright() as p: + browser = await p.chromium.launch( + headless=True, + args=[ + "--disable-blink-features=AutomationControlled", + "--window-size=1920,1080", + "--disable-gpu", + "--no-sandbox", + "--disable-dev-shm-usage", + ] + ) + + context = await browser.new_context( + viewport={"width": 1920, "height": 1080}, + locale="en-US", + ) + + page = await context.new_page() + page.set_default_timeout(180000) + + try: + print("访问英文版音擎列表页面...") + await page.goto(en_url, wait_until="domcontentloaded") + print("等待页面DOM加载完成...") + await page.wait_for_timeout(10000) + print("等待网络空闲...") + await wait_for_network_idle(page) + + print("等待卡片容器...") + try: + await page.wait_for_selector(".tw-grid", timeout=30000) + print("找到卡片容器") + except PlaywrightTimeoutError: + print("未找到卡片容器") + + await page.wait_for_timeout(5000) + + await scroll_to_load_all_content(page) + + cards = page.locator(".tw-flex.tw-p-4.tw-rounded-xl") + total_cards = await cards.count() + print(f"\n找到 {total_cards} 个卡片") + + results = [None] * total_cards + failed_tasks = [] + + print("\n=== 开始串行处理卡片 ===") + + for i in range(total_cards): + card = cards.nth(i) + index = i + 1 + result = await process_card(card, context, index) + + if result["success"]: + results[index - 1] = result["data"] + else: + failed_tasks.append(result) + + await asyncio.sleep(1) + + success_count = sum(1 for r in results if r is not None) + fail_count = len(failed_tasks) + print(f"\n串行处理完成: 成功 {success_count} 个, 失败 {fail_count} 个") + + if fail_count > 0: + print(f"\n=== 开始重试失败的任务(最多5次) ===") + max_retries = 5 + + for retry_num in range(max_retries): + if not failed_tasks: + break + + print(f"\n--- 第 {retry_num + 1} 次重试 ---") + current_failed = failed_tasks.copy() + failed_tasks = [] + + for task in current_failed: + print(f"\n重试第 {task['index']} 个卡片: {task['name']}") + result = await process_card(task["card"], context, task["index"]) + + if result["success"]: + results[task["index"] - 1] = result["data"] + print(f"✓ 重试成功") + else: + failed_tasks.append(result) + print(f"✗ 重试失败") + + success_count = sum(1 for r in results if r is not None) + fail_count = len(failed_tasks) + print(f"第 {retry_num + 1} 次重试完成: 成功 {success_count} 个, 仍失败 {fail_count} 个") + + success_count = sum(1 for r in results if r is not None) + fail_count = len(failed_tasks) + print(f"\n=== 最终结果 ===") + print(f"总卡片数: {total_cards}") + print(f"成功: {success_count} 个") + print(f"失败: {fail_count} 个") + + if fail_count > 0: + print("\n失败的卡片:") + for task in failed_tasks: + print(f" - 第 {task['index']} 个: {task['name']}") + + engine_data = [r for r in results if r is not None] + engine_data.sort(key=lambda x: x["index"]) + + output_file = "engines_en_updated.json" + with open(output_file, "w", encoding="utf-8") as f: + json.dump(engine_data, f, ensure_ascii=False, indent=2) + + print(f"\n结果已保存到 {output_file}") + + return engine_data, True + + except Exception as e: + print(f"出错: {e}") + import traceback + traceback.print_exc() + return None, False + finally: + await browser.close() + print("浏览器已关闭") + +async def fetch_engine_detail_urls(): + """获取音擎的detail_url(带重试机制)""" + + max_retries = 3 # 最大重试次数 + retry_delay = 5 # 基础重试延迟(秒) + + for attempt in range(max_retries): + print(f"\n=== 第 {attempt + 1} 次尝试获取音擎数据 ===") + + engine_data, success = await fetch_engine_detail_urls_inner() + + if success and engine_data: + print(f"\n✓ 第 {attempt + 1} 次尝试成功") + return engine_data + + if attempt < max_retries - 1: + # 指数退避等待 + wait_time = retry_delay * (2 ** attempt) + print(f"\n第 {attempt + 1} 次尝试失败,等待 {wait_time} 秒后重试...") + await asyncio.sleep(wait_time) + + print(f"\n✗ 已尝试 {max_retries} 次,均失败") + return None + +async def fetch_with_browser(browser_tasks, browser_index, retry_mode=False): + """单个浏览器实例处理一批任务""" + async with async_playwright() as p: + browser = await p.chromium.launch( + headless=True, + args=[ + "--disable-blink-features=AutomationControlled", + "--window-size=1920,1080", + "--disable-gpu", + "--no-sandbox", + "--disable-dev-shm-usage", + "--disable-software-rasterizer", + "--disable-extensions", + ] + ) + + context = await browser.new_context( + viewport={"width": 1920, "height": 1080}, + locale="zh-CN", + user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" + ) + + page = await context.new_page() + page.set_default_timeout(60000) # 增加超时时间到60秒 + + results = [] + + try: + for task in browser_tasks: + detail_url = task["detail_url"] + index = task["index"] + name = task["english_name"] if retry_mode else task["name"] + + chinese_url = detail_url.replace('lang=en-us', 'lang=zh-cn') + + try: + # 请求前添加随机延迟,避免被限流 + await page.wait_for_timeout(500 + (1000 if retry_mode else 0)) + + await page.goto(chinese_url, wait_until='domcontentloaded') + await page.wait_for_load_state('networkidle', timeout=30000) + await page.wait_for_timeout(1500) + + title = await page.title() + + match = re.match(r'(.+?)\s*-\s*HoYoWiki', title) + if match: + chinese_name = match.group(1).strip() + chinese_name = re.sub(r'\s*-\s*绝区零\s*$', '', chinese_name) + if chinese_name and len(chinese_name) > 1 and chinese_name != 'Welcome to HoYoWiki': + if retry_mode: + print(f" ✓ 重试 浏览器{browser_index} 第 {index} 个: {name} -> {chinese_name}") + else: + print(f"✓ 浏览器{browser_index} 第 {index} 个: {name} -> {chinese_name}") + results.append({ + "success": True, + "index": index, + "english_name": name, + "chinese_name": chinese_name, + "detail_url": detail_url, + "chinese_url": chinese_url + }) + continue + + if retry_mode: + print(f" ✗ 重试 浏览器{browser_index} 第 {index} 个: {name} - 未获取到中文名称") + else: + print(f"✗ 浏览器{browser_index} 第 {index} 个: {name} - 未获取到中文名称") + results.append({ + "success": False, + "index": index, + "english_name": name, + "chinese_name": "", + "detail_url": detail_url, + "chinese_url": chinese_url + }) + + except PlaywrightTimeoutError: + if retry_mode: + print(f" ✗ 重试 浏览器{browser_index} 第 {index} 个: {name} - 超时") + else: + print(f"✗ 浏览器{browser_index} 第 {index} 个: {name} - 超时") + results.append({ + "success": False, + "index": index, + "english_name": name, + "chinese_name": "", + "detail_url": detail_url, + "chinese_url": "" + }) + except Exception as e: + if retry_mode: + print(f" ✗ 重试 浏览器{browser_index} 第 {index} 个: {name} - 出错: {e}") + else: + print(f"✗ 浏览器{browser_index} 第 {index} 个: {name} - 出错: {e}") + results.append({ + "success": False, + "index": index, + "english_name": name, + "chinese_name": "", + "detail_url": detail_url, + "chinese_url": "" + }) + + finally: + await page.close() + await context.close() + await browser.close() + + return results + +async def run_with_semaphore(semaphore, browser_tasks, browser_index, retry_mode=False): + """使用信号量限制并发浏览器数量""" + async with semaphore: + return await fetch_with_browser(browser_tasks, browser_index, retry_mode) + +async def fetch_all_chinese_names(engine_data): + """异步获取所有音擎的中文名称(整合重试机制,最多100轮)""" + + total_items = len(engine_data) + print(f"\n共 {total_items} 个音擎需要处理中文名") + + max_concurrent_browsers = 10 # 最大并发浏览器数 + semaphore = asyncio.Semaphore(max_concurrent_browsers) + + # 初始化待处理任务列表 + pending_tasks = [] + for item in engine_data: + pending_tasks.append({ + "detail_url": item["detail_url"], + "index": item["index"], + "name": item["name"] + }) + + success_results = [] + max_rounds = 100 + + for round_num in range(max_rounds): + if not pending_tasks: + break + + current_round = round_num + 1 + print(f"\n=== 第 {current_round} 轮:处理 {len(pending_tasks)} 个任务 ===") + + num_browsers = min(len(pending_tasks), max_concurrent_browsers) + items_per_browser = (len(pending_tasks) + num_browsers - 1) // num_browsers + + if current_round == 1: + print(f"将创建 {num_browsers} 个浏览器实例(最大并发数: {max_concurrent_browsers}),平均每个处理约 {items_per_browser} 个任务") + for i in range(num_browsers): + start = i * items_per_browser + end = min(start + items_per_browser, len(pending_tasks)) + print(f" 浏览器{i+1} 处理任务: 第 {pending_tasks[start]['index']}-{pending_tasks[end-1]['index']} 个(共 {end-start} 个)") + + browser_task_groups = [] + for i in range(num_browsers): + start = i * items_per_browser + end = min(start + items_per_browser, len(pending_tasks)) + browser_task_groups.append(pending_tasks[start:end]) + + browser_tasks = [] + for i, browser_tasks_list in enumerate(browser_task_groups): + task = asyncio.create_task(run_with_semaphore(semaphore, browser_tasks_list, i + 1, retry_mode=(current_round > 1))) + browser_tasks.append(task) + + all_results = await asyncio.gather(*browser_tasks) + + round_results = [] + for browser_result in all_results: + round_results.extend(browser_result) + + new_success = [r for r in round_results if r["success"]] + pending_tasks = [r for r in round_results if not r["success"]] + success_results.extend(new_success) + + print(f"本轮成功: {len(new_success)} 个") + print(f"仍失败: {len(pending_tasks)} 个") + + # 如果还有失败的任务且不是最后一轮,等待后继续 + if pending_tasks and current_round < max_rounds: + wait_time = min(3 * current_round, 30) + print(f"\n等待{wait_time}秒后进行下一轮...") + await asyncio.sleep(wait_time) + + success_count = len(success_results) + fail_count = len(pending_tasks) + found_chinese_count = sum(1 for r in success_results if r["chinese_name"]) + + print(f"\n=== 最终结果 ===") + print(f"成功请求: {success_count} 个") + print(f"获取到中文名称: {found_chinese_count} 个") + print(f"请求失败: {fail_count} 个") + + for result in success_results: + for item in engine_data: + if item["index"] == result["index"]: + item["chinese_name"] = result["chinese_name"] + item["chinese_url"] = result["chinese_url"] + break + + output_file = "engines_with_chinese.json" + with open(output_file, "w", encoding="utf-8") as f: + json.dump(engine_data, f, ensure_ascii=False, indent=2) + + print(f"\n结果已保存到 {output_file}") + + return engine_data + +def generate_yml_files(engine_data, output_dir="engine_weapon"): + """为每个音擎生成yml文件""" + # 获取项目根目录(.debug的上级目录) + project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + output_path = os.path.join(project_root, output_dir) + os.makedirs(output_path, exist_ok=True) + + for item in engine_data: + chinese_name = item.get("chinese_name", item.get("name", "未知")) + rarity_num = item.get("rarity", "") + + # 稀有度已经是字母格式(S/A/B/C),直接使用 + # 如果为空则默认设为"B" + rarity = rarity_num if rarity_num else "B" + + english_name = item.get("name", "未知") + + # 使用英文名作为文件名(code) + file_name = f"{english_name}.yml" + file_path = os.path.join(output_path, file_name) + + yml_content = f"""weapon_name: {chinese_name} +rarity: {rarity} +code: "{english_name}" +""" + + with open(file_path, "w", encoding="utf-8") as f: + f.write(yml_content) + + print(f"已生成: {file_path}") + + print(f"\n共生成 {len(engine_data)} 个yml文件") + +async def main(): + """主函数:先获取detail_url,再获取中文名,最后生成yml文件""" + + # 获取今天的日期(格式:YYYY-M-D) + today = datetime.now() + date_str = f"{today.year}-{today.month}-{today.day}" + data_file = f"engines_data_{date_str}.json" + + print(f"今日日期: {date_str}") + print(f"数据文件: {data_file}") + + # 检查是否存在今日的数据文件 + if os.path.exists(data_file): + print(f"\n=== 发现今日数据文件,跳过第一步 ===") + with open(data_file, "r", encoding="utf-8") as f: + engine_data = json.load(f) + print(f"已从 {data_file} 加载 {len(engine_data)} 条数据") + else: + print("=== 第一步:获取音擎的英文名、品阶、detail_url ===") + engine_data = await fetch_engine_detail_urls() + + if not engine_data: + print("未获取到音擎数据,程序退出") + return + + # 保存为日期命名的json文件 + with open(data_file, "w", encoding="utf-8") as f: + json.dump(engine_data, f, ensure_ascii=False, indent=2) + print(f"\n数据已保存到 {data_file}") + + print("\n=== 第二步:获取音擎的中文名称 ===") + engine_data = await fetch_all_chinese_names(engine_data) + + print("\n=== 第三步:生成yml文件 ===") + generate_yml_files(engine_data) + + print("\n=== 全部完成 ===") + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file From e0e1a99678bd103edb6c0348f2e150fbdacb5635 Mon Sep 17 00:00:00 2001 From: Cheer Date: Wed, 29 Apr 2026 23:26:58 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B8=89=E4=B8=AA?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=8A=93=E5=8F=96=E8=84=9A=E6=9C=AC=EF=BC=9A?= =?UTF-8?q?=201.=20fetch=5Fdrive=5Fdisk.py=20-=20=E8=90=8C=E5=A8=98?= =?UTF-8?q?=E7=99=BE=E7=A7=91=E9=A9=B1=E5=8A=A8=E7=9B=98=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=8A=93=E5=8F=96=202.=20fetch=5Fagent.py=20-=20=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E6=95=B0=E6=8D=AE=E6=8A=93=E5=8F=96=203.=20fetch=5Fen?= =?UTF-8?q?gine.py=20-=20=E9=9F=B3=E6=93=8E=E6=95=B0=E6=8D=AE=E6=8A=93?= =?UTF-8?q?=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fetch_agent.py | 493 ------------- .../fetch_drive_disk.py | 398 ----------- .../fetch_engine.py | 646 ------------------ 3 files changed, 1537 deletions(-) delete mode 100644 src/zzz/zh/feat_information_management/fetch_agent.py delete mode 100644 src/zzz/zh/feat_information_management/fetch_drive_disk.py delete mode 100644 src/zzz/zh/feat_information_management/fetch_engine.py diff --git a/src/zzz/zh/feat_information_management/fetch_agent.py b/src/zzz/zh/feat_information_management/fetch_agent.py deleted file mode 100644 index e3310105..00000000 --- a/src/zzz/zh/feat_information_management/fetch_agent.py +++ /dev/null @@ -1,493 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -爬取角色数据并转换为指定格式(异步版本) -""" - -import json -import os -import time -import re -import asyncio -import aiohttp -from bs4 import BeautifulSoup -from urllib.parse import quote - -# 属性映射 -ELEMENT_MAP = { - '电': 'ELECTRIC', - '以太': 'ETHEREAL', - '物理': 'PHYSICAL', - '冰': 'ICE', - '凛刃': 'FROST', - '火': 'FIRE', -} - -# 默认角色类型映射(根据属性推断) -ELEMENT_TO_AGENT_TYPE = { - 'ELECTRIC': 'STUN', - 'ETHEREAL': 'BUFF', - 'PHYSICAL': 'ATK', - 'ICE': 'FREEZE', - 'FROST': 'ATK', - 'FIRE': 'BURNING', - 'WIND': 'ATK', - 'VOID': 'ATK' -} - -# 并发控制 -MAX_CONCURRENT_REQUESTS = 10 - -def load_character_data(json_path='character_data.json'): - """从JSON文件加载角色数据""" - try: - with open(json_path, 'r', encoding='utf-8') as f: - data = json.load(f) - return data - except Exception as e: - print(f"加载角色数据失败: {str(e)}") - return None - -def extract_character_names(character_images): - """从图片名称中提取角色名""" - character_names = [] - for img_name in character_images: - # 去掉 "角色-" 前缀和 ".png" 后缀 - if img_name.startswith('角色-') and img_name.endswith('.png'): - char_name = img_name[3:-4] # 去掉前缀和后缀 - character_names.append(char_name) - return character_names - -async def extract_character_names_from_web(session): - """从角色图鉴网页中提取角色名称(异步版)""" - url = 'https://wiki.biligame.com/zzz/%E8%A7%92%E8%89%B2%E5%9B%BE%E9%89%B4' - - headers = { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', - 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', - 'Referer': 'https://wiki.biligame.com/zzz/' - } - - try: - print(f"正在从网页获取角色图鉴数据: {url}") - async with session.get(url, headers=headers, timeout=30) as response: - if response.status != 200: - print(f"请求失败,状态码: {response.status}") - return [] - - text = await response.text(encoding='utf-8') - soup = BeautifulSoup(text, 'html.parser') - role_boxes = soup.select('#CardSelectTr .role-box') - character_names = [] - - for box in role_boxes: - name_tag = box.select_one('.role-name a') - if name_tag: - character_names.append(name_tag.get_text(strip=True)) - - return character_names - except Exception as e: - print(f"从网页提取角色名称失败: {str(e)}") - return [] - -async def fetch_character_detail(session, char_name, semaphore): - """抓取单个角色的详细数据(异步版)""" - # URL 编码角色名 - encoded_name = quote(char_name, safe='') - url = f"https://wiki.biligame.com/zzz/{encoded_name}" - - headers = { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', - 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', - 'Referer': 'https://wiki.biligame.com/zzz/' - } - - async with semaphore: - try: - print(f" 正在抓取: {char_name}") - async with session.get(url, headers=headers, timeout=30) as response: - if response.status != 200: - print(f" 请求失败,状态码: {response.status}") - return None - - text = await response.text(encoding='utf-8') - soup = BeautifulSoup(text, 'html.parser') - - # 提取角色基本信息 - character_info = { - 'name': char_name, - 'url': url, - 'encoded_name': encoded_name, - 'fetch_time': time.strftime('%Y-%m-%d %H:%M:%S') - } - - # 1. 查找角色名称 - title = soup.find('h1', {'id': 'firstHeading'}) - if title: - character_info['title'] = title.get_text(strip=True) - - # 2. 查找角色信息表格 - info_table = soup.find('table', class_=['wikitable', 'infobox']) - if info_table: - info_dict = {} - rows = info_table.find_all('tr') - for row in rows: - th = row.find('th') - td = row.find('td') - if th and td: - key = th.get_text(strip=True) - value = td.get_text(strip=True) - info_dict[key] = value - # 提取全名和英文名称 - if '全名' in key or '本名' in key: - # 支持中文括号和英文括号 - match = re.match(r'(.+?)\s*[((](.+?)[))]', value) - if match: - character_info['full_name'] = match.group(1).strip() - # 将英文名称中的空格替换为下划线 - character_info['english_name'] = match.group(2).strip().replace(' ', '_') - else: - character_info['full_name'] = value.strip() - character_info['english_name'] = None - # 提取属性/元素 - if '属性' in key or '元素' in key or '元素属性' in key: - # 当td中包含img标签时,提取img之后的文本内容 - if td.find('img'): - # 获取img之后的所有文本内容 - element_text = '' - for content in td.contents: - # 跳过img标签 - if hasattr(content, 'name') and content.name == 'img': - continue - # 提取文本内容 - text_content = str(content).strip() - if text_content: - element_text += text_content - character_info['element'] = element_text.strip() - else: - character_info['element'] = value.strip() - # 提取稀有度/品级 - if '稀有度' in key or '品级' in key: - # 稀有度通过图片的alt属性标识,如"角色稀有度S.png" - img_tag = td.find('img') - if img_tag: - alt_text = img_tag.get('alt', '') - # 从alt文本中提取稀有度等级(S/A/B/C) - if '稀有度' in alt_text: - # 查找稀有度等级字母 - match = re.search(r'稀有度([SABC])', alt_text) - if match: - character_info['rarity'] = match.group(1) - else: - # 如果没有匹配到,尝试从文件名中提取 - filename = alt_text.replace('.png', '') - if 'S' in filename: - character_info['rarity'] = 'S' - elif 'A' in filename: - character_info['rarity'] = 'A' - elif 'B' in filename: - character_info['rarity'] = 'B' - elif 'C' in filename: - character_info['rarity'] = 'C' - else: - character_info['rarity'] = value.strip() - # 提取特性 - if '特性' in key: - # 特性通过图片的alt属性标识,如"图标-强攻.png" - img_tag = td.find('img') - if img_tag: - alt_text = img_tag.get('alt', '') - # 从alt文本中提取特性名称(去掉"图标-"和".png") - if '图标-' in alt_text and '.png' in alt_text: - character_info['trait'] = alt_text.replace('图标-', '').replace('.png', '') - else: - # 如果alt属性不符合预期格式,使用td中的文本 - character_info['trait'] = value.strip() - else: - character_info['trait'] = value.strip() - character_info['basic_info'] = info_dict - - # 3. 提取立绘图片URL(官方介绍,非官方介绍2) - character_info['stand_art_url'] = extract_stand_art_url(soup, char_name) - - print(f" ✓ 成功抓取: {char_name}") - return character_info - - except Exception as e: - print(f" ✗ 抓取角色 {char_name} 失败: {str(e)}") - return None - -def extract_stand_art_url(soup, char_name): - """从HTML中提取立绘图片URL(纯立绘,排除官方介绍)""" - try: - # 查找所有包含"角色立绘"的图片 - images = soup.find_all('img', alt=re.compile(r'角色立绘')) - - for img in images: - alt_text = img.get('alt', '') - # 排除包含"官方介绍"的图片,只选择纯"角色立绘-XXX.png" - if '角色立绘' in alt_text and '官方介绍' not in alt_text: - img_url = img.get('src') - if img_url: - print(f" 找到立绘图片: {alt_text}") - return img_url - - print(f" 未找到立绘图片(纯立绘)") - return None - except Exception as e: - print(f" 提取立绘图片URL失败: {str(e)}") - return None - -async def download_stand_art(session, img_url, output_path, english_name): - """下载立绘图片到指定路径(异步版)""" - if not img_url: - print(f" 图片URL为空,跳过下载") - return False - - try: - # 确保输出目录存在 - os.makedirs(output_path, exist_ok=True) - - # 构建文件名 - filename = f"{english_name}.png" - filepath = os.path.join(output_path, filename) - - # 检查文件是否已存在 - if os.path.exists(filepath): - print(f" 文件已存在,跳过下载: {filepath}") - return True - - # 下载图片 - headers = { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', - 'Referer': 'https://wiki.biligame.com/zzz/' - } - - print(f" 正在下载立绘图片: {img_url}") - async with session.get(img_url, headers=headers, timeout=30) as response: - if response.status != 200: - print(f" 下载失败,状态码: {response.status}") - return False - - # 保存图片 - with open(filepath, 'wb') as f: - f.write(await response.read()) - - print(f" ✓ 立绘图片已保存: {filepath}") - return True - - except Exception as e: - print(f" 下载立绘图片失败: {str(e)}") - return False - -async def fetch_all_characters(session, character_names): - """抓取所有角色的详细数据(异步版)""" - # 创建信号量限制并发数 - semaphore = asyncio.Semaphore(MAX_CONCURRENT_REQUESTS) - - print(f"开始抓取 {len(character_names)} 个角色的详细数据...") - print("=" * 60) - - # 创建所有任务 - tasks = [fetch_character_detail(session, char_name, semaphore) for char_name in character_names] - - # 并发执行 - results = await asyncio.gather(*tasks) - - # 分离成功和失败的结果 - all_characters = [r for r in results if r is not None] - failed_characters = [name for name, result in zip(character_names, results) if result is None] - - print("\n" + "=" * 60) - print(f"抓取完成: 成功 {len(all_characters)} 个, 失败 {len(failed_characters)} 个") - - return { - 'fetch_time': time.strftime('%Y-%m-%d %H:%M:%S'), - 'total': len(character_names), - 'success': len(all_characters), - 'failed': len(failed_characters), - 'failed_list': failed_characters, - 'characters': all_characters - } - -def convert_format(data): - """将数据转换为指定格式""" - if not data: - return None - - characters = data.get('characters', []) - result = { - "character": {} - } - - for char in characters: - # 获取英文名称作为键名 - english_name = char.get('english_name') - if not english_name: - # 如果没有英文名称,使用角色名作为键名 - english_name = char.get('name') - - # 构建角色数据 - char_data = { - "CHS": char.get('full_name', char.get('name')), - "EN": english_name, - "code": english_name, - "element": char.get('element', ''), - "rarity": char.get('rarity', ''), - "trait": char.get('trait', '') - } - - # 添加到结果中 - result["character"][english_name] = char_data - - return result - -def save_agent_yml(char_data, output_dir): - """将单个角色数据保存为YAML文件(直接使用原始数据,不进行属性映射)""" - # 获取数据(直接使用原始值) - chs_name = char_data.get('CHS', '') - code = char_data.get('code', '').lower() - element = char_data.get('element', '') - rarity = char_data.get('rarity', '') - trait = char_data.get('trait', '') - - # 构建YAML内容(忽略weight,将特性填充到agent_type) - yml_content = f"""agent_name: {chs_name} -agent_type: {trait} -dmg_type: {element} -rare_type: {rarity} -code: {code} -""" - - # 确保输出目录存在 - os.makedirs(output_dir, exist_ok=True) - - # 构建文件名 - filename = f"{code}.yml" - filepath = os.path.join(output_dir, filename) - - # 保存文件 - with open(filepath, 'w', encoding='utf-8') as f: - f.write(yml_content) - - return filepath - -def save_all_agent_yml(data, output_dir): - """保存所有角色为单独的YAML文件""" - if not data: - return [] - - saved_files = [] - characters = data.get('character', {}) - - for code, char_data in characters.items(): - filepath = save_agent_yml(char_data, output_dir) - saved_files.append(filepath) - print(f" 已保存: {filepath}") - - return saved_files - -def save_converted_data(data, filename='converted_character_data.json'): - """保存转换后的数据""" - if data: - script_dir = os.path.dirname(os.path.abspath(__file__)) - filepath = os.path.join(script_dir, filename) - with open(filepath, 'w', encoding='utf-8') as f: - json.dump(data, f, ensure_ascii=False, indent=2) - print(f"数据已保存到: {filepath}") - return filepath - -async def main(): - """主函数(异步版)""" - print("=" * 60) - print("角色数据抓取与格式转换工具(异步版)") - print("=" * 60) - - # 创建异步HTTP会话 - async with aiohttp.ClientSession() as session: - # 1. 从网页中提取角色名称 - print("\n从角色图鉴网页提取角色名称...") - character_names = await extract_character_names_from_web(session) - - if not character_names: - print("无法从网页提取角色名称") - return - - print(f"\n从网页中提取到 {len(character_names)} 个角色名:") - for i, name in enumerate(character_names[:10], 1): - print(f" {i}. {name}") - if len(character_names) > 10: - print(f" ... 还有 {len(character_names) - 10} 个角色") - - # 2. 异步抓取所有角色的详细数据 - start_time = time.time() - all_data = await fetch_all_characters(session, character_names) - end_time = time.time() - print(f"\n异步抓取耗时: {end_time - start_time:.2f} 秒") - - # 3. 转换格式 - print("\n转换数据格式...") - converted_data = convert_format(all_data) - - if not converted_data: - print("转换失败") - return - - # 4. 保存数据 - output_path = save_converted_data(converted_data) - - # 5. 保存每个角色为单独的YAML文件 - print("\n" + "=" * 60) - print("保存角色YAML文件") - print("=" * 60) - agent_output_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'agent') - saved_files = save_all_agent_yml(converted_data, agent_output_dir) - print(f"\n✓ 已保存 {len(saved_files)} 个角色YAML文件到: {agent_output_dir}") - - # 6. 下载第一个角色的立绘图片 - print("\n" + "=" * 60) - print("下载立绘图片") - print("=" * 60) - - if all_data['characters']: - first_char = all_data['characters'][0] - english_name = first_char.get('english_name') - stand_art_url = first_char.get('stand_art_url') - - if english_name and stand_art_url: - print(f"\n下载第一个角色的立绘图片:") - print(f" 角色名: {first_char.get('name')}") - print(f" 英文名: {english_name}") - print(f" 图片URL: {stand_art_url}") - - # 获取脚本所在目录 - script_dir = os.path.dirname(os.path.abspath(__file__)) - output_dir = os.path.join(script_dir, 'agent_stand_art') - - # 下载立绘图片 - success = await download_stand_art(session, stand_art_url, output_dir, english_name) - - if success: - print(f"\n✓ 立绘图片下载成功") - else: - print(f"\n✗ 立绘图片下载失败") - else: - print(f"\n第一个角色没有立绘图片信息") - print(f" 英文名: {english_name}") - print(f" 图片URL: {stand_art_url}") - - # 6. 打印摘要 - print("\n" + "=" * 60) - print("处理摘要") - print("=" * 60) - print(f"总角色数: {all_data['total']}") - print(f"成功: {all_data['success']}") - print(f"失败: {all_data['failed']}") - print(f"转换角色数: {len(converted_data.get('character', {}))}") - print(f"输出文件: {output_path}") - -if __name__ == '__main__': - # 运行异步主函数 - asyncio.run(main()) diff --git a/src/zzz/zh/feat_information_management/fetch_drive_disk.py b/src/zzz/zh/feat_information_management/fetch_drive_disk.py deleted file mode 100644 index 37b23431..00000000 --- a/src/zzz/zh/feat_information_management/fetch_drive_disk.py +++ /dev/null @@ -1,398 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -爬取萌娘百科绝区零驱动盘数据 -来源:https://mzh.moegirl.org.cn/%E7%BB%9D%E5%8C%BA%E9%9B%B6/%E9%A9%B1%E5%8A%A8%E7%9B%98 -输出:YAML格式文件,存储在 drive_disk 文件夹中 -""" - -import requests -from bs4 import BeautifulSoup -import os -import re -import time - - -def fetch_drive_disk_data(): - """抓取驱动盘数据""" - url = "https://mzh.moegirl.org.cn/%E7%BB%9D%E5%8C%BA%E9%9B%B6/%E9%A9%B1%E5%8A%A8%E7%9B%98" - delay = 3 # 请求间隔,避免被风控 - - # 创建Session对象,维持连接 - session = requests.Session() - - # 设置更多请求头信息 - headers = { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36', - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', - 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', - 'Accept-Encoding': 'gzip, deflate, br', - 'Connection': 'keep-alive', - 'Referer': 'https://mzh.moegirl.org.cn/', - 'Cache-Control': 'max-age=0', - 'Upgrade-Insecure-Requests': '1' - } - session.headers.update(headers) - - try: - print(f"正在抓取驱动盘数据: {url}") - - # 先访问主页获取Cookie - print(" 正在获取初始Cookie...") - session.get('https://mzh.moegirl.org.cn/', timeout=30) - time.sleep(delay) - - # 添加延迟避免频繁请求 - time.sleep(delay) - - # 发送请求 - response = session.get(url, timeout=30) - response.encoding = 'utf-8' - - print(f"响应状态码: {response.status_code}") - - # 检查是否被限流 - if response.status_code == 429: - print('访问太频繁,自动暂停120s') - time.sleep(120) - # 重新请求 - response = session.get(url, timeout=30) - response.encoding = 'utf-8' - - if response.status_code != 200: - print(f"请求失败,状态码: {response.status_code}") - print("尝试调整请求头后重试...") - - # 尝试调整User-Agent - session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' - time.sleep(delay) - - response = session.get(url, timeout=30) - response.encoding = 'utf-8' - - print(f"重试响应状态码: {response.status_code}") - - if response.status_code != 200: - print("无法从URL获取数据") - return None, None - - # 检查响应内容类型,处理可能的压缩 - content_encoding = response.headers.get('Content-Encoding', '') - print(f"响应头 Content-Encoding: {content_encoding}") - print(f"响应头 Content-Type: {response.headers.get('Content-Type')}") - - # 根据压缩方式解压内容 - raw_content = response.content - try: - if 'br' in content_encoding: - import brotli - html_content = brotli.decompress(raw_content).decode('utf-8') - print("使用 Brotli 解压成功") - elif 'gzip' in content_encoding: - import gzip - html_content = gzip.decompress(raw_content).decode('utf-8') - print("使用 gzip 解压成功") - elif 'deflate' in content_encoding: - import zlib - html_content = zlib.decompress(raw_content, zlib.MAX_WBITS | 16).decode('utf-8') - print("使用 zlib 解压成功") - else: - html_content = response.text - print("无需解压") - except Exception as e: - print(f"解压失败: {e}") - html_content = response.text - - print(f"响应内容长度: {len(html_content)}") - - # 保存获取到的HTML内容用于调试 - debug_file = r"d:\my\project\zzz_drive-disk-rating\.debug\debug_page.html" - with open(debug_file, 'w', encoding='utf-8') as f: - f.write(html_content) - print(f"页面内容已保存到: {debug_file}") - - # 打印前200个字符用于调试 - print(f"页面前200字符: {repr(html_content[:200])}") - - # 使用html.parser解析器(更稳定) - soup = BeautifulSoup(html_content, 'html.parser') - - # 调试:查看页面中的所有表格 - tables = soup.find_all('table') - print(f"页面中找到 {len(tables)} 个表格") - for idx, t in enumerate(tables): - attrs = str(t.attrs)[:100] - print(f" 表格{idx}: {attrs}") - - # ========== 提取驱动盘数据(第一个wikitable表格) ========== - drive_disks = [] - wikitable_tables = soup.find_all('table', class_='wikitable') - - if wikitable_tables: - table = wikitable_tables[0] - print(f"\n[驱动盘数据] 找到表格,属性: {table.attrs}") - - # 尝试使用正则表达式从HTML字符串中提取驱动盘数据 - print("使用正则表达式提取驱动盘数据...") - - # 匹配驱动盘数据的正则表达式 - drive_disk_pattern = re.compile( - r'.*?\s*' # 图片单元格(可能包含figure标签) - r'([^<]+?)\s*' # 名称 - r'([^<]+?)\s*' # 2件套效果 - r'([^<]+?)\s*' # 简介 - r'\s*([^<]+?)', # 4件套效果 - re.DOTALL - ) - - matches = drive_disk_pattern.findall(str(table)) - print(f"找到 {len(matches)} 个驱动盘匹配") - - for match in matches: - name = match[0].strip().replace('\n', '').replace('\r', '') - effect2 = match[1].strip().replace('\n', '').replace('\r', '') - description = match[2].strip().replace('\n', '').replace('\r', '') - effect4 = match[3].strip().replace('\n', '').replace('\r', '') - - if name: - drive_disk = { - 'name': name, - 'effect_2set': effect2, - 'effect_4set': effect4, - 'description': description, - 'image_url': None - } - drive_disks.append(drive_disk) - print(f" 已提取驱动盘: {name}") - - print(f"\n成功提取 {len(drive_disks)} 个驱动盘") - - # ========== 提取驱动盘搭配推荐数据(包含"怪兽与怪客"等内容的表格) ========== - drive_disk_combinations = [] - - # 在所有表格中查找包含"怪兽与怪客"的表格 - for table in tables: - table_str = str(table) - if '怪兽与怪客' in table_str or '驱动盘' in table_str: - # 使用正则表达式提取搭配数据 - # 格式:搭配名称怪物驱动盘组合 - combination_pattern = re.compile( - r'\s*([^<]+?)\s*(.+?)\s*([^<]+?)\s*', - re.DOTALL - ) - - matches = combination_pattern.findall(table_str) - if len(matches) > 3: # 排除小表格 - print(f"\n[搭配推荐] 找到包含 {len(matches)} 条搭配的表格") - - for match in matches: - combo_name = match[0].strip().replace('\n', '').replace('\r', '') - monsters = match[1].strip().replace('\n', '').replace('\r', '') - disks = match[2].strip().replace('\n', '').replace('\r', '') - - # 清理怪物名称(移除链接标签) - monsters_clean = re.sub(r'<[^>]+>', '', monsters) - monsters_clean = re.sub(r'\s+', ' ', monsters_clean).strip() - - if combo_name and disks: - # 拆分驱动盘组合 - disk_list = [d.strip() for d in disks.split('、') if d.strip()] - - combination = { - 'name': combo_name, - 'monsters': monsters_clean, - 'drive_disks': disk_list - } - drive_disk_combinations.append(combination) - print(f" 已提取搭配: {combo_name} -> {', '.join(disk_list)}") - break - - print(f"\n成功提取 {len(drive_disk_combinations)} 条驱动盘搭配推荐") - - return drive_disks, drive_disk_combinations - - except Exception as e: - print(f"抓取失败: {str(e)}") - import traceback - traceback.print_exc() - return None, None - - -def convert_to_code(name): - """将中文名称转换为code格式(混合策略:特殊名称手动映射 + 普通名称拼音转换)""" - # 特殊名称的手动映射(包含所有已知驱动盘) - special_cases = { - # 重金属系列 - '混沌重金属': 'chaos_heavy_metal', - '獠牙重金属': 'fang_heavy_metal', - '雷暴重金属': 'thunder_heavy_metal', - '炎狱重金属': 'inferno_heavy_metal', - '极地重金属': 'polar_heavy_metal', - - # 爵士系列 - '摇摆爵士': 'swing_jazz', - '混沌爵士': 'chaos_jazz', - '自由爵士': 'free_jazz', - - # 朋克系列 - '激素朋克': 'hormone_punk', - '原始朋克': 'primitive_punk', - - # 迪斯科系列 - '震星迪斯科': 'shocking_disco', - - # 电音系列 - '啄木鸟电音': 'woodpecker_electronic', - '河豚电音': 'pufferfish_electronic', - - # 其他 - '灵魂摇滚': 'soul_rock', - '自由蓝调': 'free_blues', - '折枝剑歌': 'broken_branch_sword_song', - '静听嘉音': 'silent_listen_jia_yin', - '如影相随': 'shadow_follower', - '法厄同之歌': 'song_of_phoebus', - '云岿如我': 'cloud_mountain_self', - '山大王': 'mountain_lord', - '拂晓生花': 'dawn_blossom', - '月光骑士颂': 'moonlight_knight_ode', - '雪兔梦游仙境': 'snow_rabbit_wonderland', - '囚徒手记': 'prisoners_notebook', - '沧浪行歌': 'canglang_song', - '流光咏叹': 'flowing_light_aria' - } - - # 优先检查特殊映射 - if name in special_cases: - return special_cases[name] - - # 默认使用拼音转换 - try: - from pypinyin import lazy_pinyin - pinyin_parts = lazy_pinyin(name) - code = '_'.join(pinyin_parts).lower() - # 移除特殊字符 - code = re.sub(r'[^a-z0-9_]', '', code) - return code - except ImportError: - # 如果没有安装pypinyin,回退到简单处理 - code = re.sub(r'[\s]+', '_', name.strip()) - code = re.sub(r'_+', '_', code) - return code.strip('_').lower() - - -def save_as_yaml(drive_disks, output_dir): - """将驱动盘数据保存为YAML文件""" - os.makedirs(output_dir, exist_ok=True) - - for disk in drive_disks: - code = convert_to_code(disk['name']) - filename = f"{code}.yml" - filepath = os.path.join(output_dir, filename) - - # 获取 mission_type_name(优先使用驱动盘数据中的值,默认为"怪物与怪客") - mission_type = disk.get('mission_type_name', '怪物与怪客') - - # YAML格式 - yaml_content = f'set_name: "{disk["name"]}"\n' - yaml_content += f'mission_type_name: "{mission_type}"\n' - yaml_content += f'code: {code}\n' - - with open(filepath, 'w', encoding='utf-8') as f: - f.write(yaml_content) - - print(f" 已保存: {filename}") - - -def main(): - """主函数""" - print("=" * 60) - print("爬取绝区零驱动盘数据") - print("=" * 60) - - # 1. 抓取数据 - print("\n[步骤1] 抓取驱动盘数据") - drive_disks, drive_disk_combinations = fetch_drive_disk_data() - - if not drive_disks: - drive_disks = [] # 初始化空列表 - - # 2. 根据搭配数据补充驱动盘数据 - print("\n[步骤2] 根据搭配推荐补充驱动盘数据") - if drive_disk_combinations: - # 创建已存在的驱动盘名称集合 - existing_names = {disk['name'] for disk in drive_disks} - - # 从搭配推荐中提取所有驱动盘 - disk_to_mission = {} - for combo in drive_disk_combinations: - mission_name = combo['name'] - for disk_name in combo['drive_disks']: - disk_to_mission[disk_name] = mission_name - - # 如果驱动盘不存在,则创建新的驱动盘数据 - if disk_name not in existing_names: - new_disk = { - 'name': disk_name, - 'effect_2set': '', - 'effect_4set': '', - 'description': '', - 'image_url': None, - 'mission_type_name': mission_name - } - drive_disks.append(new_disk) - existing_names.add(disk_name) - print(f" 从搭配推荐补充: {disk_name} -> {mission_name}") - - # 更新已存在驱动盘的 mission_type_name - for disk in drive_disks: - if disk['name'] in disk_to_mission: - disk['mission_type_name'] = disk_to_mission[disk['name']] - else: - disk['mission_type_name'] = "怪物与怪客" # 默认值 - - # 3. 保存驱动盘数据 - print("\n[步骤3] 保存驱动盘为YAML文件") - output_dir = r"d:\my\project\zzz_drive-disk-rating\.debug\drive_disk" - save_as_yaml(drive_disks, output_dir) - - # 4. 保存搭配推荐数据 - if drive_disk_combinations: - print("\n[步骤4] 保存驱动盘搭配推荐") - combinations_file = r"d:\my\project\zzz_drive-disk-rating\.debug\drive_disk_combinations.yml" - save_combinations_as_yaml(drive_disk_combinations, combinations_file) - - # 5. 打印摘要 - print("\n" + "=" * 60) - print("完成摘要") - print("=" * 60) - print(f"共抓取/补充 {len(drive_disks)} 个驱动盘") - print(f"共提取 {len(drive_disk_combinations)} 条搭配推荐") - print(f"输出目录: {output_dir}") - print("\n驱动盘列表:") - for disk in sorted(drive_disks, key=lambda x: x['name']): - mission = disk.get('mission_type_name', '怪物与怪客') - print(f" - {disk['name']} ({mission})") - - -def save_combinations_as_yaml(combinations, filepath): - """将驱动盘搭配推荐保存为YAML文件""" - yaml_content = "# 驱动盘搭配推荐\n" - yaml_content += "# 格式: 搭配名称 -> [推荐驱动盘1, 推荐驱动盘2]\n\n" - - for combo in combinations: - yaml_content += f"- name: \"{combo['name']}\"\n" - yaml_content += f" monsters: \"{combo['monsters']}\"\n" - yaml_content += " drive_disks:\n" - for disk in combo['drive_disks']: - yaml_content += f" - \"{disk}\"\n" - yaml_content += "\n" - - with open(filepath, 'w', encoding='utf-8') as f: - f.write(yaml_content) - - print(f" 已保存搭配推荐: {os.path.basename(filepath)}") - - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/src/zzz/zh/feat_information_management/fetch_engine.py b/src/zzz/zh/feat_information_management/fetch_engine.py deleted file mode 100644 index 3d29cc20..00000000 --- a/src/zzz/zh/feat_information_management/fetch_engine.py +++ /dev/null @@ -1,646 +0,0 @@ -""" -合并获取音擎信息:先获取英文名、品阶、detail_url,再获取中文名,最后生成yml文件 -""" - -import asyncio -import json -import re -import os -from datetime import datetime -from playwright.async_api import async_playwright, TimeoutError as PlaywrightTimeoutError - -async def wait_for_network_idle(page, timeout=30000): - """等待网络空闲""" - start_time = asyncio.get_event_loop().time() - while asyncio.get_event_loop().time() - start_time < timeout / 1000: - try: - await page.wait_for_load_state("networkidle", timeout=5000) - break - except PlaywrightTimeoutError: - continue - -async def scroll_to_load_all_content(page, max_scrolls=50, scroll_delay=4000): - """滚动页面加载所有懒加载内容""" - print("\n=== 开始滚动加载所有内容 ===") - - initial_count = await page.locator(".tw-flex.tw-p-4.tw-rounded-xl").count() - print(f"初始卡片数量: {initial_count}") - - previous_count = initial_count - scroll_count = 0 - consecutive_no_change = 0 - - while scroll_count < max_scrolls: - try: - await page.evaluate("window.scrollTo(0, document.body.scrollHeight)") - print(f"第 {scroll_count + 1} 次滚动...") - - await page.wait_for_timeout(scroll_delay) - await wait_for_network_idle(page) - - current_count = await page.locator(".tw-flex.tw-p-4.tw-rounded-xl").count() - if current_count == 0: - current_count = await page.locator("[class*='tw-flex'][class*='p-4']").count() - if current_count == 0: - current_count = await page.locator("[class*='card']").count() - - print(f"当前卡片数量: {current_count}") - - if current_count == previous_count: - consecutive_no_change += 1 - if consecutive_no_change >= 3: - print("连续3次没有新增内容,停止滚动") - break - else: - consecutive_no_change = 0 - - previous_count = current_count - scroll_count += 1 - - except Exception as e: - print(f"滚动过程中出错: {e}") - break - - await page.evaluate("window.scrollTo(0, 0)") - await page.wait_for_timeout(500) - - print(f"滚动完成,共滚动 {scroll_count} 次,最终卡片数量: {previous_count}") - return previous_count - -async def process_card(card, context, index): - """处理单个卡片,提取音擎信息""" - try: - name_elem = card.locator(".tw-font-zzz") - name = "" - if await name_elem.count() > 0: - name = await name_elem.first.text_content() - name = name.strip() if name else "未知" - else: - name = "未知" - - print(f"\n=== 处理第 {index} 个卡片: {name} ===") - - new_page_event = asyncio.Event() - found_page = None - - async def handle_new_page(page): - nonlocal found_page, new_page_event - try: - await page.wait_for_load_state("domcontentloaded", timeout=10000) - if "/entry/" in page.url: - found_page = page - new_page_event.set() - except: - pass - - context.on("page", handle_new_page) - - try: - await card.click() - - try: - await asyncio.wait_for(new_page_event.wait(), timeout=15) - except asyncio.TimeoutError: - print(f"✗ 第 {index} 个卡片 - 超时未找到新页面") - return { - "success": False, - "index": index, - "card": card, - "name": name, - "data": None - } - - if found_page: - url = found_page.url - match = re.search(r'/entry/(\d+)', url) - if match: - entry_id = match.group(1) - detail_url = f"https://wiki.hoyolab.com/pc/zzz/entry/{entry_id}?lang=en-us" - print(f"✓ 第 {index} 个卡片 - 成功提取entry_id: {entry_id}") - - await found_page.close() - else: - print(f"✗ 第 {index} 个卡片 - URL中未找到entry_id") - if found_page != context.pages[0]: - await found_page.close() - return { - "success": False, - "index": index, - "card": card, - "name": name, - "data": None - } - else: - print(f"✗ 第 {index} 个卡片 - 未找到新页面") - return { - "success": False, - "index": index, - "card": card, - "name": name, - "data": None - } - finally: - context.remove_listener("page", handle_new_page) - - # 正确的稀有度获取逻辑:从带有 alt="rarity" 的 img 标签的 src 中提取 - rarity_num = "" - rarity_elem = card.locator("img[alt='rarity']") - if await rarity_elem.count() > 0: - src = await rarity_elem.first.get_attribute("src") - if src: - # 从 src 中提取文件名(如 "/_nuxt/img/other_s.6038bbd.png" -> "other_s") - filename = src.split('/')[-1].split('.')[0] - # 根据文件名映射稀有度(直接使用字母) - rarity_filename_map = { - "other_s": "S", # S级 - "other_a": "A", # A级 - "other_b": "B", # B级 - "other_c": "C" # C级 - } - rarity_num = rarity_filename_map.get(filename, "") - - print(f" 稀有度获取结果: {rarity_num} (src: {src if src else '未找到'})") - - attr_elem = card.locator(".tw-w-8.tw-h-8") - attr = "" - if await attr_elem.count() > 0: - attr = await attr_elem.first.get_attribute("class") - - attr_name = "" - if attr: - if "physics" in attr.lower(): - attr_name = "物理" - elif "fire" in attr.lower(): - attr_name = "火" - elif "electric" in attr.lower(): - attr_name = "电" - elif "ice" in attr.lower(): - attr_name = "冰" - elif "ether" in attr.lower(): - attr_name = "以太" - - # 输出调试信息 - print(f" ├─ 英文名: {name}") - print(f" ├─ 品级: {rarity_num}") - print(f" ├─ 属性: {attr_name}") - print(f" └─ detail_url: {detail_url}") - - return { - "success": True, - "index": index, - "card": None, - "name": name, - "data": { - "index": index, - "name": name, - "rarity": rarity_num, - "attribute": attr_name, - "entry_id": entry_id, - "detail_url": detail_url - } - } - - except Exception as e: - print(f"处理卡片时出错: {e}") - return { - "success": False, - "index": index, - "card": card, - "name": "未知", - "data": None - } - -async def fetch_engine_detail_urls_inner(): - """内部函数:执行实际的音擎数据获取""" - - en_url = "https://wiki.hoyolab.com/pc/zzz/aggregate/11?lang=en-us" - engine_data = [] - - async with async_playwright() as p: - browser = await p.chromium.launch( - headless=True, - args=[ - "--disable-blink-features=AutomationControlled", - "--window-size=1920,1080", - "--disable-gpu", - "--no-sandbox", - "--disable-dev-shm-usage", - ] - ) - - context = await browser.new_context( - viewport={"width": 1920, "height": 1080}, - locale="en-US", - ) - - page = await context.new_page() - page.set_default_timeout(180000) - - try: - print("访问英文版音擎列表页面...") - await page.goto(en_url, wait_until="domcontentloaded") - print("等待页面DOM加载完成...") - await page.wait_for_timeout(10000) - print("等待网络空闲...") - await wait_for_network_idle(page) - - print("等待卡片容器...") - try: - await page.wait_for_selector(".tw-grid", timeout=30000) - print("找到卡片容器") - except PlaywrightTimeoutError: - print("未找到卡片容器") - - await page.wait_for_timeout(5000) - - await scroll_to_load_all_content(page) - - cards = page.locator(".tw-flex.tw-p-4.tw-rounded-xl") - total_cards = await cards.count() - print(f"\n找到 {total_cards} 个卡片") - - results = [None] * total_cards - failed_tasks = [] - - print("\n=== 开始串行处理卡片 ===") - - for i in range(total_cards): - card = cards.nth(i) - index = i + 1 - result = await process_card(card, context, index) - - if result["success"]: - results[index - 1] = result["data"] - else: - failed_tasks.append(result) - - await asyncio.sleep(1) - - success_count = sum(1 for r in results if r is not None) - fail_count = len(failed_tasks) - print(f"\n串行处理完成: 成功 {success_count} 个, 失败 {fail_count} 个") - - if fail_count > 0: - print(f"\n=== 开始重试失败的任务(最多5次) ===") - max_retries = 5 - - for retry_num in range(max_retries): - if not failed_tasks: - break - - print(f"\n--- 第 {retry_num + 1} 次重试 ---") - current_failed = failed_tasks.copy() - failed_tasks = [] - - for task in current_failed: - print(f"\n重试第 {task['index']} 个卡片: {task['name']}") - result = await process_card(task["card"], context, task["index"]) - - if result["success"]: - results[task["index"] - 1] = result["data"] - print(f"✓ 重试成功") - else: - failed_tasks.append(result) - print(f"✗ 重试失败") - - success_count = sum(1 for r in results if r is not None) - fail_count = len(failed_tasks) - print(f"第 {retry_num + 1} 次重试完成: 成功 {success_count} 个, 仍失败 {fail_count} 个") - - success_count = sum(1 for r in results if r is not None) - fail_count = len(failed_tasks) - print(f"\n=== 最终结果 ===") - print(f"总卡片数: {total_cards}") - print(f"成功: {success_count} 个") - print(f"失败: {fail_count} 个") - - if fail_count > 0: - print("\n失败的卡片:") - for task in failed_tasks: - print(f" - 第 {task['index']} 个: {task['name']}") - - engine_data = [r for r in results if r is not None] - engine_data.sort(key=lambda x: x["index"]) - - output_file = "engines_en_updated.json" - with open(output_file, "w", encoding="utf-8") as f: - json.dump(engine_data, f, ensure_ascii=False, indent=2) - - print(f"\n结果已保存到 {output_file}") - - return engine_data, True - - except Exception as e: - print(f"出错: {e}") - import traceback - traceback.print_exc() - return None, False - finally: - await browser.close() - print("浏览器已关闭") - -async def fetch_engine_detail_urls(): - """获取音擎的detail_url(带重试机制)""" - - max_retries = 3 # 最大重试次数 - retry_delay = 5 # 基础重试延迟(秒) - - for attempt in range(max_retries): - print(f"\n=== 第 {attempt + 1} 次尝试获取音擎数据 ===") - - engine_data, success = await fetch_engine_detail_urls_inner() - - if success and engine_data: - print(f"\n✓ 第 {attempt + 1} 次尝试成功") - return engine_data - - if attempt < max_retries - 1: - # 指数退避等待 - wait_time = retry_delay * (2 ** attempt) - print(f"\n第 {attempt + 1} 次尝试失败,等待 {wait_time} 秒后重试...") - await asyncio.sleep(wait_time) - - print(f"\n✗ 已尝试 {max_retries} 次,均失败") - return None - -async def fetch_with_browser(browser_tasks, browser_index, retry_mode=False): - """单个浏览器实例处理一批任务""" - async with async_playwright() as p: - browser = await p.chromium.launch( - headless=True, - args=[ - "--disable-blink-features=AutomationControlled", - "--window-size=1920,1080", - "--disable-gpu", - "--no-sandbox", - "--disable-dev-shm-usage", - "--disable-software-rasterizer", - "--disable-extensions", - ] - ) - - context = await browser.new_context( - viewport={"width": 1920, "height": 1080}, - locale="zh-CN", - user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" - ) - - page = await context.new_page() - page.set_default_timeout(60000) # 增加超时时间到60秒 - - results = [] - - try: - for task in browser_tasks: - detail_url = task["detail_url"] - index = task["index"] - name = task["english_name"] if retry_mode else task["name"] - - chinese_url = detail_url.replace('lang=en-us', 'lang=zh-cn') - - try: - # 请求前添加随机延迟,避免被限流 - await page.wait_for_timeout(500 + (1000 if retry_mode else 0)) - - await page.goto(chinese_url, wait_until='domcontentloaded') - await page.wait_for_load_state('networkidle', timeout=30000) - await page.wait_for_timeout(1500) - - title = await page.title() - - match = re.match(r'(.+?)\s*-\s*HoYoWiki', title) - if match: - chinese_name = match.group(1).strip() - chinese_name = re.sub(r'\s*-\s*绝区零\s*$', '', chinese_name) - if chinese_name and len(chinese_name) > 1 and chinese_name != 'Welcome to HoYoWiki': - if retry_mode: - print(f" ✓ 重试 浏览器{browser_index} 第 {index} 个: {name} -> {chinese_name}") - else: - print(f"✓ 浏览器{browser_index} 第 {index} 个: {name} -> {chinese_name}") - results.append({ - "success": True, - "index": index, - "english_name": name, - "chinese_name": chinese_name, - "detail_url": detail_url, - "chinese_url": chinese_url - }) - continue - - if retry_mode: - print(f" ✗ 重试 浏览器{browser_index} 第 {index} 个: {name} - 未获取到中文名称") - else: - print(f"✗ 浏览器{browser_index} 第 {index} 个: {name} - 未获取到中文名称") - results.append({ - "success": False, - "index": index, - "english_name": name, - "chinese_name": "", - "detail_url": detail_url, - "chinese_url": chinese_url - }) - - except PlaywrightTimeoutError: - if retry_mode: - print(f" ✗ 重试 浏览器{browser_index} 第 {index} 个: {name} - 超时") - else: - print(f"✗ 浏览器{browser_index} 第 {index} 个: {name} - 超时") - results.append({ - "success": False, - "index": index, - "english_name": name, - "chinese_name": "", - "detail_url": detail_url, - "chinese_url": "" - }) - except Exception as e: - if retry_mode: - print(f" ✗ 重试 浏览器{browser_index} 第 {index} 个: {name} - 出错: {e}") - else: - print(f"✗ 浏览器{browser_index} 第 {index} 个: {name} - 出错: {e}") - results.append({ - "success": False, - "index": index, - "english_name": name, - "chinese_name": "", - "detail_url": detail_url, - "chinese_url": "" - }) - - finally: - await page.close() - await context.close() - await browser.close() - - return results - -async def run_with_semaphore(semaphore, browser_tasks, browser_index, retry_mode=False): - """使用信号量限制并发浏览器数量""" - async with semaphore: - return await fetch_with_browser(browser_tasks, browser_index, retry_mode) - -async def fetch_all_chinese_names(engine_data): - """异步获取所有音擎的中文名称(整合重试机制,最多100轮)""" - - total_items = len(engine_data) - print(f"\n共 {total_items} 个音擎需要处理中文名") - - max_concurrent_browsers = 10 # 最大并发浏览器数 - semaphore = asyncio.Semaphore(max_concurrent_browsers) - - # 初始化待处理任务列表 - pending_tasks = [] - for item in engine_data: - pending_tasks.append({ - "detail_url": item["detail_url"], - "index": item["index"], - "name": item["name"] - }) - - success_results = [] - max_rounds = 100 - - for round_num in range(max_rounds): - if not pending_tasks: - break - - current_round = round_num + 1 - print(f"\n=== 第 {current_round} 轮:处理 {len(pending_tasks)} 个任务 ===") - - num_browsers = min(len(pending_tasks), max_concurrent_browsers) - items_per_browser = (len(pending_tasks) + num_browsers - 1) // num_browsers - - if current_round == 1: - print(f"将创建 {num_browsers} 个浏览器实例(最大并发数: {max_concurrent_browsers}),平均每个处理约 {items_per_browser} 个任务") - for i in range(num_browsers): - start = i * items_per_browser - end = min(start + items_per_browser, len(pending_tasks)) - print(f" 浏览器{i+1} 处理任务: 第 {pending_tasks[start]['index']}-{pending_tasks[end-1]['index']} 个(共 {end-start} 个)") - - browser_task_groups = [] - for i in range(num_browsers): - start = i * items_per_browser - end = min(start + items_per_browser, len(pending_tasks)) - browser_task_groups.append(pending_tasks[start:end]) - - browser_tasks = [] - for i, browser_tasks_list in enumerate(browser_task_groups): - task = asyncio.create_task(run_with_semaphore(semaphore, browser_tasks_list, i + 1, retry_mode=(current_round > 1))) - browser_tasks.append(task) - - all_results = await asyncio.gather(*browser_tasks) - - round_results = [] - for browser_result in all_results: - round_results.extend(browser_result) - - new_success = [r for r in round_results if r["success"]] - pending_tasks = [r for r in round_results if not r["success"]] - success_results.extend(new_success) - - print(f"本轮成功: {len(new_success)} 个") - print(f"仍失败: {len(pending_tasks)} 个") - - # 如果还有失败的任务且不是最后一轮,等待后继续 - if pending_tasks and current_round < max_rounds: - wait_time = min(3 * current_round, 30) - print(f"\n等待{wait_time}秒后进行下一轮...") - await asyncio.sleep(wait_time) - - success_count = len(success_results) - fail_count = len(pending_tasks) - found_chinese_count = sum(1 for r in success_results if r["chinese_name"]) - - print(f"\n=== 最终结果 ===") - print(f"成功请求: {success_count} 个") - print(f"获取到中文名称: {found_chinese_count} 个") - print(f"请求失败: {fail_count} 个") - - for result in success_results: - for item in engine_data: - if item["index"] == result["index"]: - item["chinese_name"] = result["chinese_name"] - item["chinese_url"] = result["chinese_url"] - break - - output_file = "engines_with_chinese.json" - with open(output_file, "w", encoding="utf-8") as f: - json.dump(engine_data, f, ensure_ascii=False, indent=2) - - print(f"\n结果已保存到 {output_file}") - - return engine_data - -def generate_yml_files(engine_data, output_dir="engine_weapon"): - """为每个音擎生成yml文件""" - # 获取项目根目录(.debug的上级目录) - project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - output_path = os.path.join(project_root, output_dir) - os.makedirs(output_path, exist_ok=True) - - for item in engine_data: - chinese_name = item.get("chinese_name", item.get("name", "未知")) - rarity_num = item.get("rarity", "") - - # 稀有度已经是字母格式(S/A/B/C),直接使用 - # 如果为空则默认设为"B" - rarity = rarity_num if rarity_num else "B" - - english_name = item.get("name", "未知") - - # 使用英文名作为文件名(code) - file_name = f"{english_name}.yml" - file_path = os.path.join(output_path, file_name) - - yml_content = f"""weapon_name: {chinese_name} -rarity: {rarity} -code: "{english_name}" -""" - - with open(file_path, "w", encoding="utf-8") as f: - f.write(yml_content) - - print(f"已生成: {file_path}") - - print(f"\n共生成 {len(engine_data)} 个yml文件") - -async def main(): - """主函数:先获取detail_url,再获取中文名,最后生成yml文件""" - - # 获取今天的日期(格式:YYYY-M-D) - today = datetime.now() - date_str = f"{today.year}-{today.month}-{today.day}" - data_file = f"engines_data_{date_str}.json" - - print(f"今日日期: {date_str}") - print(f"数据文件: {data_file}") - - # 检查是否存在今日的数据文件 - if os.path.exists(data_file): - print(f"\n=== 发现今日数据文件,跳过第一步 ===") - with open(data_file, "r", encoding="utf-8") as f: - engine_data = json.load(f) - print(f"已从 {data_file} 加载 {len(engine_data)} 条数据") - else: - print("=== 第一步:获取音擎的英文名、品阶、detail_url ===") - engine_data = await fetch_engine_detail_urls() - - if not engine_data: - print("未获取到音擎数据,程序退出") - return - - # 保存为日期命名的json文件 - with open(data_file, "w", encoding="utf-8") as f: - json.dump(engine_data, f, ensure_ascii=False, indent=2) - print(f"\n数据已保存到 {data_file}") - - print("\n=== 第二步:获取音擎的中文名称 ===") - engine_data = await fetch_all_chinese_names(engine_data) - - print("\n=== 第三步:生成yml文件 ===") - generate_yml_files(engine_data) - - print("\n=== 全部完成 ===") - -if __name__ == "__main__": - asyncio.run(main()) \ No newline at end of file