如何通过MediaWiki或维基百科API提取指定页面的内容图片URL?
先提取页面标题
从维基百科URL里扒出页面标题就行,比如https://zh.wikipedia.org/wiki/上海的标题是上海,英文页面https://en.wikipedia.org/wiki/Shanghai的标题是Shanghai。调用API拿图片列表
用MediaWiki的action=query接口,搭配prop=images和titles参数,就能拿到页面里所有内容关联的图片名称,完全不会包含维基Logo这类站点UI图,因为API只返回页面内容里嵌入的图片。
举个中文维基的请求例子:https://zh.wikipedia.org/w/api.php?action=query&prop=images&titles=上海&format=json
返回的结果里会有类似File:Shanghai Bund night view.jpg的图片名称。获取图片的实际访问URL
拿到图片名称后,再用prop=imageinfo和iiprop=url参数调用API,就能拿到图片的直接URL。
示例请求:https://zh.wikipedia.org/w/api.php?action=query&prop=imageinfo&titles=File:Shanghai Bund night view.jpg&iiprop=url&format=json
结果里的imageinfo[0].url就是你要的图片地址。可选:过滤非内容图
要是页面里有模板带的小图标,你可以根据图片名称(比如带icon关键词)、尺寸来过滤,不过一般API返回的列表已经都是内容图了,不用额外处理。Python实现代码
直接用requests库就能搞定,代码简洁明了:import requests def get_wiki_content_images(page_title, lang="zh"): base_url = f"https://{lang}.wikipedia.org/w/api.php" # 获取页面关联的图片名称列表 params = { "action": "query", "prop": "images", "titles": page_title, "format": "json", "imlimit": "max" # 一次性获取所有图片 } resp = requests.get(base_url, params=params) data = resp.json() image_titles = [] for page in data["query"]["pages"].values(): if "images" in page: image_titles = [img["title"] for img in page["images"]] # 只保留File开头的图片条目 image_titles = [title for title in image_titles if title.startswith("File:")] # 批量获取图片的实际URL image_urls = [] if image_titles: params = { "action": "query", "prop": "imageinfo", "titles": "|".join(image_titles), "iiprop": "url", "format": "json" } resp = requests.get(base_url, params=params) data = resp.json() for page in data["query"]["pages"].values(): if "imageinfo" in page: image_urls.append(page["imageinfo"][0]["url"]) return image_urls # 调用示例 if __name__ == "__main__": page_title = "上海" content_images = get_wiki_content_images(page_title) for url in content_images: print(url)
这个方案的核心是利用维基百科API直接获取页面内容关联的图片,完全避开了网页UI元素的干扰,比用BeautifulSoup解析HTML靠谱得多。
内容的提问来源于stack exchange,提问作者Skander Karoui

