当前位置: 代码网 > it编程>前端脚本>Python > 使用Python实现调用API获取图片存储到本地的方法

使用Python实现调用API获取图片存储到本地的方法

2025年05月23日 Python 我要评论
使用python实现调用api获取图片存储到本地1、项目概述开发一个自动化工具,用于从json数据源中提取图像id,通过调用指定api获取未经压缩的原始图像文件,并确保下载结果与postman等工具直

使用python实现调用api获取图片存储到本地

1、项目概述

开发一个自动化工具,用于从json数据源中提取图像id,通过调用指定api获取未经压缩的原始图像文件,并确保下载结果与postman等工具直接调用api获取的文件完全一致。

2、核心功能

自动解析含嵌套结构的json输入文件

api请求模拟引擎

精确复现postman请求行为

支持自动重定向跟踪

禁用自动解压缩(保留原始二进制流)

3、环境准备

# 安装依赖
pip install requests python-magic-bin==0.4.24  # windows
pip install requests python-magic           # linux/macos

编辑input.json文件格式:

[
  {
    "postimage": "{...}",
    "preimage": "{...}",
    "original_image_id": "6cd6187a-a20e-f011-998a-000d3ac8927d"
  },
  // 更多数据条目...
]

4、代码实现

import json
import requests
import base64
import os
import mimetypes
# 配置参数
input_json = "input.json"  # 输入的json文件路径
output_dir = "raw_images"   # 图片输出目录(修改目录以示区别)
api_url = "https://prod-53.southeastasia.logic.azure.com:443/workflows/8de920a489c7490a9e2207bd538ce964/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%2ftriggers%2fmanual%2frun&sv=1.0&sig=qo01wql5tzdzegpevid43spndovxbq4g7qo0nwcz7b8"
def determine_image_type(base64_str):
    """通过数据uri或魔术数字检测图片类型"""
    try:
        # 处理数据uri格式
        if base64_str.startswith("data:image/"):
            mime_type = base64_str.split(";")[0].split(":")[1]
            return mimetypes.guess_extension(mime_type) or ".png"
        # 通过魔术数字检测原始二进制格式
        decoded = base64.b64decode(base64_str)
        if decoded.startswith(b'\xff\xd8\xff'):
            return ".jpg"
        elif decoded.startswith(b'\x89png\r\n\x1a\n'):
            return ".png"
        elif decoded.startswith(b'gif87a') or decoded.startswith(b'gif89a'):
            return ".gif"
        elif decoded.startswith(b'riff') and decoded[8:12] == b'webp':
            return ".webp"
    except exception:
        pass
    return ".bin"  # 未知类型
def process_images():
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=true)
    # 读取json文件
    try:
        with open(input_json, 'r', encoding='utf-8') as f:
            data = json.load(f)
    except exception as e:
        print(f"读取json文件失败: {e}")
        return
    # 遍历处理每个条目
    for idx, item in enumerate(data, 1):
        image_id = item.get("original_image_id")
        if not image_id:
            print(f"条目 {idx} 缺少original_image_id,已跳过")
            continue
        print(f"正在处理 ({idx}/{len(data)}): {image_id}")
        # 调用api
        try:
            response = requests.post(
                api_url,
                json={"entityguid": image_id},
                headers={"content-type": "application/json"},
                timeout=60  # 延长超时时间
            )
            print(f"响应状态码: {response.status_code}")
            response.raise_for_status()
        except requests.exceptions.requestexception as e:
            print(f"api调用失败: {str(e)[:200]}")  # 显示部分错误信息
            continue
        # 处理base64数据
        try:
            base64_str = response.text
            # 检测并分割数据uri
            if "," in base64_str:
                header, payload = base64_str.split(",", 1)
                file_ext = determine_image_type(header)
                base64_str = payload
            else:
                decoded = base64.b64decode(base64_str)
                file_ext = determine_image_type(base64_str)
            # 解码base64
            image_data = base64.b64decode(base64_str)
            # 生成文件名(保留原始格式)
            output_path = os.path.join(output_dir, f"{image_id}{file_ext}")
            # 保存原始二进制数据
            with open(output_path, "wb") as f:
                f.write(image_data)
            print(f"原始图片已保存至: {output_path} ({len(image_data):,} bytes)")
        except exception as e:
            print(f"处理失败: {str(e)[:200]}")
if __name__ == "__main__":
    process_images()

5、结果查看

补充:python 图片抓取 并保存到本地

import requests
from bs4 import beautifulsoup
from pil import image
import os 
from io import bytesio
import time
url = "http://www.yestone.com/gallery/1501754333627"
headers = {"user-agent": "mozilla/5.0 (windows nt 10.0; wow64) applewebkit/537.36 (khtml, like gecko) chrome/55.0.2883.87 safari/537.36"}
r = requests.get(url, headers=headers)
soup = beautifulsoup(r.content, 'html.parser')
items = soup.find('div',class_='images-list')
folder_path = './photo'
# html = requests.get('http://st2.cdn.yestone.com/thumbs/2704315/vector/11688/116887226/api_thumb_450.jpg')
# html = requests.get('/_nuxt/img/4c1a746.jpg')
# print(html.content)
# image = image.open(bytesio(html.content))
# image.save(folder_path+"/aaa.jpg")
# print(items.find_all('img'))
# exit()
if os.path.exists(folder_path) == false:
   os.makedirs(folder_path)
for index, item in enumerate(items.find_all('img')):
    if item:
        html = requests.get(item.get('src'))
        img_name = str(index + 1) + '.jpg'
        image = image.open(bytesio(html.content))
        image.save(folder_path+"/"+img_name)
        print('第%d张图片下载完成' % (index + 1))
        time.sleep(1)  # 自定义延时
print('抓取完成')

到此这篇关于使用python实现调用api获取图片存储到本地的文章就介绍到这了,更多相关python 获取图片存储到本地内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com