본문 바로가기
개발일지/Python

네이버 API {'error_code': '061', 'message': '/shop.json : Malformed URL (잘못된 형식의 호출 URL입니다.)'}

by 개발에정착하고싶다 2022. 6. 16.
320x100

아.. 진짜 내가 잘못입력해서 에러나고,

에러 난것을 어떻게 해결해야 할지 모를때, 구글링이든 유튜브든 뭘봐도 답은 안나올때 미칠것같고

똑같이 입력했는데, 어떨땐 되고, 어떨땐 안될때가 진짜 미치겠다.

 

shop 검색에서 특정 키워드로 나오는 결과값을 가져오기 위한 네이버 API를 활용하고 있었다.

 

먼저 네이버에서 제공하고 있는 가이드 코드다

# 네이버 검색 API예제는 블로그를 비롯 전문자료까지 호출방법이 동일하므로 blog검색만 대표로 예제를 올렸습니다.
# 네이버 검색 Open API 예제 - 블로그 검색
import os
import sys
import urllib.request
client_id = "user_id"
client_secret = "user_pw"
encText = urllib.parse.quote("몰스킨")
url = "https://openapi.naver.com/v1/search/shop?query=" + encText # json 결과
# url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText # xml 결과
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print("Error Code:" + rescode)

우선 이것에 대한 결과값은 딕셔너리 형태로 잘 나왔다.

즉, 이 코드에 대한 문제는 없다.

당연한거지만 공식 홈페이지에서 제공해준 코드니깐.

 

자, 이제 이것을 내 환경에 따라 달리쓰기 위하여 2개로 부분쪼갬을 한 뒤에 함수 만들어주기를 했다.

 

첫번째 부분.

내가 찾고자 하는 url을 생성해주는 부분이다.

def get_search_url(api_node, search_text, start_num, disp_num):
    base = 'https://openapi.naver.com/v1/search'
    node = '/'+ api_node + '.json'
    param_query = '?query=' + urllib.parse.quote(search_text)
    param_start = '&start=' + str(start_num)
    param_disp = '&disp=' + str(disp_num)

    return base  + node + param_query + param_start + param_disp

두번째 부분.

첫번째에서 만들어놓은 url을 기반으로 원하는 페이지의 소스를 크롤링해오는 부분이다.

 

import json
import datetime

def get_result_onpage(url):
    request = urllib.request.Request(url)
    request.add_header("X-Naver-Client-Id",client_id)
    request.add_header("X-Naver-Client-Secret",client_secret)
    response = urllib.request.urlopen(request)
    print('[%s] Url Request Success'% datetime.datetime.now())
    return json.loads(response.read().decode('utf-8'))

위의 2가지 부분을 결합하여 이용하는 코드다

 

url = gen_search_url('shop', '몰스킨', 1, 5)
one_result = get_result_onpage(url)

결과는?

[2022-06-16 11:36:15.158790] Url Request Success

 

라고 정상으로 뜬다.
그렇다면 내용을 확인 하기 위해서
one_result 를 출력해 보았다.
 

{'error_code': '061', 'message': '/shop.json : Malformed URL (잘못된 형식의 호출 URL입니다.)'}

 

............

최근에 가뜩이나 에러 폭탄에 안되고 안되고 또 안되는 거를 경험하고 나서 그런지 안되는거가 반갑지 않다.

분명 맞는것같은데 url이 잘못되었다니깐.

네이버에서도 딱히 잘못되었다고만 나오고 해결책은 없으니깐..

 

구글링,  네이버 문서를 뒤적거려봤다.

쓸모없는 얘기가 너무 많았다.

 

다시 강의내용을 따라 쳐봤다.

안된다.

또 해봤다.

또 안된다.

또 해봤다.

또 안된다.

이렇게 계속 반복하다가 접근방법을 달리해보기로 했다.

 

네이버에서 제공해주는 파일은 맞는거잖아.

그렇다면 그걸 기반으로 하면 되지 않을까? 싶어서 그걸 토대로 2부분으로 쪼개서 대조해보면서 진행해봤다.

그랬더니 이번엔 딕셔너리 형태로 정보 출력에 성공했다.

 

그리고 출력에 성공하고 다시 대조해봤다.

정말 똑같더라;

 

성공 첫번째 파트

 

def gen_search_url(api_node, search_text, start_num, disp_num):
    base = 'https://openapi.naver.com/v1/search/'
    node = api_node +'.json'
    param_query = '?query=' + urllib.parse.quote(search_text)
    param_start = '&start=' + str(start_num)
    param_disp = '&disp=' + str(disp_num)

    return base + node + param_query + param_start + param_disp

성공 두번째 파트

 

import json
import datetime

def get_result_onpage(url):
    request = urllib.request.Request(url)
    request.add_header("X-Naver-Client-Id",client_id)
    request.add_header("X-Naver-Client-Secret",client_secret)
    response = urllib.request.urlopen(request)
    print('[%s] Url Request Success'%datetime.datetime.now())

    return json.loads(response.read().decode('utf-8'))

 

 

누구라도 좋으니, 무슨 차이가 있어서 전자의 코드는 에러가나고

후자의 코드는 출력에 성공하는지 알려줬으면 좋겠다;

300x250