新增企业查询 Skill(通用版 v2.0)
核心价值(本 Skill 的差异化)
- 整合多类免费资源,零付费:工商侧用同花顺快查(按省/市/区 + 成立日期真实筛选、返回注册地址),地图侧复用高德 / 腾讯 / 百度三源免费 WebService 做地理编码与距离判定。全程不调用任何付费接口,也不依赖企业实名认证的付费数据源。
- 流程优化,大幅减少资源占用:通过"文本优先(乡镇街道零地图调用)→ 同门牌合并一次校验 → 小区/村/园区整体包含 → 地址去重 → 并发编码 + 坐标缓存"五层减员链路,把 radius 模式下"逐家企业地理编码"压缩为"唯一地址/社区地理编码",较 naive 方案节省 70%~80% 地图配额,并规避单源配额耗尽。
通用性说明:本 Skill 不锁定任何行政区,所有地域 / 圆心 / 半径均为参数。示例中的"白云区 / 广州农商银行白云支行"仅作演示,可替换为任意省 / 市 / 区 / 街道 / 网点。
🎯 适用场景
- 银行网点 / 支行周边半径内近期新设企业的拓客名单生成(对公客户经理、零售客户经理)。
- 产业园区 / 商圈 / 街道乡镇范围内新增市场主体的招商 / 摸排清单。
- 任意行政区本月 / 本周 / 自定义区间内新成立企业的全量导出。
- 市场调研、竞品布局、区域活跃度分析的数据底座。
🔧 初始化检查(首次使用时执行)
1. 工商数据源(必选其一,推荐同花顺快查)
- 推荐 · 同花顺快查(
source_kuaicha.py):按 省/市/区 + 成立日期 真实筛选,返回注册地址 + 成立日期 + 法人 + 信用代码。这是街道/半径能力的数据底座。- 依赖
kuaicha-search技能(提供scripts/kuaicha_tool.mjs)与KUAICHA_API_KEY(试用:https://open.kuaicha365.com/skills/ ,内测免费额度)。 - 调用:
import sys; sys.path.insert(0, SKILL_DIR) from source_kuaicha import fetch_new_enterprises r = fetch_new_enterprises("广东省","广州市","白云区","2026-07-21","2026-08-21") enterprises = r["enterprises"] # 每项含 reg_address / establish_date / ...
- 依赖
- 兜底 · 天眼查 CLI(
tyc_tools.py):每日 500 次免费。⚠️ 注意其区域搜索为企业名称匹配 (非注册地址匹配),且返回字段不含注册地址——仅适合"纯按区县"且不需要地址过滤的场景; 街道/半径模式务必用同花顺快查。
2. 地图地理编码源(仅半径模式需要)
- 依赖环境变量 Key,WorkBuddy 环境已内置:
AMAP_KEY(高德)、TENCENT_MAP_KEY/TENCENT_KEY(腾讯)、BAIDU_AK(百度)。三家均为免费 WebService,合计 ~1.6 万次/日。 - 调用:
from geocoders import Geocoder geo = Geocoder(cache_file="geo_cache.json") # 自动读环境变量,三源故障转移 + 结果缓存 pt = geo.geocode("广东省广州市白云区XX路18号", city="广州市") # -> (lat, lng) GCJ-02 - 若
geo.available为 False(无 Key),半径模式无法执行,应提示用户配置地图 Key 或改用乡镇/区县模式。
三种范围模式(核心)
| 模式 | 触发语义 | 实现 | 地图调用 | |------|----------|------|----------| | district(区县) | "白云区本月新增" | 工商源按区划筛,透传 | 0 | | township(街道/乡镇/村居) | "太和镇/XX街道/XX村 新增" | 注册地址文本包含判断(规则1) | 0 | | radius(圆心+半径) | "XX网点周边5公里/某地址附近3km 新增" | 地理编码 + 距离判定 + 减员规则 | 仅唯一地址/社区,大幅压缩 |
范围判定优先级:用户给"XX公里/周边/半径" + 圆心 → radius;给"XX街道/镇/村/社区/园区" → township; 只给"XX区/县" → district。
三条减员规则(减少地图 POI 资源占用的关键)
仅 radius 模式需要地图调用。以下规则把"逐家企业地理编码"压缩为"唯一地址/社区地理编码"。
-
规则1(文本优先,township 模式):范围若是街道/乡镇/村居,直接判断注册地址文本是否包含该关键词, 完全跳过地理编码。这是最省资源的路径,优先于半径模式使用。
from geo_filter import filter_by_township hits = filter_by_township(enterprises, "太和镇", must_also_contain="白云区") -
规则2(同门牌合并一次校验):相同"路/街 + 门牌号"的企业合并,只地理编码一次。 例:"XX路18号"上 5 家公司 → 1 次编码。由
extract_street_seed()提取种子,分组后每组编码一次。from geo_filter import extract_street_seed seed = extract_street_seed("广州市白云区XX路18号XX大厦3楼") # -> "XX路18号" -
规则3(小区/村/园区整体包含):若某小区/村/园区质心落在 半径+缓冲(默认 0.3km)内, 该范围内所有企业整体纳入,不再逐家编码。例:阳光花园内 30 家企业 → 1 次编码。
from geo_filter import extract_community comm = extract_community("白云区太和镇阳光花园3栋") # -> "阳光花园"⚠️ 取舍:社区边缘可能略微超出半径,为"整体包含"会微量过纳入——符合营销拓客"宁多勿漏"原则,可接受。
-
附加优化:
- L0 去重:相同归一化地址只编码一次(
normalize_address)。 - L1 镇街白名单(可选):
build_township_whitelist()用高德行政区接口取区县下各镇街质心, 仅保留质心 ≤ 半径+缓冲(默认 3km)的镇街,远镇街纯文本排除,省去大量逐址编码(一次性 ~20+ 次)。 - 企业清单去重:规则2/3 只合并"地理编码次数",不合并企业本身。工商源(如 同花顺)返回数据可能存在重复记录,
故
filter_by_radius在输出前按企业唯一标识(统一社会信用代码优先,缺失则用 名称+注册地址)去重, 确保同一企业只出现一次;同门牌号下的不同企业(信用代码不同)仍各自保留。 - 并发地理编码:
filter_by_radius默认max_workers=5线程池并发(geocoders.geocode网络 IO 在锁外、 缓存写入加锁,线程安全;5 线程匹配高德免费 QPS=5 上限,超限自动故障转移至腾讯/百度)。 实测:白云区 4161 家串行需 15–25 分钟,并发后全量 2.4 分钟;坐标缓存命中后重跑秒级。
- L0 去重:相同归一化地址只编码一次(
半径模式主流程
from geo_filter import filter_by_radius
res = filter_by_radius(
enterprises, center_lat=23.204308, center_lng=113.257164, radius_km=5.0, # 圆心须用 POI 搜索定位(见下文)
geocoder=geo, region_context="广东省广州市白云区", city="广州市",
community_buffer_km=0.3, enable_community_rule=True,
township_whitelist=None, # 可选:传入 L1 白名单进一步减员
max_workers=5, # 并发地理编码线程数(匹配高德 QPS=5)
)
# res["included"] 命中半径的企业(含 _distance_km / _match_rule)
# res["excluded_beyond"] 编码成功但超出半径
# res["unresolved"] 无地址或编码失败(待人工)
# res["stats"]["geocode_calls"] 实际地图请求数 —— 体现节省效果
工作流程(8 步)
Step 1:解析用户意图
识别三类信息:
- 地域基准:省 / 市 / 区县(即使 radius 模式也需区县作为工商源筛选与地址上下文)
- 时间范围:起止日期或相对时间(本月/本周/最近N天/上个月/今年/指定月)
- 范围口径(决定走哪条路):
- 圆心 + 半径 →
radius(需圆心坐标或地址) - 街道/乡镇/村居名 →
township - 仅区县 →
district
- 圆心 + 半径 →
圆心获取(radius 模式,⚠️关键):
- 若用户给机构/网点/楼宇名称(如"广州农商银行白云支行"):必须用地图 POI 搜索(place search)定位, 不能用语义文本地理编码(geocode)——实测 geocode 对"广州市白云区 广州农商银行白云支行" 给出的坐标偏差达 8km,而 place search 精确定位到"黄石西路466号"(lat=23.204308, lng=113.257164)。
- 若用户给普通街道地址(如"XX路18号")或直接给经纬度:可直接 geocode / 用之。
- 腾讯/高德返回即 GCJ-02,可直接用于距离计算,无需转换。
时间范围转换(以当前日期为基准):
- "本月"→本月1日~今日;"本周"→本周一~今日;"上个月"→上月1日~月末;
- "最近N天"→今日倒推N天;"今年"→1月1日~今日;直接说日期则直接用。
Step 2:确认信息(必须展示并等待确认)
我理解您的需求如下,请确认:
📍 地域基准:[省份] [城市] [区县]
🎯 范围口径:[区县 / 街道乡镇"XX" / 圆心"XX"周边 N 公里]
📅 时间范围:[YYYY-MM-DD] 至 [YYYY-MM-DD]
🏢 企业类型:[企业 / 个体工商户 / 全部]
确认后开始查询,结果以 Excel 输出。请回复"确认"或指出需修改处。
信息不完整时主动引导补全(尤其 radius 模式必须有圆心与半径)。
Step 3:拉取企业清单(工商源,按区县+日期)
from source_kuaicha import fetch_new_enterprises
r = fetch_new_enterprises(province, city, district, date_from, date_to)
print("符合条件总数:", r["total"], "| 本次拉取:", len(r["enterprises"]))
- 若
total == 0:告知无数据,建议放宽范围/时间。 - 若
total很大(如 > 2000):提示地图配额与耗时,确认是否继续(radius 模式尤甚)。 - 同花顺分页自动翻完;天眼查 CLI 按名称匹配,仅作兜底。
Step 4:范围过滤(三模式分支)
district:filter_by_district(enterprises)—— 透传,0 地图调用。township:filter_by_township(enterprises, keyword, must_also_contain=district)—— 0 地图调用。radius:filter_by_radius(...)—— 见上,依赖Geocoder(需地图 Key)。
输出统计给用户:
范围过滤完成:
- 命中 [N] 家([district/township/radius])
- 地图地理编码请求:[M] 次(规则2/3 合并后)
- 未解析(无地址/编码失败):[K] 家,见 Excel 备注
Step 5:信息富化(可选)
对命中企业可补充联系方式等(天眼查 CLI get_contact_info / 同花顺详情工具)。
数量大时提前告知耗时并分批;获取不到填"暂无",不中断主流程。
Step 6:排序
优先级:注册资本(高→低)> 成立日期(近→远)> 名称。
Step 7:导出 Excel
from scripts.export_excel import export_to_excel # 注意包路径
filepath, stats = export_to_excel(
enterprises=result_list, region="广东省广州市白云区(周边5km)",
date_range="20260721至20260821", output_dir=WORKSPACE,
filename="新增企业_白云支行周边5km_20260721至20260821",
data_source="同花顺快查 + 高德/腾讯地图",
)
新增列:匹配范围、距圆心距离(km)、命中规则(community_whole / per_address / text_contains / source_district)。
Step 8:汇报
✅ 查询完成!
共 [N] 家新增企业([范围描述],[时间段])
📄 Excel:[路径]
地图调用:[M] 次(通过规则2/3 合并,较逐家编码节省约 X%)
数据来源:同花顺快查(工商)+ 高德/腾讯地图(坐标),末行已标注。
地图资源占用测算(为何减员重要)
以"白云区近1月新设 ≈ 1.15 万家"为例(数字随区而异,仅示意):
| 方案 | 地理编码次数 | 是否免费 | 精度 | |------|--------------|----------|------| | 逐家编码(naive) | ~11,500 | 免费但耗尽配额(需3天/单源) | 最高 | | v2.0 减员后 | ~1,000–2,000(L0去重+规则2/3) | 免费,1天内 | 高(小区边缘微量过纳入) | | 仅 township 文本 | 0 | 免费瞬时 | 取决于关键词 |
实测基准(白云支行周边3km,2026-08-01~08-21):同花顺拉取白云区新设 4,161 家(含注册地址)→ 地理编码仅 947 次(唯一地址组 893 + 社区组 54)→ 较逐家编码节省 77%;并发编码(max_workers=5)全量 2.4 分钟(串行需 15–25 分钟);坐标缓存命中后重跑秒级。最终命中 396 家(已按信用代码去重,剔除数据源 214 条重复记录)。
实践建议:优先用 township(零成本);必须半径时先用 L1 镇街白名单 + 规则3 社区整体包含, 最后才对零散地址逐条编码。坐标缓存(
cache_file)使重跑/调参零重复消耗。
错误处理
| 情形 | 处理 |
|------|------|
| 无 KUAICHA_API_KEY | 引导至 open.kuaicha365.com/skills 获取试用密钥;或退用天眼查 CLI(仅区县) |
| 无地图 Key(radius 模式) | 提示配置 AMAP_KEY/TENCENT_MAP_KEY/BAIDU_AK,或改用 township/district |
| 圆心地址地理编码失败 | 请用户直接提供经纬度,或换地图源(三源自动故障转移) |
| 工商源 total=0 | 告知无数据,建议放宽范围/时间 |
| 部分地址编码失败 | 归入 unresolved,Excel 标注,不阻塞整体 |
| 数据量过大 | 提示配额/耗时,确认后继续或缩小范围 |
注意事项
- 数据源为工商开放平台,存在 1–3 天更新延迟,刚成立(3 天内)企业可能未收录。
- 天眼查 CLI 区域搜索是名称匹配且不含注册地址,街道/半径模式必须用同花顺快查。
- 半径模式为"近似半径":社区整体包含会微量过纳入边缘企业,营销拓客场景可接受。
- 联系方式可能不完整,结果作为线索名单,实际联系前人工核验。
- 遵守各数据源服务协议,查询结果仅用于合规商业用途。
文件结构
new-enterprise-query/
SKILL.md — 本文件(通用三范围 + 三条减员规则)
tyc_tools.py — 天眼查 CLI 适配器(兜底区县源,v1.x 保留)
geocoders.py — 多源地图地理编码(高德/腾讯/百度,缓存+计数+BD09转GCJ02)
geo_filter.py — 范围过滤引擎(三模式 + 规则1/2/3 + L0/L1)
source_kuaicha.py — 同花顺快查适配器(推荐源,返回注册地址)
scripts/export_excel.py — Excel 导出(含 匹配范围/距离/命中规则 列)
references/ — tyc_tools 备用副本、enterprise_query、requirements.txt
使用说明.txt — 使用说明
微信扫一扫