Python数据解析与图片下载工具:从JSON到本地文件的自动化流程

发布于:2025-07-03 ⋅ 阅读:(29) ⋅ 点赞:(0)

Python数据解析与图片下载工具:从JSON到本地文件的自动化流程

在日常开发和数据处理中,我们经常需要从JSON数据中提取信息,并根据其中的URL下载相关资源。本文将介绍一个实用的Python工具,它可以解析JSON数据,提取关键信息,并批量下载图片资源,适用于数据采集、内容管理和自动化测试等场景。

一、工具功能概述

这个多功能工具包含三个核心模块:

  1. JSON数据解析:从输入的JSON字符串中提取指定变量的值
  2. 数据格式化展示:以易读的方式展示提取的变量和数据
  3. 图片批量下载:根据提取的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列表")
三、核心功能解析
  1. JSON数据解析模块

    • parse_and_extract_data函数通过json.loads将JSON字符串转换为Python字典
    • 使用.get()方法安全地提取指定键的值,避免KeyError异常
    • 可根据需求扩展提取的变量列表,灵活适应不同的数据结构
  2. 数据格式化展示模块

    • print_variable_values函数根据数据类型采用不同的展示方式
    • 对于复杂列表数据(如嵌套字典),使用json.dumps配合缩进参数使其更易读
    • 对于长文本数据,分段展示并添加序号,提高可读性
  3. 图片批量下载模块

    • 支持从URL列表批量下载图片,自动创建保存目录
    • 智能处理URL解析和文件名生成,确保文件命名规范
    • 使用tqdm库提供直观的下载进度显示,支持断点续传(通过overwrite参数控制)
    • 完善的异常处理机制,确保单个URL下载失败不会影响整体流程
四、使用方法与示例
  1. 安装依赖

    pip install requests tqdm
    
  2. 基本使用流程

    python json_parser_and_downloader.py
    
    • 程序会提示输入JSON数据
    • 输入后,程序将解析数据并展示提取的变量
    • 如果JSON中包含pdf_pics字段且为有效URL列表,程序将自动下载图片
  3. 示例JSON输入

    {
        "title": "示例文档",
        "biaoqians": ["文档", "示例"],
        "pdf_pics": [
            "https://example.com/image1.jpg",
            "https://example.com/image2.jpg"
        ],
        "write_status": "已完成"
    }
    
五、进阶应用场景
  1. 数据采集与整理

    • 结合爬虫获取JSON格式的API响应
    • 自动提取并下载其中的图片资源
    • 用于构建图片数据集或内容管理系统
  2. 批量处理PDF中的图片

    • 结合PDF解析库(如PyMuPDF)提取PDF中的图片URL
    • 通过本工具批量下载这些图片
  3. 自动化测试

    • 在测试环境中,自动下载测试用例需要的图片资源
    • 确保测试环境的一致性和可重复性
六、代码优化方向
  1. 增加配置文件支持

    # 配置文件示例 config.json
    {
        "save_dir": "./my_images",
        "overwrite": false,
        "timeout": 30,
        "extracted_fields": ["biaoqians", "pdf_pics", "title"]
    }
    
  2. 多线程下载加速

    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()
    
  3. 增加图片处理功能

    • 下载后自动调整图片尺寸
    • 添加水印或其他特效
    • 格式转换(如JPG→PNG)

通过这个多功能工具,我们可以轻松实现从JSON数据解析到图片资源下载的自动化流程。代码设计模块化,易于扩展,可以根据实际需求添加更多功能,为数据处理和资源管理提供便利。无论是个人项目还是企业级应用,都能从中受益。


网站公告

今日签到

点亮在社区的每一天
去签到