使用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 获取图片存储到本地内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论