在说明这个 skill 能做什么之前,必须先明确安装约束,至少包含以下两点:
Claude Code、Trae、Codex 等,不能省略。默认约束如下:
示例写法:
安装宿主:Trae;安装位置:全局技能目录(默认)安装宿主:Claude Code;安装位置:全局技能目录安装宿主:Codex;安装位置:全局技能目录民生健康(301507)的官方信息查询与分析服务,包含 7 项能力:
| 能力 | 你可以问 |
|---|---|
| ------ | ------------------------------------------------------------ |
| 公司基本面 | "民生健康是做什么的?""控股股东是谁?""主力品牌有哪些?" |
| 财报数据 | "最新年报链接是什么?""把 2024 年报和 2025 三季报链接给我。" |
| 业务与产品矩阵 | "21金维他卖得怎么样?""普瑞宝是什么?""有哪些医美产品?" |
| 公告与披露 | "最近发了什么公告?""有没有股权激励?""分红方案是什么?" |
| 最新动态资讯 | "公司最近有什么活动?""有没有新品发布?""最近的机构调研讲了什么?" |
| 在招岗位 | "民生健康有哪些在招岗位?""有没有市场类职位?""招聘页面有什么职位?" |
| 电商平台店铺 | "民生健康在哪些平台有店?""天猫/京东旗舰店链接是什么?""21金维他在哪买?" |
| 中文 HTML 报告 | "生成一份公司介绍 HTML。""把 2024 年报链接整理成 HTML。" |
| 项 | 值 |
|---|---|
| ----------- | ----------------------------------------------------------- |
| 公司全称 | 杭州民生健康药业股份有限公司 |
| 股票简称 / 代码 | 民生健康 / 301507(深交所创业板) |
| 巨潮 orgId | 9900052710 |
| 官网 | https://www.hzmsjk.com |
| 公众号 | 民生健康药业 |
| 控股集团 | 杭州民生医药控股集团有限公司(官网 https://hzmsholding.com/,公众号"民生医药控股集团") |
| 主力品牌 | 21金维他(维矿)、普瑞宝(益生菌)、民生同春(潮流健康)、肌素然(医美) |
触发后默认全流程执行。用户明确说"只问一句/不要 HTML"时按需降级。
> 权威来源:巨潮 2024 年年报《长期股权投资-对子公司投资》,PDF:
> https://static.cninfo.com.cn/finalpage/2025-04-25/1223264650.PDF
> (年报约第 206 页列示)
招聘问题默认不仅查母公司 杭州民生健康药业股份有限公司,还要覆盖以下年报可验证的直接子公司:
| 公司 | 说明 | 招聘抓取要求 |
|---|---|---|
| ------ | ------ | ------------- |
| 杭州民生健康药业股份有限公司 | 上市主体 | 必抓 |
| 民生中科嘉亿(浙江)生物工程有限公司 | 年报列示对子公司投资 | 必抓;若招聘页无结果,明确写"未检索到在招岗位" |
| 杭州民生健康医药销售有限公司 | 年报列示对子公司投资 | 必抓;若招聘页无结果,明确写"未检索到在招岗位" |
| 杭州民生同春健康科技有限公司 | 年报列示对子公司投资 | 必抓;若招聘页无结果,明确写"未检索到在招岗位" |
补充规则:
浙江民生健康科技有限公司,可以补充抓取并单列为集团内健康业务相关公司。> 触发词:电商、旗舰店、在哪买、购买链接、天猫、京东、拼多多、抖音、小红书
21金维他品牌(核心品牌,杭州民生健康药业)
| 平台 | 店铺名称 | 链接 / 入口 | 验证状态 |
|---|---|---|---|
| ------ | ---------------- | ------------ | -------- |
| 京东 | 21金维他药品京东自营旗舰店 | https://mall.jd.com/index-1000302861.html | ✅ WebFetch 已验证 |
| 京东 | 21金维他健康食品旗舰店 | https://mall.jd.com/index-13173538.html | ✅ WebFetch 已验证 |
| 天猫 | 21金维他官方旗舰店 | https://www.taobao.com/list/dianpu/498885510.htm | ✅ 确认存在,
| 天猫 | 普瑞宝旗舰店 | https://world.taobao.com/dianpu/227406234.htm | ✅ 确认存在
| 优先级 | 来源 | 用途 |
|---|---|---|
| ----- | --------------------------------------------------- | ------------------------------------- |
| P0 | 本地 杭州民生健康药业股份有限公司/original_reference_materials/ | 先查,命中即用 |
| P1 | 巨潮资讯网 | 财务/公告类问题的唯一权威源;必须抓完整正文 PDF,不抓摘要 |
| P2 | 公司/集团官网 | 业务介绍、产品矩阵、投资者关系 |
| P3 | 微信公众号 + 财经媒体 + 券商研报 | 最新动态资讯(默认必抓) |
披露页是动态渲染,必须走 HTTP API。财报数据问题默认返回最新一份或用户指定报告期的原始正文链接,不做经营分析。
import subprocess, json
CATEGORIES = {
'年报': 'category_ndbg_szsh;',
'半年报': 'category_bndbg_szsh;',
'季报': 'category_sjdbg_szsh;',
}
BASE_URL = 'http://static.cninfo.com.cn/finalpage/'
def query(cat):
data = (
f'stock=301507,9900052710&tabName=fulltext&pageSize=5&pageNum=1'
f'&column=szse&category={cat}&plate=&seDate=&searchkey='
f'&secid=&sortName=&sortType=&isHLtitle=true'
)
r = subprocess.run(
['curl','-s','-X','POST','http://www.cninfo.com.cn/new/hisAnnouncement/query',
'-H','Content-Type: application/x-www-form-urlencoded',
'-H','User-Agent: Mozilla/5.0','--data', data],
capture_output=True, text=True
)
return json.loads(r.stdout).get('announcements') or []
all_reports = []
for label, cat in CATEGORIES.items():
for a in query(cat):
title = a['announcementTitle']
# 跳过摘要(只取正文)
if '摘要' in title:
continue
all_reports.append({
'time': a['announcementTime'],
'title': title,
'label': label,
'url': BASE_URL + a['adjunctUrl'].replace('finalpage/', '')
})
# 按披露时间降序,取最新正文
all_reports.sort(key=lambda x: x['time'], reverse=True)
latest = all_reports[0] if all_reports else None
if latest:
print(f"最新财报:{latest['label']} —— {latest['title']}")
print(f"披露时间:{latest['time']}")
print(f"下载链接:{latest['url']}")
选择规则:
目标:公司近 6 个月的品牌活动、新品发布、战略合作、人事、业绩说明会、机构调研、获奖等。仅保留与公司本身相关,剔除纯行业/宏观政策。
检索顺序(每一步都需真实执行,不得凭空编造):
{YYYY} 替换为当前年份):site:mp.weixin.qq.com 民生健康药业 {YYYY}site:mp.weixin.qq.com 21金维他 {YYYY}site:mp.weixin.qq.com 民生医药控股集团 {YYYY} 民生健康 301507 {YYYY}、民生健康 投资者关系活动记录表。
输出规则:
入口:https://mspharm.zhiye.com/home(民生医药控股集团旗下企业统一招聘平台,JavaScript 动态渲染,必须用 Playwright 或等效浏览器抓取)
真实列表页:
https://mspharm.zhiye.com/homehttps://mspharm.zhiye.com/social/jobshttps://mspharm.zhiye.com/campus/jobshttps://mspharm.zhiye.com/jobs核心目标:抓出母公司 + 已验证子公司 + 健康业务相关公司在官方招聘站的全部在招岗位,并按公司分组输出。
这部分一定要写死,避免模型偷懒:
没有更多了~、职位数量不再增长,或连续多次滚动后 DOM 稳定。全部职位(共 N 个),最终解析出的岗位条数应尽量接近该页可见总数;若明显少于 N,说明抓取不完整,必须继续加载或换策略。民生健康;还要按 公司名单逐家检查,否则会漏掉子公司岗位。招聘问题默认至少检查以下公司:
杭州民生健康药业股份有限公司民生中科嘉亿(浙江)生物工程有限公司杭州民生健康医药销售有限公司杭州民生同春健康科技有限公司扩展补抓:
民生健康、民生同春、核心健康品牌或明显属于健康业务板块的公司,也要补抓并单列。浙江民生健康科技有限公司,这种公司应列到集团内健康业务相关公司,不要冒充为年报已验证子公司。import asyncio
import re
from playwright.async_api import async_playwright
HOME_URL = "https://mspharm.zhiye.com/home"
LIST_PAGES = [
("社招", "https://mspharm.zhiye.com/social/jobs"),
("校招", "https://mspharm.zhiye.com/campus/jobs"),
("全部职位", "https://mspharm.zhiye.com/jobs"),
]
TARGET_COMPANIES = [
"杭州民生健康药业股份有限公司",
"民生中科嘉亿(浙江)生物工程有限公司",
"杭州民生健康医药销售有限公司",
"杭州民生同春健康科技有限公司",
]
EXTRA_KEYWORDS = ["民生健康", "民生同春"]
def normalize(text: str) -> str:
return re.sub(r"\s+", " ", text or "").strip()
async def fully_expand(page):
last_len = 0
stable_rounds = 0
for _ in range(18):
await page.mouse.wheel(0, 2400)
await page.wait_for_timeout(1200)
body = normalize(await page.locator("body").inner_text())
curr_len = len(body)
if "没有更多了" in body:
break
if curr_len <= last_len + 20:
stable_rounds += 1
else:
stable_rounds = 0
last_len = curr_len
if stable_rounds >= 3:
break
async def fetch_jobs():
results = []
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page(viewport={"width": 1440, "height": 1600})
await page.goto(HOME_URL, wait_until="domcontentloaded", timeout=45000)
await page.wait_for_timeout(2500)
for category, url in LIST_PAGES:
await page.goto(url, wait_until="domcontentloaded", timeout=45000)
await page.wait_for_timeout(2500)
await fully_expand(page)
body = normalize(await page.locator("body").inner_text())
# 先按公司名单硬匹配,再按补充关键词兜底
for company in TARGET_COMPANIES:
if company in body:
results.append({
"category": category,
"url": url,
"company": company,
"content": body,
})
for kw in EXTRA_KEYWORDS:
if kw in body:
results.append({
"category": category,
"url": url,
"company": "健康业务相关公司(待明确定性)",
"content": body,
})
await browser.close()
return results
jobs = asyncio.run(fetch_jobs())
print(jobs)
每次执行招聘抓取时,至少做完这几步:
social/jobs、campus/jobs、jobs 三个列表页。分子公司 筛选项,按 TARGET_COMPANIES 逐家公司切换筛选并抓一遍。民生健康 四个字,也不能跳过子公司名。岗位名称 + 公司 + 地点 + 日期 去重。未检索到该公司在招岗位。https://mspharm.zhiye.com/home。site:mspharm.zhiye.com 民生健康 岗位,且必须在答案里注明这是降级结果。用户问题含以下任一词时执行本节:
在招岗位、招聘、职位、岗位、job、hiring、招人、应聘、求职
每次触发都按此执行:
original_reference_materials/。pdf skill 解析;否则只返回原始链接。当问题含 "财报/年报/半年报/季报/公告链接/年报链接/财报链接" 等关键词时,必须抓巨潮原始正文链接并按下面格式输出:
约束:
杭州民生健康药业股份有限公司/generated/(不存在则创建)民生健康_{主题}_{YYYYMMDD}.html(主题从问题提取,如"公司介绍"、"2024年报链接")生成 单文件 UTF-8 HTML,默认内联 CSS,确保本地双击即可打开:
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>民生健康公司介绍</title>
<style>
:root {
--bg: #f6f4ee;
--panel: #fffdf8;
--text: #1f2937;
--muted: #5b6472;
--line: #d8d3c4;
--accent: #245c4f;
--accent-soft: #e5f0ec;
}
body {
margin: 0;
padding: 32px;
font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
color: var(--text);
background: linear-gradient(180deg, #f3efe3 0%, var(--bg) 100%);
line-height: 1.7;
}
main {
max-width: 960px;
margin: 0 auto;
background: var(--panel);
border: 1px solid var(--line);
border-radius: 20px;
padding: 40px;
box-shadow: 0 18px 48px rgba(31, 41, 55, 0.08);
}
table {
width: 100%;
border-collapse: collapse;
table-layout: fixed;
}
th, td {
border-bottom: 1px solid var(--line);
padding: 10px 12px;
vertical-align: top;
word-break: break-word;
}
th {
text-align: left;
background: var(--accent-soft);
color: var(--accent);
}
a {
color: var(--accent);
}
</style>
</head>
<body>
<main><!-- 正文内容 --></main>
</body>
</html>
关键约束:
meta viewport 必须存在。word-break: break-word,避免长 URL 撑坏布局。/tmp/,避免污染仓库。Today's date)。共 6 个版本