2023-02-05 작성

파이썬에서 OpenAPI를 통해 이미지 수집하기

파이썬으로 간단한 예제를 만들어보려고 한다. OpenAPI를 통해 고독한 박명수 이미지를 수집할 것이다. 웹 크롤링으로 이미지를 가져올 수도 있지만 간단히 OpenAPI를 사용하겠다.

OpenAPI는 카카오나 네이버 등에서 벡엔드를 미리 구축해 놓고, 사용자에게 그 벡엔드를 이용하는 방법을 제공한다. 즉, 사용자는 이미 만들어진 백엔드를 사용법만 알면 백엔드 자원을 사용할 수 있다. 즉, 프런트엔드만 신경쓰고 개발하면 되는 것이다.

이번 포스팅에서는 파이썬과 주피터 노트북을 이용하여, 카카오, 네이버에서 제공한 OpenAPI로 고독한 박명수 짤을 수집해 볼 것이며, 최종 목표는 아래와 같다.

최종 목표

사전 준비

1. 파이썬과 주피터가 설치되어 있지 않다면 파이썬 3.11 설치와 주피터 노트북 사용법 포스팅을 참고하여 설치한다.

2. OpenAPI로 이미지 짤을 수집하기 위해서는 카카오 또는 네이버에서 제공하는 OpenAPI 앱 키를 발급받아야 한다. 이는 카카오, 네이버 OpenAPI 앱 키 발급받는 방법 포스팅을 참고하여 본인이 적용할 플랫폼의 앱 키를 발급받는다. 카카오의 앱 키만 발급받아도 되고, 또는 네이버의 앱 키만 발급받아도 상관없다.

3. OpenAPI에서 데이터를 가져올 때 requests 라이브러리를 사용한다. 파이썬의 requests 라이브러리 사용법을 잘 모른다면 requests 사이트에서 기본적인 사용법을 숙지한 후, '윈도우키+R'을 눌러서 나타난 실행창에 'cmd'를 입력하여 창을 켠다. 그리고 아래 명령어를 입력하여  라이브러리를 설치하자.

# requests 라이브러리 설치
pip install requests

모든 사전 준비가 끝났다면, 이미지 검색 OpenAPI를 호출해 볼 것이다. 카카오, 네이버의 사용 규칙이 조금씩 다른 부분이 있으므로 정확한 내용은 문서를 참고하는 것이 좋다.

1. 이미지 검색 OpenAPI 호출하기

1) 카카오 OpenAPI로 이미지 호출

카카오에서 제공한 이미지 검색 OpenAPI을 사용하여 이미지가 있는 URL을 출력할 것이다. 이미지 검색 요청시(request), 검색을 원하는 질의어로 query 파라미터를 필수값으로 보내야 한다. 나는 query 파라미터에 '고독한 박명수'로 설정할 것이다.

 

이미지 검색 응답시(response), 응답 결과 데이터에서 documents > image_url 항목이 추출하고자 하는 이미지 URL이다. 즉, image_url 항목이 추출할 목표 대상이다.

 

위에서 가이드한 request, response 파라미터와 가이드 샘플을 참고하여 '고독한 박명수' 이미지 URL을 요청하는 소스를 작성했다.

import requests

# 1. 이미지 검색 파라미터 세팅
url = "https://dapi.kakao.com/v2/search/image"
headers = {
    "Authorization" : "KakaoAK 본인의_카카오앱_REST_API_키"
}
params = {
    "query" : "고독한 박명수"
}

# 2. 이미지 검색 요청
response = requests.get(url, headers=headers, params=params)

# 3. 이미지 검색 요청 성공시
if response.status_code == 200:
    response_data = response.json()
    
    # 4. 저장할 이미지의 URL 출력
    for index, image_info in enumerate(response_data['documents']):
        print(f"[{index+1}번째] image_url =", image_info['image_url'])
        
# 5. 이미지 검색 요청 실패시
else: 
    print("error code : ", response.status_code)

아래는 주피터 노트북에서 소스를 실행한 결과이다. 카카오 이미지 검색 OpenAPI 호출 결과, 정상적으로 추출하고자 하는 이미지가 정상적으로 나오는 것을 알 수 있다.

2) 네이버 OpenAPI로 이미지 호출

이번에는 네이버에서 제공된 이미지 검색 OpenAPI을 사용하여 이미지가 있는 URL을 출력해보자. 이미지 검색요청시(request), query 파라미터를 필수로 보내야 한다. 카카오와 동일한 파라미터명이므로 query 파라미터에 '고독한 박명수'로 설정할 것이다.

 

이미지 검색 응답시(response), 응답 데이터 중에서 item > link 항목이 추출하고자 하는 이미지 URL이다. 즉, link 항목이 추출할 목표 대상이다.

 

제공된 request, response 파라미터와 제공된 가이드 샘플을 참고해서 '고독한 박명수' 이미지 URL을 요청하는 소스를 작성했다.

import requests

# 1. 이미지 검색 파라미터 세팅
client_id = "본인의_네이버_클라이언트ID"
client_secret = "본인의_네이버_클라이언트_시크릿ID"
query = "고독한 박명수"
url = "https://openapi.naver.com/v1/search/image.json?query=" + query
headers = {
    "X-Naver-Client-Id" : client_id, 
    "X-Naver-Client-Secret" : client_secret
}

# 2. 이미지 검색 요청
response = requests.get(url, headers=headers)

# 3. 이미지 검색 요청 성공시
if response.status_code == 200:
    response_data = response.json()
    
    # 4. 저장할 이미지의 URL 출력
    for index, image_info in enumerate(response_data['items']):
        print(f"[{index+1}번째] image_url =", image_info['link'])
        
# 5. 이미지 검색 요청 실패시
else: 
    print("error code : ", response.status_code)

아래는 주피터 노트북에서 실행한 결과이다. 네이버 이미지 검색 OpenAPI 호출 결과, 정상적으로 추출하고자 하는 이미지가 정상적으로 나오는 것을 알 수 있다.

2. 이미지 파일 저장하는 함수 선언

1번 과정에서 카카오, 네이버에서 이미지 링크들을 모두 가져왔다. 이제 이 이미지 링크를 기반으로, 실제 내 컴퓨터에 이미지 파일로 저장해보자. 아래 소스는 이미지 파일을 저장하는 함수이다. 파이썬 함수는 소스 최상단에 위치하는 게 좋다.

# 이미지 파일 저장하는 함수
def save_image(image_url, file_name):
    img_response = requests.get(image_url)
    
    # 이미지 검색 요청 성공시
    if img_response.status_code == 200:
        
        # 파일로 저장
        with open(file_name, "wb") as fp:
            fp.write(img_response.content)

3. 함수 호출하기

2번에서 만든 save_image 함수를 실제로 호출하기 위해, 아까 1번과 2번 소스를 통합해보자. 아래 소스가 이번 포스팅 목표이자 전체 소스 완성본이다. 

1) 카카오 OpenAPI 사용하여 이미지 저장하기(최종 소스)

import requests

# 이미지 파일 저장하는 함수
def save_image(image_url, file_name):
    img_response = requests.get(image_url)
    
    # 이미지 검색 요청 성공시
    if img_response.status_code == 200:
        
        # 파일로 저장
        with open(file_name, "wb") as fp:
            fp.write(img_response.content)
            
# 1. 이미지 검색 파라미터 세팅
url = "https://dapi.kakao.com/v2/search/image"
headers = {
    "Authorization" : "KakaoAK 본인의_카카오앱_REST_API_키"
}
params = {
    "query" : "고독한 박명수"
}

# 2. 이미지 검색 요청
response = requests.get(url, headers=headers, params=params)

# 3. 이미지 검색 요청 성공시
if response.status_code == 200:
    response_data = response.json()
    
    # 4. 저장할 이미지의 URL 출력
    for index, image_info in enumerate(response_data['documents']):
        # print(f"[{index+1}번째] image_url =", image_info['image_url'])
        
        # 6. 파일명 세팅 후 이미지 저장
        file_name = "lonelyPark_%d.jpg" %(index+1)
        save_image(image_info['image_url'], file_name)
        
# 5. 이미지 검색 요청 실패시
else: 
    print("error code : ", response.status_code)

2) 네이버 OpenAPI 사용하여 이미지 저장하기(최종 소스)

import requests

# 이미지 파일 저장하는 함수
def save_image(image_url, file_name):
    img_response = requests.get(image_url)
    
    # 이미지 검색 요청 성공시
    if img_response.status_code == 200:
        
        # 파일로 저장
        with open(file_name, "wb") as fp:
            fp.write(img_response.content)

# 1. 이미지 검색 파라미터 세팅
client_id = "본인의_네이버_클라이언트ID"
client_secret = "본인의_네이버_클라이언트_시크릿ID"
query = "고독한 박명수"
url = "https://openapi.naver.com/v1/search/image.json?query=" + query
headers = {
    "X-Naver-Client-Id" : client_id, 
    "X-Naver-Client-Secret" : client_secret
}

# 2. 이미지 검색 요청
response = requests.get(url, headers=headers)

# 3. 이미지 검색 요청 성공시
if response.status_code == 200:
    response_data = response.json()
    
    # 4. 저장할 이미지의 URL 출력
    for index, image_info in enumerate(response_data['items']):
        # print(f"[{index+1}번째] image_url =", image_info['link'])
        
        # 6. 파일명 세팅 후 이미지 저장
        file_name = "lonelyPark_%d.jpg" %(index+1)
        save_image(image_info['link'], file_name)
        
# 5. 이미지 검색 요청 실패시
else: 
    print("error code : ", response.status_code)

실행 결과

주피터 노트북에서 실행해 보면, 아래처럼 '고독한 박명수' 짤이 수집되는 것을 알 수 있다. 간단하게 파이썬과 주피터 노트북을 이용하여, 카카오와 네이버 OpenAPI로 고독한 박명수 짤을 수집해 보았다.

Reference