본문 바로가기
파이썬

PIXABAY REST API.by Python.

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

안녕하세요. 오늘은 픽사베이 무료이미지 API를 다양하게 다루어 봅니다.

 

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

 

이전 글들에서 픽사베이 API Key를 발급받는 방법을 알아봤고,

실제로 API호출을 간단하게 해 보았습니다.

 

코드를 다음과 같이 조금 더 실용적으로 만들어 봅니다.

 

가독성을 위해 코드를 풀어썼습니다.

 

def getImageLinksFromPixabay(keyword, maxReturn=5, randomReturn=True):
    PIXABAYKEY = '428....'
    PIXABAY = f'https://pixabay.com/api/?key={PIXABAYKEY}&image_type=photo&lnag="ko"&q='
    query = f'{keyword}'
    links = []
    r = requests.get(PIXABAY+query).json()
    hitsCount = r['totalHits']
    
    if(hitsCount == 0):
        return []
    else:        
        if randomReturn:
            for i in range(0, maxReturn):
                links.append(r['hits'][random.randint(0, hitsCount-1)]['webformatURL'])
        else:
            for i in range(0, maxReturn):
                links.append(r['hits'][i]['webformatURL'])
    return links
    

links = getImageLinksFromPixabay(['희망'], randomReturn=False)
for link in links:
    print(link)

 

API 콜을 할 때 lang 옵션을 주었습니다.

 

'ko'는 한국어이고, 기본은 'en'으로 설정되어 있습니다.

 

한국어 기준으로 검색을 할 때는 해당 옵션을 주지 않아도 결과는 같습니다.

 

콜을 할 때 이미 픽사베이에서 알아서 검색을 해줍니다.

 

다만, 영어로 된 이름을 한글로 전달할 때는 검색확률이 줄어듭니다.

 

아무래도 영어로 설명이 된 이미지들의 수가 압도적으로 많기 때문입니다.

 

그렇지만, 몇 년 전부터 픽사베이에서도 이미지를 업로드할 때 한글등의 다국어 지원을

기본으로 하게 되었습니다. 내부 시스템에 의해서 이루어집니다.

 

그래도 안 나오는 건 안 나옵니다.

 

일반적인 검색어 '희망'을 던졌을 때,  다음과 같은 결과가 나옵니다.

 

 

2413개의 이미지가 검색되었고 500개의 이미지를 가져왔다는 뜻입니다.

 

위의 상태에서 random=True로 하지 않고 진행하면,

links.append(... 에서 index 에러가 납니다. 해당 인덱스가 없다는 뜻으로 나옵니다.

 

왜냐면, totalHits가 500이니 for문에서 500번을 돌리는 건데,

그럼 json response에 500개가 들어 있지 않기 때문입니다.

 

그러면 json response에는 몇 개가 들어 있을까요?

 

API doc에서 설명하는 것처럼 20개입니다.

 

20개 들어 있는데, 500을 찍었으니 에러가 납니다.

 

페이지당 20개이고 3에서 200개까지 된다고 하네요.

 

그럼 페이지는 어떻게 지정하느냐?

 

 

위의 파라미터로 정하면 됩니다.

 

page의 수는 totalHits와 per_page를 이용해서 별도로 계산해야 합니다.

 

계산돼서 나온 결과값에서 원하는 페이지를 지정하면 되는데,

당연히 없는 페이지를 지정하면 http 에러가 납니다.

 

최대 200개씩 가져온다고 해도, 어차피 랜덤으로 사용할 테니,

기본 설정 20개를 한도로 해서 코드를 수정해 봅니다.

 

def getImageLinksFromPixabay(keyword, maxReturn=5, randomReturn=True):
    PIXABAYKEY = '428....'
    PIXABAY = f'https://pixabay.com/api/?key={PIXABAYKEY}&image_type=photo&q='
    query = f'{keyword}'
    links = []
    r = requests.get(PIXABAY+query).json()
    print(r)
    hitsCount = r['totalHits']
    
    if(hitsCount == 0):
        return []
    else:
        if maxReturn >= 20:
            maxReturn = 20        
        if randomReturn:
            if hitsCount >= 20:
                hitsCount = 20
            for i in range(0, maxReturn):
                links.append(r['hits'][random.randint(0, hitsCount)]['webformatURL'])
        else:
            for i in range(0, maxReturn):
                links.append(r['hits'][i]['webformatURL'])
    return links
    

links = getImageLinksFromPixabay(['희망'], randomReturn=True)
for link in links:
    print(link)

 

 

maxReturn이 20을 넘으면 강제로 20으로 만들고,

hitsCount(totalHits)도 20이 넘으면 강제로 20으로 만듭니다.

 

만일 20개 이상 이미지를 검색하고 싶다면,

per_page 파라미터를 위에서 설명한 것처럼 수정하고,

20이라는 숫자도 per_page에 맞추어 수정하면 됩니다. 간단하죠.