Wikimedia Commons 上汇聚了数百万张自由授权的图片素材,很多开发者会把它当作图库来用。不过通过网页右键另存为保存下来的图片,往往是经过缩放的处理版本,分辨率和画质都打了折扣。想要拿到真正的原始文件,需要理解 Commons 的文件组织方式和它的 URL 规则,必要时还要借助 API 来程序化获取。这篇文章就围绕这个主题,把网页端和代码端的获取方法都梳理清楚。

网页端手动下载原图的正确姿势
打开 Commons 上任意一个文件页面,比如一张风景照片的详情页,页面下方会出现不同尺寸的缩略图列表。很多人习惯直接点开某个尺寸另存为,这样得到的其实是服务器动态生成的 JPEG 缩放版本,而不是上传者提交的原始文件。
正确的做法是点击文件详情页右侧的“原始文件”链接,这个链接指向的是 Special:FilePath 重定向地址,会直接返回未经处理的原图。如果页面上没有看到这个入口,也可以点击主图进入文件查看页面,再选择下载原始文件选项。对于 SVG 矢量图来说这一点尤其重要,因为缩略图列表里的都是渲染成 PNG 后的位图,只有原始文件才是矢量格式,可以无损放大。
另一个容易被忽略的细节是文件页面的信息面板中会标注原始分辨率和文件大小。下载完成后建议核对一下这两个数值,如果与你拿到的文件不符,说明很可能下载到的是缩放版本。部分浏览器会预加载页面上的展示图,右键图片时保存的可能是这张预览图,这也是常见的画质损失原因。
利用 Commons API 程序化获取原始文件地址
如果要批量处理或者在自己的应用中集成下载功能,就需要使用 MediaWiki API 了。核心接口是 imageinfo,它可以返回一个文件的详细信息,其中 url 字段就是原始文件的直链。请求时需要带上 prop=imageinfo 和 iiprop=url|size|mime 参数,这样响应里会同时包含原图地址、宽高和 MIME 类型。
下面是一个用 Python 实现的完整示例,通过 requests 库请求 API 并解析出原始图片地址,然后下载到本地:
import requests
API = "https://commons.wikimedia.org/w/api.php"
def get_original_url(filename):
"""根据文件名获取原始文件的直链"""
params = {
"action": "query",
"titles": f"File:{filename}",
"prop": "imageinfo",
"iiprop": "url|size|mime",
"format": "json"
}
headers = {"User-Agent": "MyImageDownloader/1.0 (contact: admin@ipipp.com)"}
r = requests.get(API, params=params, headers=headers, timeout=15)
r.raise_for_status()
pages = r.json()["query"]["pages"]
for page in pages.values():
if "imageinfo" in page:
info = page["imageinfo"][0]
print(f"尺寸: {info['width']}x{info['height']}")
print(f"格式: {info['mime']}")
return info["url"]
return None
def download(url, save_path):
headers = {"User-Agent": "MyImageDownloader/1.0"}
with requests.get(url, headers=headers, stream=True, timeout=30) as r:
r.raise_for_status()
with open(save_path, "wb") as f:
for chunk in r.iter_content(8192):
f.write(chunk)
if __name__ == "__main__":
url = get_original_url("2022-02-TierparkBerlin-Blauracke.jpg")
if url:
download(url, "original.jpg")
print("原图下载完成")
这里有两个关键点值得注意。第一,Commons 的 API 强制要求请求带上 User-Agent 头,如果缺失或者写成一个简单的 python-requests 默认值,服务器有可能拒绝请求甚至临时封禁 IP,建议按照规范填写工具名称和联系方式。第二,API 的响应结构中 page 对象可能带有 missing 标记,代表文件名不存在,实际项目中应当做好这种异常处理,而不是假设每次都能取到 imageinfo 字段。
如果要批量获取,可以改用 titles 参数一次传入多个文件名(用竖线分隔,单次上限约 50 个),或者配合 generator=allimages 遍历分类下的所有文件,这样能显著减少请求次数,避免触发访问频率限制。
缩略图 URL 反推与常见限制处理
Commons 的图片资源部署在多个域名上,常见的有 upload.wikimedia.org。它的缩略图地址有一套固定规则,理解之后可以直接从一张缩略图地址反推出原图位置。例如一个典型的缩略图地址形如 upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Filename.jpg/800px-Filename.jpg,去掉末尾的 800px- 段和 thumb 路径,就得到了原始文件地址。手工处理时这个技巧很实用,但要注意哈希目录 a/ab 依赖于文件名的 MD5 计算结果,不能凭空猜测,只能基于已有的完整地址做删减。
反过来,如果你已经拿到了原图地址,也可以构造出任意宽度的缩略图,这在做响应式图片加载时非常有用。把 thumb 路径和目标宽度插入 URL 即可,服务器会按需生成。需要提醒的是,对 SVG 文件请求位图缩略图时,URL 中通常要带 .png 后缀,表示渲染后的格式。
最后是权限和限流方面的注意事项。Commons 上的文件大多采用 CC BY 或 CC BY-SA 等自由许可协议,下载使用本身没有技术门槛,但再利用时必须遵守署名要求,具体条款可以在每个文件页面的授权信息中查看。程序化下载方面,官方建议单 IP 的请求频率保持克制,大批量抓取最好加上请求间隔,比如每次请求之间休眠一两秒,并且优先走 API 而不是直接爬取页面 HTML,这样既稳定也不会给服务器造成压力。遵循这些规则,就可以长期稳定地从 Commons 获取高质量的原始素材了。
Wikimedia Commons原图下载API修改时间:2026-09-12 19:26:30