使用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
关键修改说明
- 原图链接获取:通过页面里的
fullMedia类链接直接拿到原图地址,这是Wikimedia官方提供的原图入口,保证拿到的是最大分辨率版本 - URL补全:处理相对路径的情况,确保请求地址有效
- 错误处理增强:增加了请求状态检查,避免下载无效内容
- 格式处理优化:更稳妥地处理不同图片格式的保存逻辑
修改后再爬取你提供的示例链接,就能拿到4.33MB的原始图片了。
内容的提问来源于stack exchange,提问作者whoistari
相关产品推荐
相关产品推荐

