You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用get_main_image函数从Wikimedia获取高清图片遇阻

解决Wikimedia图片爬取仅下载低质量版本的问题

你的get_main_image函数之所以只下载低质量图,核心问题是当前代码抓取的是页面展示的缩略图链接,而非Wikimedia存储的原图地址。比如你给的示例链接,页面里的img标签默认加载的是压缩后的缩略图,原图需要从页面的「原图」入口获取。

原代码的问题点

  • 通过soup.find('img', alt=article)拿到的src/srcset都是页面适配用的缩略图,分辨率和文件大小都被压缩过
  • 没有获取到Wikimedia提供的原始图片资源链接

修改后的函数实现

直接从页面中提取原图的下载链接,替换掉原来的缩略图获取逻辑:

import requests
from bs4 import BeautifulSoup as bs
from PIL import Image
from io import BytesIO

def get_main_image(wiki_link, article, save_dir, IMAGE_NUM):
    headers = {
        "Authorization": f"Bearer {access_token}",
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    }
    image_page_url = wiki_link + article.replace(" ", "_")
    image_name = str(IMAGE_NUM + 1)
    
    response = requests.get(image_page_url, headers=headers)
    soup = bs(response.text, 'html.parser')
    
    main_image_url = None
    # 优先获取原图链接:页面中"原图"按钮对应的链接
    try:
        full_media_link = soup.find('a', class_='fullMedia')
        if full_media_link:
            main_image_url = full_media_link['href']
            # 补全相对路径的域名
            if not main_image_url.startswith('http'):
                main_image_url = 'https:' + main_image_url
    except Exception as e:
        pass
    
    # 备用方案:从图片容器提取大图链接(应对极端情况)
    if not main_image_url:
        try:
            img_container = soup.find('div', id='file')
            if img_container:
                img_link = img_container.find('a')['href']
                main_image_url = 'https:' + img_link if not img_link.startswith('http') else img_link
        except Exception as e:
            return image_page_url, None
    
    if not main_image_url:
        return image_page_url, None
    
    # 下载原图
    try:
        main_image_response = requests.get(url=main_image_url, headers=headers, stream=True)
        main_image_response.raise_for_status()  # 检查请求是否成功
    except Exception as e:
        return image_page_url, None
    
    # 处理不同格式的图片保存
    try:
        image = Image.open(BytesIO(main_image_response.content))
        # 根据原图后缀设置文件名
        if article.endswith('.svg'):
            image_name += '.png'
        elif article.endswith('.djvu'):
            image_name += '.jpg'
        else:
            file_ext = article.split('.')[-1] if '.' in article else 'png'
            image_name += f'.{file_ext}'
        
        save_path = f"{save_dir}/{image_name}"
        image.save(save_path)
        return image_page_url, image_name
    except Exception as e:
        return image_page_url, None

关键修改说明

  1. 原图链接获取:通过页面里的fullMedia类链接直接拿到原图地址,这是Wikimedia官方提供的原图入口,保证拿到的是最大分辨率版本
  2. URL补全:处理相对路径的情况,确保请求地址有效
  3. 错误处理增强:增加了请求状态检查,避免下载无效内容
  4. 格式处理优化:更稳妥地处理不同图片格式的保存逻辑

修改后再爬取你提供的示例链接,就能拿到4.33MB的原始图片了。

内容的提问来源于stack exchange,提问作者whoistari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 18:10:30