ai-creator

카카오 이미지검색 OpenAPI로 연예인 사진 모으기 본문

오늘 배워 오늘 쓰는 OpenAPI/프로젝트

카카오 이미지검색 OpenAPI로 연예인 사진 모으기

ai-creator 2020. 10. 4. 19:15
반응형

오.오.쓰 에 오신 것을 환영합니다.

카카오 이미지검색  OpenAPI를 사용하여 연예인 사진 모으기 프로젝트 입니다.

아래와 같은 순서로 배워보겠습니다.

 

1. 학습 목표

2. 사전 준비

3. 사전 지식 쌓기

4. 구현

5. 요약정리


1. 학습 목표

연예인 사진을 수집하기 위해서 어떻게 하시나요? 검색을 해서 맘에 드는 사진을 손으로 일일이 다운로드 받으시는 분들도 계실거고, 크롤링이라는 방법을 사용하여 사진을 다운로드 받으시는 분들이 계실 겁니다. 

그러나, 정말 쉬운 방법이 있습니다. 카카오에서 제공하는 이미지 검색 OpenAPI를 사용하면 정말 쉽게 연예인 사진을 다운로드 받을 수 있습니다.  일일이 다운로드 받는 것보다는 크롤링이 쉬운데, 크롤링은 웹구조를 알아야 한다는 부담감이 있거든요. 그러나 OpenAPI를 사용하면 그런 부담이 없습니다.

 

이번 장에서는 카카오에서 제공하는 이미지검색 OpenAPI로 좋아하는 연예인 사진을 모아봅시다. 필자가 좋아하는 연예인이 펭수여서 펭수 사진을 다운로드 받는 소스코드가 구현되어 있습니다. 여러분의 1순위 연예인으로 이번 예제를 실행해 보시고,  보다 쉽게 사진을 소장할 수 있는 즐거움을 느껴보세요.

[그림 1-1] 펭수 사진 다운로드 결과

2. 사전 준비

아래 링크로 들어가 Step3 까지 진행하세요. APP_KEY를 발급 받으셨다면, 4. 구현으로 넘어가셔도 됩니다.

ai-creator.tistory.com/20

 

카카오 OpenAPI 사용하기 (준비 사항 : 인증키 발급)

<< 목표 >> 카카오 플랫폼 서비스는 카카오톡, 카카오스토리와 같은 카카오 서비스 및 카카오 플랫폼 기술과 관련된 API를 제공합니다. 이런 서비스를 이용하기 위해 인증 키를 발급 받아 보겠습��

ai-creator.tistory.com

 

 

3. 사전 지식 쌓기

지식을 쌓을 내용은 다음과 같습니다. 

3-1) 파일 읽고, 쓰기

3-2) 웹에 있는 이미지 파일 저장하는 방법

 

3-1) 파일 읽고,  쓰기

전체 코드

# 파일 쓰기
data = "hello"
with open("test.txt", "w") as fp:
    fp.write(data)
    
# 파일 읽기
with open("test.txt", "r") as fp:
    print("========= [파일 읽기 결과] =========")
    print(fp.read())

실행 결과

작업 중인 폴더에  test.txt 파일이 생겼고, 그 파일을 열어보니 hello 가 적혀 있습니다.

[그림 1-16] 파일 쓰기 결과

 

test.txt를 읽은 결과는 아래와 같습니다.

[그림 1-17] 파일 읽기 결과

코드 설명

2 라인 : data변수에 파일에 쓰고 싶은 값을 넣습니다.

3~4 라인 : 'test.txt'를 'w' 모드, 즉 쓰기 모드로 열고, 파일 디스크립터를 fp 변수에 담고 data값을 쓰기 위해 write함수를 호출합니다. 

7~9 라인 :  'test.txt'를 'r' 모드, 즉 읽기 모드로 열고, 파일 디스크립터를 fp 변수에 담고 read함수를 호출하여 파일 내용을 읽어옵니다.

 

3-2) 웹에 있는 이미지 파일 저장하는 방법

https://search1.kakaocdn.net/argon/600x0_65_wr/ImZk3b2X1w8 

 

해당 링크로 이동을 하면, 아래처럼 이미지가 보입니다.

[그림 1-18] URL 입력시 보이는 이미지

어떻게 이렇게 될까요? 여러분들은 이미 알고 계세요.

브라우저를 통해서 URL로 서버에게 요청을 하고, 서버로부터 전달된 정보를 브라우저가 해석해서 보여주는 것이지요.

브라우저 앱은 URL을 서버에게 요청하고, 전달받은 정보(html 형태)를 해석해서 사용자에게 보여주는 역할을 하자나요. 그렇죠?

 

브라우저 앱처럼 서버로 요청하고, 전달 받은 정보 중 이미지 정보를 저장하면 됩니다.

 

전체 코드

import requests

#이미지가 있는 url 주소
url = "https://search1.kakaocdn.net/argon/600x0_65_wr/ImZk3b2X1w8" 

#해당 url로 서버에게 요청
img_response = requests.get(url)

#요청에 성공했다면,
if img_response.status_code == 200:
    #print(img_response.content)
    
    print("========= [이미지 저장] =========")
    with open("test.jpg", "wb") as fp:
        fp.write(img_response.content)

실행 결과

[그림 1-19] 이미지 파일로 저장된 결과

 

11번 라인에 있는 주석문을 풀어서 확인해보시죠.

[그림 x - 4] 11번 라인 주석문을 푼 경우 출력문

jpeg이라는 의미가 암호처럼 들어가 있습니다.

이미지(jpeg)를 binary 형태로 보면 이런 정보 값들이 들어가 있습니다. 즉, jpeg binary 데이터를 파일로 저장하면 이미지가 보이게 됩니다.

 

코드 설명

1 라인 : 라이브러리를 import 합니다.

4 라인 : 다운로드 받을 이미지의 url을 주소 입니다.

7 라인 : 해당 url로 서버에게 요청을 합니다.

10~14 라인 : 요청에 성공했다면, 'test.jpg' 파일을 'wb' 모드 즉, 바이너리 형식을 쓰는 모드로 열고 fp 변수에 담습니다.

15 라인 : 이미지에 해당하는 image_response.content를 write함수를 호출하여 저장합니다.

 

이번 프로젝트를 완성하기 위해 필요한 파이썬 문법을 알아보았습니다. 파일을 읽고 쓰는 방법과 웹에 있는 이미지를 저장하는 방법이였죠. 다음에 학습할 내용은 OpenAPI 문서를 보고 파이썬으로 구현하는 방법입니다. 서비스가 동작하는 방법을 이해하면, 제공되는 OpenAPI 문서를 더 쉽게 이해할 수 있습니다.  

 

 

4. 구현

이미지 검색으로 나오는 이미지 url 정보를 이용하여 연예인 사진을 모아봅시다.

점진적으로 구현을 완성해 갈 수 있도록 Step1 > Step2 > Step3 순서로 진행되며, Step3에서는 소스코드를 완성합니다.

 

[구현 코드]

- image_download. ipynb

 

[구현 순서]

Step1 카카오 이미지검색 OpenAPI 호출하기
Step2 이미지 파일 저장하기
Step3 전체 코드 완성하기


Step1) 카카오 이미지 검색 OpenAPI 호출하기

카카오 이미지검색 OpenAPI()를 사용하여, 이미지가 있는 url을 출력해 봅니다.

> 링크 : developers.kakao.com/docs/latest/ko/daum-search/dev-guide#search-image

[그림 1-25] 이미지 검색 Request

이미지 검색과 책 검색은 동일합니다. 다만, 요청을 하는 url만 다르겠죠?

[그림 1-26] 이미지 검색 Response

정상 요청이 되었다면, documents 필드 내에 image_url이 있네요. 이 정보를 사용하여, 파일을 저장하면 됩니다.

 

코드

import requests
import json

# 이미지 검색 
url = "https://dapi.kakao.com/v2/search/image"
headers = {
    "Authorization" : "KakaoAK <REST_API 앱키를 입력하세요>"
}
data = {
    "query" : "펭수"
}

# 이미지 검색 요청
response = requests.post(url, headers=headers, data=data)
# 요청에 실패했다면,
if response.status_code != 200:
    print("error! because ",  response.json())
else: # 성공했다면,
    count = 0
    for image_info in response.json()['documents']:
        print(f"[{count}th] image_url =", image_info['image_url'])
        # 저장될 이미지 파일명 설정
        count = count + 1

 

실행 결과

[그림 1-27] 카카오 이미지검색 OpenAPI 호출 결과

코드 설명

1~2 라인 : 필요한 라이브러리를 import합니다.

5라인 : 이미지 검색에 해당하는 url 입니다.

6~11라인 : 요청을 위한 필수 파라메터를 구성합니다. 7라인에 앱키 입력부분을 2-3)에서 할당받은 APP_KEY로 변경합니다.

14라인 : 이미지 검색을 요청합니다.

18~23라인 : 이미지 검색에 성공했다면, image_url을 출력합니다.

 

Step2) 이미지 파일 저장하기

3-2) 웹에 있는 이미지 파일 저장하는 방법에서 구현한 코드를 그대로 사용하되, 이번에는 함수로 만들어보죠.

함수를 만들때 3가지 구성요소 기억하시죠? input, process, output 입니다.

 

코드

# 이미지가 있는 image_url을 통해 file_name 파일로 저장하는 함수
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)

코드 설명

2라인 : 함수명을 정의합니다. 이미지를 저장하는 역할을 합니다. input으로 받는 parameter는 이미지가 담긴 url 주소인 image_url과 이미지를 저장할 파일명 file_name입니다.

3라인 : 이미지가 있는 주소로 요청을 합니다.

3~8라인 : 요청에 성공했다면, 결과로 전달된 이미지 바이너리 값을 파일로 저장합니다.

 

Step3) 전체 코드 완성하기

하나의 완성한 코드로 만들어 보겠습니다. 

구현된 함수는 호출되기 전에 선언이 되어 있어야 에러가 나지 않는다는 점 알고 계시죠?

구현된 코드의 작성 순서를 생각해보고, save_image()를 적절한 위치에서 호출해봅니다.

 

전체 코드                     

import requests
import json

# 이미지가 있는 image_url을 통해 file_name 파일로 저장하는 함수
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)

# 이미지 검색 
url = "https://dapi.kakao.com/v2/search/image"
headers = {
    "Authorization" : "KakaoAK <REST_API 앱키를 입력하세요>"
}
data = {
    "query" : "펭수"
}

# 이미지 검색 요청
response = requests.post(url, headers=headers, data=data)
# 요청에 실패했다면,
if response.status_code != 200:
    print("error! because ",  response.json())
else: # 성공했다면,
    count = 0
    for image_info in response.json()['documents']:
        print(f"[{count}th] image_url =", image_info['image_url'])
        # 저장될 이미지 파일명 설정
        count = count + 1
        file_name = "test_%d.jpg" %(count)
        # 이미지 저장
        save_image(image_info['image_url'], file_name)

실행 결과

펭수 사진 다운로드 결과

코드 설명

1~2 라인 : 라이브러리 선언

4~11 라인  : Step2) 이미지 파일 저장하기

13~32 라인 : Step1) 카카오 이미지 검색 OpenAPI 호출하기

35 라인 : 이미지 저장 함수 호출

 

5. 요약정리

카카오에서 제공하는 이미지 검색 OpenAPI을 사용해 보았는데요,

이미지 검색을 request로 요청하고 response로 전달 받은 image_url 정보를 확인했습니다. 전달받은 image_url을 다시 서버에 요청하여 이미지를 받아오고 파일로 저장하여 이미지를 수집할 수 있었습니다.

 

query만 바꿔서 다양한 사진을 수집해보세요.

 

 


도움이 되셨다면, 좋아요 / 구독 버튼 눌러주세요~

 

저작물의 저작권은 작성자에게 있습니다.
공유는 자유롭게 하시되 댓글 남겨주세요~
상업적 용도로는 무단 사용을 금지합니다.
끝까지 읽어주셔서 감사합니다^^

반응형
Comments