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.
It will be nice if you may share this link in any developer community or anywhere else, from where other developers may find this content. Thanks.
https://w3resource.com/projects/python/python-image-downloader-project.php
- Weekly Trends and Language Statistics
- Weekly Trends and Language Statistics