tfbecker/european-company-registers
GitHub: tfbecker/european-company-registers
一个开源命令行工具集,从欧洲四国官方公司登记册免费抓取财务与注册数据并输出结构化 JSON,同时可作为 LLM Agent 技能使用。
Stars: 0 | Forks: 0
# 欧洲公司登记册
查询来自德国、法国、波兰和英国的公司财务及登记数据,无需付费给数据提供商。这是一组小型命令行脚本,以及一个为 Claude(或任何 LLM)设计的 [agent skill](#use-it-as-a-claude--llm-skill):从官方文件中提取营收、资产负债表和利润,并直接从登记册中获取董事、股本和公司法定形式等信息。
[](LICENSE)



我经常会看到一些想要评估规模的公司名称(看它们的营收,确认它们到底有多大),但我非常讨厌每次都得去 Bundesanzeiger 上手动查询。所以我为官方登记册编写了爬虫,让它们返回干净的 JSON。它从一个德国脚本逐渐发展,覆盖了四个国家。
## 覆盖范围
| 国家 | 数据源 | 获取内容 | 依赖项 |
|---|---|---|---|
| 🇩🇪 德国 | Unternehmensregister + Bundesanzeiger | 财务数据:每个财政年度的营收、总资产、权益、利润、P&L 项目、员工人数(包括 DiRUG 改革后的 2022 财年及以后),以及完整的报告文本 | `claude` CLI;2022 财年及以后需要隐身浏览器 |
| 🇩🇪 德国 | Handelsregister (handelsregister.de) | 登记册内容:董事 / 董事会、股本、法定形式、注册所在地、经营范围、Prokura、曾用名 | 隐身浏览器 + `pdftotext` |
| 🇫🇷 法国 | INPI / RNE (`recherche-entreprises.api.gouv.fr`) | 每年的营收和净利润,高管 (dirigeants),完整的元数据 | 无(免费,无需密钥) |
| 🇵🇱 波兰 | KRS(司法部) | 法定形式、NIP/REGON、所在地、股本、经营范围 (PKD)、董事会、已提交年度财务报表列表 | 无(无需密钥);名称搜索需要隐身浏览器 |
| 🇬🇧 英国 | Companies House | 公司简介、高管、提交记录历史、资产负债表元数据 | 免费 API 密钥 |
奥地利、西班牙和荷兰仅支持付费查询,因此未被覆盖。
## 为什么开发这个工具
商业公司数据 API(如 D&B、Orbis、North Data 等)会收取高昂的费用,来提供法律明确规定应公开的信息。官方登记册是免费提供这些数据的。问题在于,每个登记册都把数据隐藏在不同的障碍之后:这里是一个 CAPTCHA,那里是一个绑定会话的加密 payload,或者是一个 JSF 状态机、反爬虫墙、PDF 文件。这个仓库一次性帮你解决了这些繁琐的工作,直接为你输出 JSON。
德国数据获取流程中有两个部分花费了不少精力:
正确处理了 DiRUG 分离。自 DiRUG 改革以来,对于 2021 年 12 月 31 日之后开始的财政年度,其年度账目不再发布在 Bundesanzeiger 上。它们被转移到了 Unternehmensregister。因此,仅依赖 Bundesanzeiger 的爬虫已经过时了大约三年。这个工具会同时查询两个数据源,并将每个财政年度路由到实际持有该数据的源。
利用 LLM 免费读取数字。旧年份的德国账目背后有 CAPTCHA 保护,而新年份则有“Ich bin ein Mensch”的复选框。这里没有付费墙,只有一些操作摩擦。因此,Claude Haiku 读取 CAPTCHA 图像,而 Claude Sonnet 从德国报告文本中提取数字。无需付费的财务数据 API,也无需 OCR 服务。
## 快速开始
```
git clone https://github.com/tfbecker/european-company-registers.git
cd european-company-registers
REG="$PWD/scripts"
# Germany: 列出公司的 filings(快速,无需 key,无需 CAPTCHA)
node "$REG/de-combined.js" search "Pergolux"
# Germany: 提取最近几年的实际数据
node "$REG/de-combined.js" report "Pergolux"
# Germany: 注册内容(directors、share capital、legal form)
node "$REG/de-handelsregister.js" search "Holz-Richter"
# France: 真实的 revenue 和 officers,免费,无需 key
node "$REG/fr-inpi.js" analyze "Carrefour"
# Poland: 按 KRS number
node "$REG/pl-krs.js" company 0000019193
# UK: Companies House(需要免费的 key,参见 Setup)
node "$REG/gb-companies-house.js" search "Tesco"
```
所有结果都会将 JSON 打印到 stdout。
## 德国:财务数据 (Unternehmensregister + Bundesanzeiger)
这是主要的数据获取路径。两个数据源会被同时查询,并且在列表查询步骤永远不会触发 CAPTCHA。
```
node "$REG/de-combined.js" search "Pergolux" # newest report only (~0.4 s, default)
node "$REG/de-combined.js" search "Pergolux" --all # all reports, both sources
node "$REG/de-combined.js" report "Pergolux" # search once, then extract every free year's figures
node "$REG/de-combined.js" analyze "Pergolux" --year 2021 # one specific year's figures
```
当你需要多年数据时,请使用 `report` 命令。它会搜索一次,并在单一进程中提取最新的 N 年(默认为 5 年),将每年的数据路由到其对应的数据源。不要对每年重复循环调用 `analyze`。
`search` 的列表输出结果(这是一个真实的响应):
```
{
"country": "de",
"searched_name": "Pergolux",
"found": true,
"companies": [
{
"name": "Pergolux GmbH",
"location": "Fulda",
"euid": "DEM1301.HRB8398",
"register": "HRB 8398",
"court": "Fulda",
"state": "Hessen",
"newest_fiscal_year": "2024",
"reports": [
{ "fiscal_year": "2024",
"report_name": "Jahresabschluss zum Geschäftsjahr vom 01.01.2024 bis zum 31.12.2024",
"date": "2026-04-27", "sources": ["unternehmensregister"] }
]
}
]
}
```
`report` 和 `analyze` 输出的数字中,每年都会包含一个 `financial_data` 对象:
```
{
"fiscal_year": "2021",
"revenue": 1216000000,
"total_assets": 892000000,
"equity": 410000000,
"liabilities": 482000000,
"earnings": 63000000,
"operating_result": 71000000,
"personnel_expenses": 148000000,
"employees": 1240,
"is_group_report": false,
"currency": "EUR"
}
```
默认情况下,完整的报告文本(Jahresabschluss、Lagebericht、Anhang)也会被保存到 `./register-texts/` 目录中。这些是数字无法体现的定性内容:战略、前景、风险、所有权和关联方。请参阅 [`SKILL.md`](SKILL.md) 了解所有参数标志。
## 德国:登记册内容 (Handelsregister)
这不是财务数据,而是登记条目本身:法定形式、所在地、经营范围、股本以及相关人员。
```
node "$REG/de-handelsregister.js" search "Holz-Richter"
node "$REG/de-handelsregister.js" details "Holz-Richter GmbH" --hrb 37497 --court Köln
```
`details` 会下载 Aktueller Abdruck (AD),运行 `pdftotext`,并将其解析为结构化的 JSON:`share_capital`、`managing_directors[]`(包含出生日期)、`prokura[]`、`legal_form`、`purpose`、`seat`。请通过公司的 HRB 编号进行匹配,而不是依赖结果的位置顺序,因为顺序并不稳定。handelsregister.de 会限制文档下载的频率,因此在短暂冷却后重试 `details`。
## 法国:INPI / RNE
免费,无需密钥。通过开放的财务比率数据集,获取每年的真实营收 (`ca`) 和净利润,以及高管信息。
```
node "$REG/fr-inpi.js" analyze "Carrefour" # a name (best match) or a SIREN
```
```
{
"company_name": "CARREFOUR",
"country": "fr",
"registration_id": "652014051",
"found": true,
"officers": [
{ "name": "ALEXANDRE BOMPARD",
"role": "Président du conseil d'administration et directeur général",
"birth_year": "1972" }
]
}
```
可选的免费 `INPI_API_TOKEN` 可增加资产负债表的数据深度(总资产、权益)。没有它也可以正常获取营收。
## 波兰:KRS
司法部官方提供的基于 KRS 编号的 API 是最可靠的核心功能:
```
node "$REG/pl-krs.js" company 0000019193 # by KRS
node "$REG/pl-krs.js" nip 5252344078 # tax id to KRS
node "$REG/pl-krs.js" search "CD PROJEKT" # name search (stealth browser, Incapsula-protected)
```
你将获得法定形式、NIP/REGON、所在地、股本、经营范围 (PKD)、董事会(根据 GDPR 隐去姓名的成员),以及已提交的年度财务报表列表(包含周期、日期和知识库链接)。
## 英国:Companies House
```
node "$REG/gb-companies-house.js" search "Tesco"
node "$REG/gb-companies-house.js" company 00445790
node "$REG/gb-companies-house.js" filings 00445790
```
通过免费的 Companies House API 获取公司简介、高管和提交记录历史。解析资产负债表数据需要 XBRL,目前此功能尚未实现(参见 [`ROADMAP.md`](ROADMAP.md))。
## 作为 Claude / LLM skill 使用
该仓库也可用作 [Agent Skill](https://docs.claude.com/en/docs/claude-code/skills)。[`SKILL.md`](SKILL.md) 包含了 frontmatter 和使用说明,使 agent 能够知道何时以及如何调用每个脚本。将该仓库放入你的 skills 目录:
```
git clone https://github.com/tfbecker/european-company-registers.git ~/.claude/skills/european-company-registers
```
然后用自然语言提问:*“Pergolux 过去三年的营收是多少,董事是谁?”* agent 会运行正确的脚本并读取返回的 JSON。这些脚本是普通的 CLI,因此它们也可以在你自己的代码、cron 任务或任何其他 LLM 工具调用循环中正常使用。
## 依赖与设置
需要 Node.js 18+ 和 Python 3.9+。无需 `npm install`,也无需构建步骤,因为脚本仅使用标准库。
德国的财务数据需要已登录的 [`claude` CLI](https://docs.claude.com/en/docs/claude-code),用于 CAPTCHA 图像识别和数据提取。该程序会自动检测,或者你也可以手动设置 `CLAUDE_BIN`。目前这两个步骤是 Claude 专属的(有关如何使提取模型不依赖特定平台的说明,请参见 [`ROADMAP.md`](ROADMAP.md))。
基于浏览器的路径(如德国 Handelsregister、德国 2022 财年及以后的文档、波兰名称搜索)需要一个暴露了 `from cloakbrowser import launch`(一个 Playwright `Browser`)的隐身 Chromium。请将 `COMPANY_REGISTERS_BROWSER` 指向提供该功能的目录。仅依赖 HTTP 的路径(如 2021 年及之前的德国 Bundesanzeiger、法国、英国、按编号查询的波兰)则不需要浏览器。
Handelsregister 的 `details` 解析器需要 `pdftotext` (poppler)。
API 密钥仅在查询英国(必需)和法国(可选)时需要。请将它们设置为环境变量,或者将 `config/keys.example.json` 复制到 `config/keys.json`(已被 git 忽略):
```
{ "COMPANIES_HOUSE_API_KEY": "get-a-free-key-at-developer.company-information.service.gov.uk",
"INPI_API_TOKEN": "optional-free-token-for-french-balance-sheet-depth" }
```
德国和波兰无需 API 密钥。
## 负责任的使用
这些是公开的登记册,其数据在法律上也是公开的,但相关门户网站仍然有使用条款和速率限制。请礼貌查询,并缓存你获取的数据(该工具会保存报告文本,以免你重复获取),不要对网站造成过大压力。当受到限流时,Handelsregister 的处理路径已经内置了退避机制。你需要对自己如何使用这些数据负责,并且 GDPR 适用于诸如董事姓名等个人数据。本项目与任何登记册运营商均无关联。
## 路线图
[`ROADMAP.md`](ROADMAP.md) 包含了一些待办事项:英国 XBRL 数据解析、波兰 e-sprawozdania (JPK) 提取、INPI 资产负债表数据深度,以及与模型无关的提取器。
## 许可证
[MIT](LICENSE),Felix Becker。
# 🇩🇪 适用于 LLM 的欧洲商业登记册
无需昂贵的付费数据提供商,即可查询来自德国、法国、波兰和英国的公司财务数据及登记册内容。这是一组小型的命令行脚本,以及一个为 Claude(或任何其他 LLM)设计的 Agent Skill:从官方年度财报中提取营收、资产负债表和年度利润,并直接从登记册中获取董事、股本和法定形式等信息。
我经常想知道我在某处瞥见名称的公司到底有多大,并且我不想每次都手动去 Bundesanzeiger 查询。所以我编写了能返回干净 JSON 的官方登记册爬虫。从一个德国脚本开始,逐渐扩展到了四个国家。
## 覆盖范围
| 国家 | 数据源 | 获取内容 | 依赖项 |
|---|---|---|---|
| 🇩🇪 德国 | Unternehmensregister + Bundesanzeiger | 财务数据:每个财政年度的营收、资产负债表总额、权益、年度盈余、GuV 项目、员工人数(包括 DiRUG 改革后的 2022 财年及以后),以及完整的报告文本 | `claude` CLI;2022 财年及以后需要隐身浏览器 |
| 🇩🇪 德国 | Handelsregister (handelsregister.de) | 登记册内容:董事/董事会、股本、法定形式、所在地、经营范围、Prokura、曾用名 | 隐身浏览器 + `pdftotext` |
| 🇫🇷 法国 | INPI / RNE | 每年的营收和年度业绩,高管 (dirigeants),元数据 | 无(免费) |
| 🇵🇱 波兰 | KRS(司法部) | 法定形式、NIP/REGON、所在地、股本、经营范围 (PKD)、董事会、年度财报列表 | 无(免费) |
| 🇬🇧 英国 | Companies House | 公司简介、高管、提交记录历史、资产负债表元数据 | 免费 API 密钥 |
奥地利、西班牙和荷兰仅提供付费服务,因此未包含在内。
## 核心理念
商业公司数据提供商对法律上属于公开的信息收取高昂费用。官方登记册免费提供这些数据,但把它们隐藏在不同的障碍背后:CAPTCHA、绑定会话的加密 payload、JSF 状态机、反爬虫机制、PDF 文件。这个仓库一次性完成了这些繁琐的工作,并直接交给你 JSON。
在德国数据获取流程中,有两项工作是真正的难点:
DiRUG 断层。自 DiRUG 改革以来,2021 年 12 月 31 日之后开始的财政年度的年度财报不再在 Bundesanzeiger 上发布,而是移至 Unternehmensregister。因此,纯粹依赖 Bundesanzeiger 的爬虫大约已经过时了三年。这个工具会同时查询这两个数据源,并将每个财年路由到正确的位置。
利用 LLM 免费读取数字。这些财报隐藏在 CAPTCHA(旧年份)或“Ich bin ein Mensch”复选框(新年份)之后,没有付费墙,只有操作摩擦。Claude Haiku 读取 CAPTCHA 图像,Claude Sonnet 从德语报告文本中提取数字。无需付费的财务 API,也无需 OCR 服务。
## 快速开始
```
git clone https://github.com/tfbecker/european-company-registers.git
cd european-company-registers
REG="$PWD/scripts"
node "$REG/de-combined.js" search "Pergolux" # Jahresabschlüsse auflisten (schnell, ohne Key)
node "$REG/de-combined.js" report "Pergolux" # Umsatz/Bilanz der letzten Jahre auslesen
node "$REG/de-handelsregister.js" search "Holz-Richter" # Geschäftsführer, Stammkapital, Rechtsform
node "$REG/fr-inpi.js" analyze "Carrefour" # FR: Umsatz und Organe, kostenlos
```
## 作为 Claude / LLM Skill 使用
该仓库同时也是一个 [Agent Skill](https://docs.claude.com/en/docs/claude-code/skills)。[`SKILL.md`](SKILL.md) 包含了 frontmatter 及使用说明,以便 agent 知道何时以及如何调用这些脚本。
```
git clone https://github.com/tfbecker/european-company-registers.git ~/.claude/skills/european-company-registers
```
然后用自然语言提问:*“Pergolux GmbH 过去三年的营收是多少,董事是谁?”* agent 会调用相应的脚本并读取返回的 JSON。
## 先决条件
需要 Node.js 18+ 和 Python 3.9+,无需 `npm`,无需构建。德国的财务数据需要登录状态的 `claude` CLI(用于 CAPTCHA 图像识别和数据提取)。基于浏览器的路径(Handelsregister、2022 财年及以后、波兰名称搜索)需要隐身 Chromium(需设置 `COMPANY_REGISTERS_BROWSER`)。纯 HTTP 路径(2021 年及之前的 Bundesanzeiger、法国、英国、按编号查询的波兰)不需要浏览器。API 密钥仅在查询英国(必需)和法国(可选)时需要。德国和波兰无需密钥。
## 法律声明
这些登记册是公开的,但相关门户网站有使用条款和速率限制。请合理查询,缓存结果,不要给网站服务器造成过大负担。对于数据的使用,你需要自行承担责任,并且 GDPR 适用于诸如高管姓名等个人数据。本项目与登记册运营商没有任何关联。
## 许可证
[MIT](LICENSE),Felix Becker。
标签:GNU通用公共许可证, LLM Agent, MITM代理, Node.js, Python, URL抓取, 企业信息查询, 商业数据, 数据抓取, 无后门, 欧洲, 特征检测, 自定义脚本, 逆向工具