使用Python實(shí)現(xiàn)調(diào)用API獲取圖片存儲(chǔ)到本地的方法
使用Python實(shí)現(xiàn)調(diào)用API獲取圖片存儲(chǔ)到本地

1、項(xiàng)目概述
開(kāi)發(fā)一個(gè)自動(dòng)化工具,用于從JSON數(shù)據(jù)源中提取圖像ID,通過(guò)調(diào)用指定API獲取未經(jīng)壓縮的原始圖像文件,并確保下載結(jié)果與Postman等工具直接調(diào)用API獲取的文件完全一致。
2、核心功能
自動(dòng)解析含嵌套結(jié)構(gòu)的JSON輸入文件
API請(qǐng)求模擬引擎
精確復(fù)現(xiàn)Postman請(qǐng)求行為
支持自動(dòng)重定向跟蹤
禁用自動(dòng)解壓縮(保留原始二進(jìn)制流)
3、環(huán)境準(zhǔn)備
# 安裝依賴 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"
},
// 更多數(shù)據(jù)條目...
]4、代碼實(shí)現(xiàn)
import json
import requests
import base64
import os
import mimetypes
# 配置參數(shù)
INPUT_JSON = "input.json" # 輸入的JSON文件路徑
OUTPUT_DIR = "raw_images" # 圖片輸出目錄(修改目錄以示區(qū)別)
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):
"""通過(guò)數(shù)據(jù)URI或魔術(shù)數(shù)字檢測(cè)圖片類型"""
try:
# 處理數(shù)據(jù)URI格式
if base64_str.startswith("data:image/"):
mime_type = base64_str.split(";")[0].split(":")[1]
return mimetypes.guess_extension(mime_type) or ".png"
# 通過(guò)魔術(shù)數(shù)字檢測(cè)原始二進(jìn)制格式
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():
# 創(chuàng)建輸出目錄
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
# 遍歷處理每個(gè)條目
for idx, item in enumerate(data, 1):
image_id = item.get("original_image_id")
if not image_id:
print(f"條目 {idx} 缺少original_image_id,已跳過(guò)")
continue
print(f"正在處理 ({idx}/{len(data)}): {image_id}")
# 調(diào)用API
try:
response = requests.post(
API_URL,
json={"EntityGuid": image_id},
headers={"Content-Type": "application/json"},
timeout=60 # 延長(zhǎng)超時(shí)時(shí)間
)
print(f"響應(yīng)狀態(tài)碼: {response.status_code}")
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"API調(diào)用失敗: {str(e)[:200]}") # 顯示部分錯(cuò)誤信息
continue
# 處理base64數(shù)據(jù)
try:
base64_str = response.text
# 檢測(cè)并分割數(shù)據(jù)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}")
# 保存原始二進(jìn)制數(shù)據(jù)
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、結(jié)果查看

補(bǔ)充: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) # 自定義延時(shí)
print('抓取完成')到此這篇關(guān)于使用Python實(shí)現(xiàn)調(diào)用API獲取圖片存儲(chǔ)到本地的文章就介紹到這了,更多相關(guān)python 獲取圖片存儲(chǔ)到本地內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python如何在word中存儲(chǔ)本地圖片
- Python?Matplotlib中使用plt.savefig存儲(chǔ)圖片的方法舉例
- Python+OpenCV圖像處理——打印圖片屬性、設(shè)置存儲(chǔ)路徑、調(diào)用攝像頭
- python讀取圖片的幾種方式及圖像寬和高的存儲(chǔ)順序
- 用python代碼將tiff圖片存儲(chǔ)到j(luò)pg的方法
- 使用python存儲(chǔ)網(wǎng)頁(yè)上的圖片實(shí)例
- python3下使用cv2.imwrite存儲(chǔ)帶有中文路徑圖片的方法
- Python實(shí)現(xiàn)識(shí)別手寫數(shù)字 簡(jiǎn)易圖片存儲(chǔ)管理系統(tǒng)
相關(guān)文章
Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之鏈表詳解
這篇文章主要介紹了Python實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之鏈表,詳細(xì)分析了鏈表的概念、定義及Python實(shí)現(xiàn)與使用鏈表的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
Python實(shí)現(xiàn)的監(jiān)測(cè)服務(wù)器硬盤使用率腳本分享
這篇文章主要介紹了Python實(shí)現(xiàn)的監(jiān)測(cè)服務(wù)器硬盤使用率腳本分享,本文腳本適應(yīng)windows和linux系統(tǒng),需要的朋友可以參考下2014-11-11
全面解析Python中的Scikit-learn強(qiáng)大工具
Scikit-learn是一個(gè)功能強(qiáng)大的Python機(jī)器學(xué)習(xí)庫(kù),提供了統(tǒng)一的接口實(shí)現(xiàn)各種機(jī)器學(xué)習(xí)算法,通過(guò)本文,你將了解如何安裝和使用Scikit-learn,涵蓋數(shù)據(jù)預(yù)處理、模型選擇、訓(xùn)練和評(píng)估等步驟,感興趣的朋友跟隨小編一起看看吧2026-01-01
如何配置關(guān)聯(lián)Python 解釋器 Anaconda的教程(圖解)
這篇文章主要介紹了如何配置關(guān)聯(lián)Python 解釋器 Anaconda的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)火鍋工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Python ORM框架SQLAlchemy學(xué)習(xí)筆記之關(guān)系映射實(shí)例
這篇文章主要介紹了Python ORM框架SQLAlchemy學(xué)習(xí)筆記之關(guān)系映射實(shí)例,Classic (經(jīng)典模式)和Modern (現(xiàn)代模式),分別介紹了,需要的朋友可以參考下2014-06-06

