Bulk Downloading AI-Generated Images Efficiently Using Leonardo.ai API

In the ever-evolving world of artificial intelligence, generating images has become a fascinating domain. Whether you are a developer looking to create a portfolio of AI-generated art, or a researcher gathering data for analysis, having a reliable method to bulk download these images can save you significant time and effort. In this blog post, we will explore how to create a Python script that efficiently fetches and downloads AI-generated images using an API.

Introduction with Use Case

Imagine you have access to an API that generates images based on specific prompts or conditions. You may want to compile a large dataset of these images for training models or simply to curate a collection. Manually downloading each image is not only tedious but also impractical for large datasets. This is where automation comes in. By leveraging Python, we can write a script that handles the fetching and downloading of images in bulk, allowing you to focus on more creative pursuits.

Fetching Data from an API

This snippet demonstrates how to fetch paginated data from an API using a loop, handling responses, and managing rate limits.

📚 Recommended Python Learning Resources

Level up your Python skills with these hand-picked resources:

Academic Calculators Bundle: GPA, Scientific, Fraction & More

Academic Calculators Bundle: GPA, Scientific, Fraction & More

Click for details
View Details →

ACT Test (American College Testing) Prep Flashcards Bundle: Vocabulary, Math, Grammar, and Science

ACT Test (American College Testing) Prep Flashcards Bundle: Vocabulary, Math, Grammar, and Science

Click for details
View Details →

Leonardo.Ai API Mastery: Python Automation Guide (PDF + Code + HTML

Leonardo.Ai API Mastery: Python Automation Guide (PDF + Code + HTML

Click for details
View Details →

100 Python Projects eBook: Learn Coding (PDF Download)

100 Python Projects eBook: Learn Coding (PDF Download)

Click for details
View Details →

HSPT Vocabulary Flashcards: 1300+ Printable Study Cards + ANKI (PDF)

HSPT Vocabulary Flashcards: 1300+ Printable Study Cards + ANKI (PDF)

Click for details
View Details →
def fetch_all_generations():
    offset = 0
    all_generations = []
    while True:
        print(f"Fetching offset {offset}...")
        url = f"https://cloud.leonardo.ai/api/rest/v1/generations/user/{USER_ID}?offset={offset}&limit={LIMIT}"
        response = requests.get(url, headers=headers)
        if response.status_code != 200:
            print(f"Failed to fetch at offset {offset}: {response.text}")
            break
        data = response.json()
        generations = data.get("generations", [])
        if not generations:
            break
        all_generations.extend(generations)
        if len(generations) < LIMIT:
            break
        offset += LIMIT
        time.sleep(1)  # avoid rate limits
    return all_generations

Prerequisites and Setup

Before we dive into the implementation, ensure you have the following prerequisites:

Downloading an Image

This snippet illustrates how to download an image from a URL, handle existing files, and manage exceptions during the download process.

def download_image(url, dest_folder):
    filename = os.path.basename(urlparse(url).path)
    filepath = os.path.join(dest_folder, filename)
    if os.path.exists(filepath):
        print(f"Skipping existing: {filename}")
        return
    try:
        response = requests.get(url)
        response.raise_for_status()
        with open(filepath, 'wb') as f:
            f.write(response.content)
        print(f"Downloaded: {filename}")
    except Exception as e:
        print(f"Error downloading {url}: {e}")
  • Python 3.x: Make sure Python is installed on your machine. You can download it from the official Python website.
  • Requests Library: This Python library simplifies making HTTP requests. Install it using pip:
pip install requests

Once you have the necessary tools, we’ll set up the environment for our script. You’ll need an API key for the image generation service you intend to use. Replace the placeholder in the script with your actual API key or set it as an environment variable for better security.

Core Concepts Explanation

In this tutorial, we will cover several core concepts that are essential for understanding the implementation:

Extracting Image URLs

This snippet shows how to extract image URLs from a list of generated images, demonstrating the use of nested loops and dictionary access.

def extract_image_urls(generations):
    urls = []
    for gen in generations:
        for img in gen.get("generated_images", []):
            url = img.get("url")
            if url:
                urls.append(url)
    return urls

API Interaction

APIs (Application Programming Interfaces) allow developers to interact with external services. In our case, we will be making GET requests to an API that provides generated images. Understanding how to construct these requests and handle responses is crucial.

File Handling

Downloading images involves writing data to files. We will explore how to handle file paths, check for existing files, and manage exceptions to create a robust downloading mechanism.

Data Pagination

Many APIs return data in pages, especially when dealing with large datasets. We will implement pagination in our script, allowing us to fetch all available images efficiently without missing any.

Step-by-Step Implementation Walkthrough

Now that we’ve covered the concepts, let’s walk through the implementation of our bulk image downloader. The main components of our script include:

Creating a Directory

This snippet serves as the main entry point of the program, demonstrating how to create a directory, fetch data, and orchestrate the downloading of images.

def main():
    Path(DOWNLOAD_DIR).mkdir(exist_ok=True)
    gens = fetch_all_generations()
    print(f"Found {len(gens)} generations")
    urls = extract_image_urls(gens)
    print(f"Found {len(urls)} images to download")
    for url in urls:
        download_image(url, DOWNLOAD_DIR)

1. Setting Up API Access

We start by defining constants like the API key, user ID, download directory, and the limit for API requests. By structuring these as constants, we make our code more readable and easier to maintain.

2. Creating the Download Directory

Before downloading images, we ensure that the target directory exists. This prevents errors related to missing directories during file writing. We will use the pathlib library for a more elegant directory handling approach.

3. Fetching Data from the API

The function responsible for fetching generated images will handle pagination automatically. It will continue to make requests until it retrieves all available images. We will also implement error handling to manage any failed requests gracefully, providing informative output to the user.

4. Extracting Image URLs

Once we have the data, the next step is to extract the image URLs. This involves navigating through the JSON structure returned by the API. Understanding the data format is crucial here, as it dictates how we access the desired information.

5. Downloading Images

The heart of our script is the image download function. This function checks if an image already exists before attempting to download it, thus avoiding unnecessary network requests and preserving bandwidth. We will also implement exception handling to manage any download errors.

6. Putting It All Together

Finally, we will combine all these components in a main function, orchestrating the workflow from fetching to downloading images. This structured approach not only makes our code cleaner but also easier to troubleshoot and extend in the future.

Advanced Features or Optimizations

After mastering the basic implementation, you might want to enhance your script with advanced features:

Setting Up Headers for API Requests

This snippet defines the headers required for making authenticated requests to the API, highlighting the importance of API keys in securing access.

headers = {
    "accept": "application/json",
    "authorization": f"Bearer {API_KEY}"
}
  • Multi-threading: Consider using Python’s threading or asyncio libraries to download multiple images concurrently, significantly speeding up the process.
  • Progress Tracking: Implement progress bars using libraries like tqdm to provide visual feedback during the download process.
  • Rate Limiting: Handle rate limits imposed by the API by implementing delays between requests or by checking response headers for limit information.

Practical Applications

This bulk downloading technique can be applied in various scenarios:

Using Environment Variables

This snippet illustrates how to set up an API key, emphasizing the best practice of using environment variables for sensitive information.

API_KEY = "YOUR_API_KEY_HERE"  # Or use os.getenv("LEONARDO_API_KEY")
  • Data Collection: Collecting datasets for training machine learning models.
  • Personal Projects: Building a gallery of AI-generated images for creative projects.
  • Research: Gathering images for analysis in academic or industry research.

Click the image below to check out this Digital Download on Etsy.com

Common Pitfalls and Solutions

As with any coding endeavor, you may encounter challenges along the way. Here are some common pitfalls and their solutions:

  • Rate Limit Errors: If you encounter HTTP 429 status codes, it indicates that you’re exceeding the allowed number of requests. Implementing a delay or checking the API documentation can help.
  • File Overwrites: Ensure that your script checks for existing files to avoid unintentional data loss.
  • Network Issues: Handle exceptions gracefully to ensure your script can recover from temporary network problems without crashing.

Conclusion with Next Steps

In this tutorial, we have explored how to create a Python script for bulk downloading AI-generated images efficiently. By understanding the core concepts of API interaction, file handling, and pagination, you can easily adapt this script for various use cases.

As your next steps, consider experimenting with the advanced features mentioned, such as multi-threading and progress tracking. You can also explore different APIs to see how your script can be adapted for other data types, such as videos or audio files.

Automation is a powerful tool in a developer’s toolkit, and mastering it will unlock new possibilities in your projects. Happy coding!


About This Tutorial: This code tutorial is designed to help you learn Python programming through practical examples. Always test code in a development environment first and adapt it to your specific needs.

Want to accelerate your Python learning? Check out our premium Python resources including Flashcards, Cheat Sheets, Interivew preparation guides, Certification guides, and a range of tutorials on various technical areas.

Scroll to Top
WhatsApp Chat on WhatsApp