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: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) ![Node.js](https://img.shields.io/badge/Node.js-≥18-339933?logo=node.js&logoColor=white) ![Python](https://img.shields.io/badge/Python-3.9+-3776AB?logo=python&logoColor=white) ![No paid API](https://img.shields.io/badge/paid%20data%20API-not%20required-brightgreen) 我经常会看到一些想要评估规模的公司名称(看它们的营收,确认它们到底有多大),但我非常讨厌每次都得去 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抓取, 企业信息查询, 商业数据, 数据抓取, 无后门, 欧洲, 特征检测, 自定义脚本, 逆向工具