TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 업무 자동화>

[이미지 웹스크래핑] 픽사베이 API Key 발급을 통한 이미지 수집

by 기록자_Recordian 2024. 9. 5.
728x90
반응형

앞서 네이버를 통해 이미지 웹스크래핑으로 이미지를 수집했으나, 그 수가 현저히 모자라기도 하고 원하는 이미지 (Tire Tread) 외에 다른 이미지까지 포함되어 있어 좀 더 정확한 이미지 + 대규모 이미지 의 수집이 필요했다.

 

웹 스크래핑을 허용하거나, API Key 발급이 용이하고 무료인 이미지 저장 사이트를 검색하다가 챗 GPT에서 하단의 사이트를 안내해줬다.

<챗GPT 제안 사항>
기타 공개 도메인 이미지 웹사이트:

Pixabay - 단순화된 Pixabay 라이센스에 따라 무료 이미지를 제공합니다. 또한 이미지에 액세스하기 위한 API도 제공합니다.
Pexels - 무료 스톡 이미지의 대규모 컬렉션이며 API도 제공합니다.
Wikimedia Commons - 공개 도메인 및 무료 라이센스 미디어 파일로 구성된 대규모 데이터베이스이며 일반적으로 스크래핑이 허용됩니다.

 

첫번째로, 스크래핑이 허용되는 Wikimedia Commons 에 접속하였으나, 원하는 이미지가 별로 없어서 포기하였고,

두번째로 Pixabay 에 접속하여 살펴보니, 가입 및 API Key 발급이 매우 용이하였다.


Pixabay API Key 발급

 

https://pixabay.com/api/docs/

 

Pixabay API Documentation

lang str Language code of the language to be searched in. Accepted values: cs, da, de, en, es, fr, id, it, hu, nl, no, pl, pt, ro, sk, fi, sv, tr, vi, th, bg, ru, el, ja, ko, zh Default: "en" category str Filter results by category. Accepted values: backgr

pixabay.com

상단의 홈페이지에 접속하여 가입 (나는 구글 계정으로 가입했다) 하면, API Key가 바로 안내된다.

분당 최대 100개의 이미지 수집이 가능하여 (물론 하루 또는 최대 수집 허용 수가 있겠지만) 이미지 수집이 보다 원활할 것으로 보여진다.


이미지 수집을 위한 코드(파이썬)

 

중요한 점은, 분당 수집할 수 있는 이미지 수가 저장되어 있으므로, 코드를 여러 번 수행해줘야 한다는 점이다.

따라서, 코드를 실행 시에 이미지 수집 개수를 수정해주고,

이미 다운 받은 이미지는 스킵하고 다음 이미지가 다운 받아질 수 있도록 코드를 구현하여 실행하였다.

import requests
import os

# Your Pixabay API key
API_KEY = 'YOUR_API_KEY'

# Search query and parameters
query = 'tire tread'
# 코드 가장 끝의 페이지 수 = 이미지 수집 개수
url = f'https://pixabay.com/api/?key={API_KEY}&q={query}&image_type=photo&per_page=20'

# Directory to save images
save_dir = 'pixabay_api_images'

# Send a request to Pixabay API
response = requests.get(url)
data = response.json()

# Check if the request was successful
if response.status_code == 200:
    # Create directory if it doesn't exist
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)

    # Get a list of already downloaded image filenames
    downloaded_images = set(os.listdir(save_dir))
    
    # Download images
    for i, hit in enumerate(data['hits']):
        img_url = hit['largeImageURL']  # Large size image URL
        img_name = f"tire_tread_{i+1}.jpg"  # Image name format

        # Check if the image is already downloaded
        if img_name not in downloaded_images:
            # Download and save the image
            img_data = requests.get(img_url).content
            with open(os.path.join(save_dir, img_name), 'wb') as f:
                f.write(img_data)
            print(f"Downloaded image {i+1}: {img_name}")
        else:
            print(f"Image {img_name} already downloaded. Skipping...")
else:
    print(f"Error: {data['message']}")

 

 

 

728x90
반응형