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

1、項目概述
開發(fā)一個自動化工具,用于從JSON數(shù)據(jù)源中提取圖像ID,通過調(diào)用指定API獲取未經(jīng)壓縮的原始圖像文件,并確保下載結(jié)果與Postman等工具直接調(diào)用API獲取的文件完全一致。
2、核心功能
自動解析含嵌套結(jié)構(gòu)的JSON輸入文件
API請求模擬引擎
精確復現(xiàn)Postman請求行為
支持自動重定向跟蹤
禁用自動解壓縮(保留原始二進制流)
3、環(huá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、代碼實現(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):
"""通過數(shù)據(jù)URI或魔術(shù)數(shù)字檢測圖片類型"""
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"
# 通過魔術(shù)數(shù)字檢測原始二進制格式
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
# 遍歷處理每個條目
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}")
# 調(diào)用API
try:
response = requests.post(
API_URL,
json={"EntityGuid": image_id},
headers={"Content-Type": "application/json"},
timeout=60 # 延長超時時間
)
print(f"響應狀態(tài)碼: {response.status_code}")
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"API調(diào)用失敗: {str(e)[:200]}") # 顯示部分錯誤信息
continue
# 處理base64數(shù)據(jù)
try:
base64_str = response.text
# 檢測并分割數(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}")
# 保存原始二進制數(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é)果查看

補充: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('抓取完成')到此這篇關(guān)于使用Python實現(xiàn)調(diào)用API獲取圖片存儲到本地的文章就介紹到這了,更多相關(guān)python 獲取圖片存儲到本地內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用python+request通過接口實現(xiàn)人員通行記錄上傳功能
這篇文章主要介紹了利用python+request通過接口實現(xiàn)人員通行記錄上傳功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
pyqt5 tablewidget 利用線程動態(tài)刷新數(shù)據(jù)的方法
今天小編就為大家分享一篇pyqt5 tablewidget 利用線程動態(tài)刷新數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
Python數(shù)據(jù)可視化Pyecharts庫實現(xiàn)桑葚圖效果
這篇文章主要介紹了Python數(shù)據(jù)可視化如何使用Pyecharts庫來實現(xiàn)桑葚圖效果圖,文中給出實現(xiàn)的示例代碼,有需要的朋友可以借鑒參考想,希望能夠有所幫助2021-09-09
python selenium對應的瀏覽器chromedriver版本不一致問題
這篇文章主要介紹了python selenium對應的瀏覽器chromedriver版本不一致問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
Python3標準庫之threading進程中管理并發(fā)操作方法
這篇文章主要介紹了Python3標準庫之threading進程中管理并發(fā)操作方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03

