fetch_wiki_images.py

引子 — 一次偶然的启发

前阵子在 Hacker News 刷到一条关于“ADS‑B 数据可视化”的讨论,链接指向 ClickHouse/adsb.exposed 项目。点进去一看,项目作者Alexey Milovidov 等人使用 GridLayer + ClickHouse 后端,实现了一个出彩的 ADS‑B 可视化工程。项目使用 ClickHouse 作为后端存储与在线查询引擎,以极高的吞吐与并发支持地图瓦片式可视化。并且支持多种数据源(adsbexchange、airplanes.live 等),并把这些数据整合后用于地图渲染与报告生成。

我注意到在前端(index.html)里有一个“报告”系统,当鼠标悬停在某些字段(如飞机型号)时,会调用维基百科 API 去尝试获取对应图片并显示——这给了我极好的灵感。

作为正在开发 ADS‑B 接收机的一名爱好者,我一直苦于没有稳定、详实的飞机元数据(例如机型全称、图片、版权信息等),这篇文章恰好触及了我的痛点:如果能把飞机数据和图片结合,就能显著提升我的项目体验与用户界面。于是我开始着手把思路落地。

我的目标
把收集到的 ADS‑B 数据(至少有注册号、ICAO hex、可能的型号/业主信息)与一个尽量完整的 Aircraft 数据库(包含图片与版权信息)链接起来,并能自动为每条飞机记录找到一张合理的图片并把图片和版权信息保存下来/展示出来。

总体思路与流程(从数据到图片)

  1. 数据来源
    • 实时 ADS‑B 数据:来自本地接收机或上游集成(例如 adsbexchange、airplanes.live)。这些数据提供了 ICAO hex、注册号(N‑号)、航班号、以及部分机型字段。
    • 补充元数据:通过已有公开数据表(adsb.exposed 示例里有 flickr_mercator、flickr 等预抓取的照片表)或外部数据库(例如 planespotters、airframes)来补充型号/照片索引。
  2. 识别候选关键字
    • 优先使用 model(机型名),若无则尝试 registration(注册号,如 N901GW)、owner/operator(业主)、ICAO hex 等,组合搜索词(如 "A320 aircraft"、"N901GW aircraft")以提高命中率。
  3. 搜索并获取图片(客户端实现思路)
    • 先尝试精确页面匹配(action=query&titles=...)。
    • 若精确查无结果,则使用搜索接口(action=query&list=search)取第一个结果作为候选。
    • 使用 Wikimedia REST API 的 page summary(/api/rest_v1/page/summary/{title})优先获取 thumbnail 或 originalimage(单次请求通常能得到缩略图信息)。
    • 若需要更详细版权信息,则调用 action=query&prop=imageinfo&iiprop=extmetadata 对 File: 请求 extmetadata(LicenseShortName、Artist、Credit 等)。
    • 对返回的缩略图 URL 做合理处理(或直接请求指定尺寸的 pithumbsize),并缓存搜索结果以减少重复请求。
  4. 下载与保存
    • 将图片按规则命名并保存到指定目录(例如以 registration/title 命名),同时记录 image_url 与 attribution(版权/作者)到数据库或 CSV/JSON 记录中。
  5. 展示与交互
    • 在前端(地图或报告)实现 hover 显示图片与版权信息,或在你的接收机界面上显示缩略图和链接到原始维基页面/媒体页。

关键实现细节(我实际做的技术点)

我用到的核心脚本(简述)

运行体验与结果

版权与合规注意事项

下一步我打算

结语
从 Hacker News 的一次浏览,到翻阅 ClickHouse/adsb.exposed 源码并借鉴其思路,再到把维基百科与 ADS‑B 数据结合成一个可用的图片抓取流水线,这个过程既满足了我的工程好奇心,也解决了项目里一个实际的痛点。希望这篇整理能帮助同样在做 ADS‑B 或飞行相关数据可视化的朋友们少走弯路——我可以把用于抓图的脚本(含批处理与 notebook 调用示例)整理好附在文下。

—— End —

❤️ 转载文章请注明出处,谢谢!❤️