본문 바로가기
파이썬

카카오 API 이미지 가져오는 방법. 파이썬

by 진심블로그 2024. 3. 16.

안녕하세요. 파이신입니다.

 

오늘은 카카오 API를 이용해서 이미지를 가져오는 방법을 알아봅니다.

 

- 본 글은 파이썬 중급자 이상이 읽어 보기에 적합합니다.

 

지난 글에서 카카오 API의 기본 이용방법,

검색을 통한 결과값을 가져오는 방법을 알아봤습니다.

 

이번에는 이미지를 가져와 보는데,

지난번과 마찬가지로 다음넷을 기준으로 이미지를 가져옵니다.

 

네이버나 구글에 익숙한 상태에서는 다음의 이미지 구성이 좀 어색한 부분이

있지만, 네이버나 구글이 이미지 API를 제공하지 않는 현실에서 카카오가

이미지 검색 API를 제공하고 있다는 것은 프로그래머들에게는 좋은 것 같습니다.

 

바로 코드로 넘어가 봅니다.

 

import requests
import pandas as pd
from IPython.display import HTML
from datetime import datetime
from pathlib import Path
REST_API_KEY = 'b50a....'
kakao_image_api = 'https://dapi.kakao.com/v2/search/image'
headers = {'Authorization':f'KakaoAK {REST_API_KEY}'}
query = '이강인'
params = {'query':query, 'sort':'accuracy', 'page':1, 'size':10}
r = requests.get(kakao_image_api, headers=headers, params=params)
print(f'response status : {r.status_code}')
data_dict = r.json()
df = pd.DataFrame(data_dict['documents'])
df = df[['image_url']]

 

API 키 입력하고, 카카오 이미지 API 입력하면 끝입니다.

 

쿼리와 파라미터 적절하게 주고 requests.get으로 하면 json으로 반환합니다.

 

여기서 반환되는 것은 이미지가 아니라 이미지 링크 리스트죠.

 

pandas를 사용한 것은 dict parsing 하기 편해서입니다.

 

json을 dict으로 변형해서 매번 dict key를 비교하자니 번거롭죠.

 

pandas를 이용해서 table로 읽은 다음에 여기서 key로 대응하는 것이 더 쉽습니다.

 

json response에서 documentsr가 list입니다. 

 

그 리스트에서 이미지 링크 리스트는 image_url입니다.

 

 

결과는 위와 같습니다.

 

이제 이미지를 가져와 봅니다.

import os
path = r'C:\....\images'
path = Path(path)
if not path.exists():
    Path.mkdir(path)
os.chdir(path)

for index, row in df.iterrows():
    r = requests.get(row['image_url'])
    path = Path(row['image_url'])
    suffix = path.suffix
    file_name = f'{index:04d}{suffix}'
    with open(file_name,'wb') as f:
        f.write(r.content)

 

다운로드될 이미지들을 저장할 폴더를 만들고,

 

이미지의 확장자 그대로 파일이름에도 적용하기 위해서, 번거롭게 확장자 따고,

이미지가 많을걸 대비해서 일련번호 장착하고, 저장합니다

 

결과는 다음과 같습니다.

 

 

 

위의 코드를 좀 단순화하기 위해서 urlretrieve를 사용해 봅니다.

 

from urllib.request import urlretrieve
import os
path = r'C:\.....\images'
path = Path(path)
if not path.exists():
    Path.mkdir(path)
os.chdir(path)

for index, row in df.iterrows():
    path = Path(row['image_url'])
    suffix = path.suffix
    file_name = f'{index:04d}{suffix}'
    urlretrieve(row['image_url'],file_name)

 

몇 줄 줄었네요. 파일 저장하는 절차가 없으니 간편하기는 합니다.

 

다만 urlretrieve는 특정 웹사이트에서는 동작을 하지 않습니다.

 

header에 아무것도 없이 날로 날리는 형태이니, 그럴 법도 합니다.

 

with open().. 말고는 모두 동일하게 같이 동작합니다.

 

가져온 이미지 하나를 보면, 다음과 같습니다.

 

 

 

참고로, os.chdir()은 현재 폴더 기준입니다.

 

코딩하면서 폴더를 지우고 만들고를 할 일이 있는데, 이 친구가 폴더를 잡고 있으니

 

삭제가 안됩니다.

 

불편하면, 매 코드의 끝마다 다른 폴더로 바꾸어 주면 됩니다.

 

os.chdir('c:\\')와 같은 거죠.

 

또 하나, jupyter에서는 현재 폴더에 대한 정보도 계속 남아 있게 됩니다.

 

따라서, 폴더 하나 만들고 그 안에서 뭔가 일을 하고 다시 코드를 실행하면,

해당 폴더 안에 똑같은 폴더가 또 만들어집니다.

 

코드를 엉성하게 만들면, 폴더 안에 폴더가 계속 생기는 경험도 하게 됩니다.