w3resource

Python Image Downloader: Download Images from a URL

Image Downloader:

Build a program that downloads images from a given URL.

Input values:
User provides the URL of a website containing images to be downloaded

Output value:
Images are downloaded from the specified URL and saved to a local directory.

Example:

Input values:
Enter the URL of the website with images: https://example.com/images
Output value:
Images downloaded successfully and saved to the local directory.

Here are two different solutions for an "Image Downloader" program in Python. This program will take a URL from the user, find all images on the specified webpage, and download them to a local directory.

Prerequisites:

Before running the code, ensure that the following libraries are installed:

pip install requests beautifulsoup4

Solution 1: Basic Approach using 'requests' and 'BeautifulSoup'

Code:

# Solution 1: Basic Approach Using `requests` and `BeautifulSoup`

import os  # Provides functions for interacting with the operating system
import requests  # Allows sending HTTP requests
from bs4 import BeautifulSoup  # Used for parsing HTML content

def download_image(url, folder_path):
    """Download an image from a URL to the specified folder."""
    # Get the image name from the URL
    image_name = url.split("/")[-1]
    # Send a GET request to the image URL
    response = requests.get(url, stream=True)
    
    # Check if the request was successful
    if response.status_code == 200:
        # Save the image to the local directory
        with open(os.path.join(folder_path, image_name), 'wb') as file:
            for chunk in response.iter_content(1024):
                file.write(chunk)
        print(f"Downloaded: {image_name}")
    else:
        print(f"Failed to download: {url}")

def download_images_from_url(website_url, folder_path):
    """Download all images from a specified URL."""
    # Send a GET request to the website URL
    response = requests.get(website_url)
    
    # Check if the request was successful
    if response.status_code == 200:
        # Parse the website content with BeautifulSoup
        soup = BeautifulSoup(response.text, 'html.parser')
        # Find all image tags in the HTML content
        img_tags = soup.find_all('img')
        
        # Create the directory if it doesn't exist
        os.makedirs(folder_path, exist_ok=True)

        # Download each image
        for img in img_tags:
            img_url = img.get('src')
            # If the image URL is valid, download the image
            if img_url and img_url.startswith(('http://', 'https://')):
                download_image(img_url, folder_path)
            else:
                print(f"Invalid URL found: {img_url}")
    else:
        print(f"Failed to retrieve the webpage. Status code: {response.status_code}")

# Get the URL and folder path from the user
website_url = input("Enter the URL of the website with images: ")
folder_path = "downloaded_images"  # Folder to save the images

# Download images from the specified URL
download_images_from_url(website_url, folder_path) 

Output:

(base) C:\Users\ME>python test.py
Enter the URL of the website with images: https://www.wikipedia.org/
Invalid URL found: portal/wikipedia.org/assets/img/Wikipedia-logo-v2.png
Downloaded: Wikimedia_Foundation_logo_-_wordmark.svg

Explanation:

  • Uses requests to send HTTP GET requests to the specified URL and BeautifulSoup to parse HTML content and extract image URLs.
  • Defines two functions:
    • download_image(url, folder_path): Downloads an individual image from a given URL and saves it to a local directory.
    • download_images_from_url(website_url, folder_path): Downloads all images from the specified website.
  • Checks if the img tags contain valid URLs and downloads only those starting with http:// or https://.
  • Simple and effective, but lacks modularity for future improvements.

Solution 2: Using a Class-Based approach for better Organization

Prerequisites

Ensure that the following libraries are installed:

pip install requests beautifulsoup4

Code:

# Solution 2: Using a Class-Based Approach for Better Organization

import os  # Provides functions for interacting with the operating system
import requests  # Allows sending HTTP requests
from bs4 import BeautifulSoup  # Used for parsing HTML content

class ImageDownloader:
    """Class to handle image downloading from a given URL."""

    def __init__(self, url, folder_path='downloaded_images'):
        """Initialize the downloader with a URL and a folder path."""
        self.url = url
        self.folder_path = folder_path

    def download_image(self, image_url):
        """Download a single image from a URL to the specified folder."""
        image_name = image_url.split("/")[-1]
        response = requests.get(image_url, stream=True)
        
        if response.status_code == 200:
            with open(os.path.join(self.folder_path, image_name), 'wb') as file:
                for chunk in response.iter_content(1024):
                    file.write(chunk)
            print(f"Downloaded: {image_name}")
        else:
            print(f"Failed to download: {image_url}")

    def download_all_images(self):
        """Download all images from the specified website URL."""
        response = requests.get(self.url)
        
        if response.status_code == 200:
            soup = BeautifulSoup(response.text, 'html.parser')
            img_tags = soup.find_all('img')

            os.makedirs(self.folder_path, exist_ok=True)

            for img in img_tags:
                img_url = img.get('src')
                if img_url and img_url.startswith(('http://', 'https://')):
                    self.download_image(img_url)
                else:
                    print(f"Invalid URL found: {img_url}")
        else:
            print(f"Failed to retrieve the webpage. Status code: {response.status_code}")

# Get the URL from the user
website_url = input("Enter the URL of the website with images: ")

# Create an instance of ImageDownloader and start the download process
downloader = ImageDownloader(website_url)
downloader.download_all_images() 

Output:

(base) C:\Users\ME>python test.py
Enter the URL of the website with images: https://commons.wikimedia.org/wiki/Main_Page
Downloaded: 500px-Castillo_de_Hohenwerfen%2C_Werfen%2C_Austria%2C_2019-05-17%2C_DD_143-149_PAN.jpg
Downloaded: 14px-Magnify-clip_%28sans_arrow%29.svg.png
Downloaded: 100px-Generic_Camera_Icon.svg.png
Downloaded: 45px-Wikimedia-logo_black.svg.png
Downloaded: 32px-Wikipedia-logo-v2.svg.png
Downloaded: 32px-Wikinews-logo.svg.png
Downloaded: 32px-Wiktionary-logo.svg.png
Downloaded: 32px-Wikibooks-logo.svg.png
Downloaded: 32px-Wikiquote-logo.svg.png
---------------------------------------- 
----------------------------------------

Explanation:

  • Encapsulates the image downloading logic in an 'ImageDownloader' class, making the code more modular and organized.
  • The '__init__' method initializes the class with the URL and folder path where images will be saved.
  • The 'download_image()' method handles downloading individual images, while 'download_all_images()' manages the overall downloading process.
  • The class-based approach makes the code more reusable, scalable, and easier to maintain or extend with additional features.

Note:
Both solutions effectively implement an image downloader that retrieves images from a given URL and saves them to a local directory, with Solution 1 using a straightforward function-based approach and Solution 2 using a class-based design for better organization and extensibility.



Become a Patron!

Follow us on Facebook and Twitter for latest update.