Python数据解析与图片下载工具:从JSON到本地文件的自动化流程
在日常开发和数据处理中,我们经常需要从JSON数据中提取信息,并根据其中的URL下载相关资源。本文将介绍一个实用的Python工具,它可以解析JSON数据,提取关键信息,并批量下载图片资源,适用于数据采集、内容管理和自动化测试等场景。
一、工具功能概述
这个多功能工具包含三个核心模块:
- JSON数据解析:从输入的JSON字符串中提取指定变量的值
- 数据格式化展示:以易读的方式展示提取的变量和数据
- 图片批量下载:根据提取的URL列表下载图片并保存到本地
通过这三个模块的组合,我们可以轻松实现从数据提取到资源下载的自动化流程。
二、完整代码实现
# -*- coding: utf-8 -*-
import json
import os
import requests
from urllib.parse import urlparse
from tqdm import tqdm
def parse_and_extract_data(input_data):
"""
解析输入的JSON数据并提取各个变量的值
参数:
input_data -- 包含JSON数据的字符串
返回:
包含所有变量及其对应值的字典
"""
# 将输入的JSON字符串解析为Python字典
data_dict = json.loads(input_data)
# 提取各个变量的值
result = {
"biaoqians": data_dict.get("biaoqians", "未找到该变量"),
# "数据(data)": data_dict.get("data", "未找到该变量"),
"file": data_dict.get("file", "未找到该变量"),
"num": data_dict.get("num", "未找到该变量"),
# "OCR文字(ocrword)": data_dict.get("ocrword", "未找到该变量"),
"output": data_dict.get("output", "未找到该变量"),
"pdf_pics": data_dict.get("pdf_pics", "未找到该变量"),
"title": data_dict.get("title", "未找到该变量"),
"write_status": data_dict.get("write_status", "未找到该变量"),
"zhengwen": data_dict.get("zhengwen", "未找到该变量")
}
return result
def print_variable_values(variable_dict):
"""格式化打印各个变量及其对应的值"""
for variable_name, value in variable_dict.items():
print(f"\n{variable_name}:\n")
# 针对不同类型的数据采用不同的打印格式
if isinstance(value, list) and len(value) > 0 and isinstance(value[0], dict):
# 复杂列表数据(如data)
print(json.dumps(value, ensure_ascii=False, indent=4))
elif isinstance(value, list) and len(value) > 0 and isinstance(value[0], str) and len(value[0]) > 100:
# 长字符串列表(如ocrword)
for i, item in enumerate(value, 1):
print(f"第{i}项:\n{item}\n")
elif isinstance(value, list):
# 普通列表数据
print(json.dumps(value, ensure_ascii=False, indent=4))
else:
# 其他类型数据
print(value)
def download_images(url_list, save_dir='./downloaded_images', overwrite=False):
"""
从URL列表下载图片并保存到指定目录
参数:
url_list (list): 图片URL列表
save_dir (str): 保存图片的目录路径
overwrite (bool): 是否覆盖已存在的文件
"""
# 创建保存目录
os.makedirs(save_dir, exist_ok=True)
# 过滤无效URL
valid_urls = [url for url in url_list if url.strip()]
if not valid_urls:
print("没有找到有效的图片URL")
return
print(f"开始下载 {len(valid_urls)} 张图片到目录: {save_dir}")
# 遍历URL列表并下载图片
for url in tqdm(valid_urls, desc="下载进度"):
try:
# 解析URL获取文件名
parsed_url = urlparse(url)
filename = os.path.basename(parsed_url.path)
# 如果文件名无效,生成一个基于URL的哈希文件名
if not filename or '.' not in filename:
filename = f"image_{hash(url) & 0xfffffff:08x}.jpg"
# 构建完整的保存路径
save_path = os.path.join(save_dir, filename)
# 检查文件是否已存在
if os.path.exists(save_path) and not overwrite:
tqdm.write(f"跳过已存在的文件: {filename}")
continue
# 发送HTTP请求获取图片
response = requests.get(url, stream=True, timeout=10)
# 检查请求是否成功
if response.status_code == 200:
# 保存图片到文件
with open(save_path, 'wb') as f:
for chunk in response.iter_content(1024):
f.write(chunk)
tqdm.write(f"成功下载: {filename}")
else:
tqdm.write(f"下载失败: {url} (状态码: {response.status_code})")
except Exception as e:
tqdm.write(f"下载出错: {url} (错误: {str(e)})")
print(f"下载完成! 图片已保存到: {save_dir}")
# 使用示例
if __name__ == "__main__":
# 从用户输入获取JSON数据
input_data = input('请输入JSON数据: ')
print(f"接收到的JSON数据:\n{input_data}")
# 解析数据并提取变量
variable_dict = parse_and_extract_data(input_data)
# 打印各个变量及其对应的值
print_variable_values(variable_dict)
# 提取图片URL列表并下载
image_urls = variable_dict['pdf_pics']
if isinstance(image_urls, list) and len(image_urls) > 0:
download_images(image_urls, save_dir='./downloaded_images')
else:
print("未找到有效的图片URL列表")
三、核心功能解析
JSON数据解析模块
parse_and_extract_data
函数通过json.loads
将JSON字符串转换为Python字典- 使用
.get()
方法安全地提取指定键的值,避免KeyError异常 - 可根据需求扩展提取的变量列表,灵活适应不同的数据结构
数据格式化展示模块
print_variable_values
函数根据数据类型采用不同的展示方式- 对于复杂列表数据(如嵌套字典),使用
json.dumps
配合缩进参数使其更易读 - 对于长文本数据,分段展示并添加序号,提高可读性
图片批量下载模块
- 支持从URL列表批量下载图片,自动创建保存目录
- 智能处理URL解析和文件名生成,确保文件命名规范
- 使用
tqdm
库提供直观的下载进度显示,支持断点续传(通过overwrite
参数控制) - 完善的异常处理机制,确保单个URL下载失败不会影响整体流程
四、使用方法与示例
安装依赖
pip install requests tqdm
基本使用流程
python json_parser_and_downloader.py
- 程序会提示输入JSON数据
- 输入后,程序将解析数据并展示提取的变量
- 如果JSON中包含
pdf_pics
字段且为有效URL列表,程序将自动下载图片
示例JSON输入
{ "title": "示例文档", "biaoqians": ["文档", "示例"], "pdf_pics": [ "https://example.com/image1.jpg", "https://example.com/image2.jpg" ], "write_status": "已完成" }
五、进阶应用场景
数据采集与整理
- 结合爬虫获取JSON格式的API响应
- 自动提取并下载其中的图片资源
- 用于构建图片数据集或内容管理系统
批量处理PDF中的图片
- 结合PDF解析库(如PyMuPDF)提取PDF中的图片URL
- 通过本工具批量下载这些图片
自动化测试
- 在测试环境中,自动下载测试用例需要的图片资源
- 确保测试环境的一致性和可重复性
六、代码优化方向
增加配置文件支持
# 配置文件示例 config.json { "save_dir": "./my_images", "overwrite": false, "timeout": 30, "extracted_fields": ["biaoqians", "pdf_pics", "title"] }
多线程下载加速
from concurrent.futures import ThreadPoolExecutor def download_image(url, save_dir): # 单个图片下载逻辑 ... # 多线程下载 with ThreadPoolExecutor(max_workers=5) as executor: futures = [executor.submit(download_image, url, save_dir) for url in valid_urls] for future in tqdm.as_completed(futures, total=len(valid_urls)): future.result()
增加图片处理功能
- 下载后自动调整图片尺寸
- 添加水印或其他特效
- 格式转换(如JPG→PNG)
通过这个多功能工具,我们可以轻松实现从JSON数据解析到图片资源下载的自动化流程。代码设计模块化,易于扩展,可以根据实际需求添加更多功能,为数据处理和资源管理提供便利。无论是个人项目还是企业级应用,都能从中受益。