<aside> 💡 지식 iN - Search API (naver.com)

</aside>

네이버는 검색 API 중 지식iN category를 제공하고, 결과물을 json 또는 xml file로 return한다.

메서드 인증 요청 URL 출력 포맷
GET - https://openapi.naver.com/v1/search/kin.xml XML
GET - https://openapi.naver.com/v1/search/kin.json JSON

API를 요청할 때는 url 형태로 요청하게 되는데, 우리가 다르게 부여할 수 있는 parameter는 다음과 같다.

요청 변수명 타입 필수 여부 기본값 설명
query string Y - 검색을 원하는 문자열로서 UTF-8로 인코딩한다.
display integer N 10(기본값), 100(최대) 검색 결과 출력 건수 지정
start integer N 1(기본값), 1000(최대) 검색 시작 위치로 최대 1000까지 가능
sort string N sim(기본값), date, point 정렬 옵션: sim (유사도순), date (날짜순), point(평점순)

이를 통해 위에서 언급한 json 또는 xml file 파일로 결과물을 받을 수 있는데, 우리가 핵심적으로 봐야 할 요소는 다음과 같다.

title string 검색 결과 문서의 제목을 나타낸다. 제목에서 검색어와 일치하는 부분은 태그로 감싸져 있다.
link string 검색 결과 문서의 하이퍼텍스트 link를 나타낸다.
description string 검색 결과 문서의 내용을 요약한 패시지 정보이다. 문서 전체의 내용은 link를 따라가면 읽을 수 있다. 패시지에서 검색어와 일치하는 부분은 태그로 감싸져 있다.

다음 코드는 기본적인 API input과 output을 살펴보기 위한 공식 문서의 구조이다.

import urllib.request
import json

#client_id = "6AkDMh30q3LjxKzZC2Oo"
#client_secret = "KghRTtlRZu"
#client_id와 client_secret에 개인의 api 주소를 넣어야 한다.
#지식인 검색 api는다음 주소에서 생성할 수 있다.
# <https://developers.naver.com/docs/serviceapi/search/kin/kin.md>

#encText = urllib.parse.quote("검색할 단어")
encText = urllib.parse.quote("중2 과학")
url = "<https://openapi.naver.com/v1/search/kin?query=>" + encText #찾고자 하는 검색어에 대한 결과를  json으로 구성
# url에 API option을 넣기 위해서는 다음과 같이 연결하면 된다.(선택)
# url = url + "&display=100" + "&start=1" + "sort=sim"

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()
    response_dict = json.loads(response_body.decode('utf-8')) #byte 형태의 response_body를 dict로 받기
    items = response_dict['items'] #items 내부에 0부터 display 수를 설정한 문서까지 나열되어있고, 그 내부에 title, link, discription 존재 
    print(response_body.decode('utf-8')) #string 형태로 확인 가능
else:
    print("Error Code:" + rescode)

우리가 찾고자 하는 것은 Question-Answer pair인데, API는 pair를 제공해주지 않는다. 일정 양만큼 총 문서를 요약해주는데, 질문-답변이 전부 담기지 않는다.

example : 실제 API가 불러오는 items의 예시와 내부(상단 코드에서, 26번째 line의 실행결과 중 하나 예시)

{'title': '<b>중2과학</b> 문제집 추천', 
	'link': '<https://kin.naver.com/qna/detail.naver?d1id=11&dirId=110304&docId=391794045&qb=7KSRMiDqs7ztlZk=&enc=utf8&section=kin.qna&rank=98&search_sort=0&spq=0>](<https://kin.naver.com/qna/detail.naver?d1id=11&dirId=110304&docId=391794045&qb=7KSRMiDqs7ztlZk=&enc=utf8&section=kin.qna&rank=98&search_sort=0&spq=0>', 
	'description': '<b>중2과학</b> 기말고사 사험보기전에 문제만있는거 사서 풀려고 하는데 추천좀 해주세요 개념있는거 말고 문제만... 중2학생이시고 <b>중2과학</b>문제집 추천 받고 싶어하시는데 기말고사 시험 보기전에 기말고사 대비해서 공부를 하려고 문제집을... '}
title 중2과학 문제집 추천
question 중2과학 기말고사 사험보기전에 문제만있는거 사서 풀려고 하는데 추천좀 해주세요 개념있는거 말고 문제만 있는거요
answer 안녕하세요 천재교육 문제집 서포터즈입니다!
중2학생이시고 중2과학문제집 추천 받고 싶어하시는데 기말고사 시험 보기전에 기말고사 대비해서 공부를 하려고 문제집을 추천 받고 싶은 거라면 7일끝 중학 과학을 추천 드리고 싶어요^^
7일끝 중학 과학은 중학 내신 대비를 중간•기말 시험 대비와 함께 7일동안 학습으로 단기간에 사회 공부할 수 있도록 만들어 져 있는 문제집입니다!
<초단기 시험 대비>로 시험에 꼭 나오는 핵심만 콕콕! 학습량과 시간은 단축하고 효율성은 높여 7일 안에 시험을 최적으로 대비할 수 있어요
그리고 공부할 내용을 그림과 퀴즈로 쉽게 살펴보며 학습을 준비할 수 있고 <그림으로 개념 잡기>를 통해 학습할 개념을 만화로 재미있게 알아볼 수 있고요
<내신 기출 베스트>로 인해 다양한 유형의 문제를 풀어 보며 공부한 내용을 점검할 수 있으며, <대표 예제>와 함께 시험에 자주 나오는 빈출 유형 필수 문제로 풀어 볼 수 있어요~
부록에 나오는 <틈틈이.짬짬이 공부하기>에서 과학 용어 풀이를 알아볼 수 있는 구성 또한 포함되어 있기 때문에 시험 직전이나 틈틈이 암기 카드를 휴대하여 활용할 수 있습니다!
답변이 큰 도움 되었으면 합니다!

따라서 api에서 제공해주는 link를 활용해 문서에 직접 들어가 크롤링해야 하며, 이것은 selenium이나 beautifulsoup4 등으로 page에 하나하나 접근하는것과 자웅을 겨루기 어렵다.(api의 존재 의의가...T_T) 그럼에도, 나중에 카테고리가 아닌 검색어를 통해 리스트업 해야 할 일이 있을 때 확장성 있는 방식으로, 알아두면 좋을 것 같다.

api에서 제공해주는 link를 통해 지식iN 문서로 직접 들어가보면, 해당 문서 전문을 web page로 확인할 수 있다. 여기서 웹 크롤러를 사용하기 위해서는 경로값이 필요한데, 지식iN 문서 하나를 예시로 들겠다. (예시 문서 링크)

Untitled

web은 교집합이 없는 벤다이어그램 형태로 추상화 할 수 있는데, html tag들끼리 포함관계를 가지고 있다. 자주 사용되는 html tag는 링크를 참조하시면 된다. 어떻게 내부적인 구조가 구성되어있는지 뜯어보기 위해서는 개발자도구(F12)가 필요하다.

Untitled

그럴 경우 우측에 해당 창을 발견할 수 있는데, 상단바의 가장 왼쪽에 있는 버튼을 누르게 되면 마우스가 올라간 곳에 해당하는 tag의 범위와 이름을 확인할 수 있다. 예시 문서의 title인 “중2 과학 질문이요”라는 string을 뽑는다고 가정했을 때, 예시는 다음과 같다.

1

1

2

2