Python数据解析与图片下载工具:从JSON到本地文件的自动化流程
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 tqdmdef 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 resultdef 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)# 过滤无效URLvalid_urls = [url for url in url_list if url.strip()]if not valid_urls:print("没有找到有效的图片URL")returnprint(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 ThreadPoolExecutordef 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数据解析到图片资源下载的自动化流程。代码设计模块化,易于扩展,可以根据实际需求添加更多功能,为数据处理和资源管理提供便利。无论是个人项目还是企业级应用,都能从中受益。