Sling Academy
Home/Node.js/NodeJS: Search and download images by keyword from Unsplash API

NodeJS: Search and download images by keyword from Unsplash API

Last updated: February 13, 2024

Overview

In this tutorial, we will dive into how to search for and download images by keyword from the Unsplash API using Node.js. Unsplash is a platform powered by a community of photographers that offers free high-resolution photos. By leveraging their API, you can access these resources directly from your application.

Pre-requisites

  • Node.js installed on your machine
  • An understanding of JavaScript and async/await
  • An Unsplash Developer Account and API Access Key

Step-by-Step Instructions

Step 1: Setting Up Your Project

Firstly, create a new Node.js project by initiating it with npm init in your terminal in a new directory. Install the necessary packages using npm:

npm install axios fs-extra

axios will be used for making HTTP requests to the Unsplash API, and fs-extra aids in handling file downloads and operations.

Step 2: Configure Your API Access

Head over to the Unsplash Developer page, sign up for an account, and create a new application to obtain your Access Key. Keep this key secure as it allows you to query the Unsplash API.

Step 3: Searching for Images by Keyword

Create a new file called searchUnsplash.js and start by importing the axios module:

const axios = require('axios');

Define your API Access Key:

const accessKey = 'YOUR_UNSPLASH_ACCESS_KEY';

Now let’s create a function to search for images on Unsplash based on a keyword:

async function searchImages(keyword) {
  try {
    const response = await axios.get(`https://api.unsplash.com/search/photos`, {
      params: {
        query: keyword,
        client_id: accessKey
      }
    });
    console.log(response.data.results);
    return response.data.results;
  } catch (error) {
    console.error(error);
  }
}

This function makes a GET request to the search/photos endpoint of the Unsplash API, passing in the search keyword and our access key as parameters. The results are then logged to the console.

Step 4: Downloading Images

Having obtained the search results, the next step is to download these images. Create another function in the searchUnsplash.js file:

const fs = require('fs-extra');
const path = require('path');

async function downloadImage(imageUrl, filename) {
  const response = await axios({
    url: imageUrl,
    method: 'GET',
    responseType: 'stream',
  });

  const writer = fs.createWriteStream(path.resolve(__dirname, 'downloads', filename));

  response.data.pipe(writer);

  return new Promise((resolve, reject) => {
    writer.on('finish', resolve);
    writer.on('error', reject);
  });
}

This function downloads an image from a given URL and saves it under a specified filename within a ‘downloads’ directory.

Step 5: Tying It All Together

Now that we have our search and download functions, let’s use them to find and then download images by a keyword:

async function findAndDownload(keyword) {
  const images = await searchImages(keyword);

  images.forEach(async (image, index) => {
    const { urls, alt_description } = image;
    await downloadImage(urls.regular, `${keyword}-${index}.jpg`);
    console.log(`Downloaded: ${alt_description || 'Image'}`);
  });
}

Remember to replace ‘YOUR_UNSPLASH_ACCESS_KEY’ with your actual Unsplash API access key.

Conclusion

By following this tutorial, you should now have a basic understanding of how to interact with the Unsplash API using Node.js to search for and download images based on keywords. This can be incredibly useful for projects that require dynamic image content without the overhead of manually sourcing and saving these resources.

While we’ve covered the basics, remember that the Unsplash API offers much more functionality, including but not limited to fetching random photos, photo statistics, and user information. Explore the Unsplash documentation to fully leverage its capabilities in your applications.

This tutorial also touches on important programming concepts such as asynchronous JavaScript, API interaction, and file handling in Node.js, providing a solid foundation for further learning and development.

Next Article: How to use multiple Node.js versions on a computer

Series: Node.js Intermediate Tutorials

Node.js

You May Also Like

  • NestJS: How to create cursor-based pagination (2 examples)
  • Cursor-Based Pagination in SequelizeJS: Practical Examples
  • MongooseJS: Cursor-Based Pagination Examples
  • Node.js: How to get location from IP address (3 approaches)
  • SequelizeJS: How to reset auto-increment ID after deleting records
  • SequelizeJS: Grouping Results by Multiple Columns
  • NestJS: Using Faker.js to populate database (for testing)
  • NestJS: Generate N random users using Faker.js
  • Sequelize Upsert: How to insert or update a record in one query
  • NodeJS: Declaring types when using dotenv with TypeScript
  • Using ExpressJS and Multer with TypeScript
  • NodeJS: Link to static assets (JS, CSS) in Pug templates
  • NodeJS: How to use mixins in Pug templates
  • NodeJS: Displaying images and links in Pug templates
  • ExpressJS + Pug: How to use loops to render array data
  • ExpressJS: Using MORGAN to Log HTTP Requests
  • NodeJS: Using express-fileupload to simply upload files
  • ExpressJS: How to render JSON in Pug templates
  • ExpressJS: How to pass variables to Pug templates