<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§ion=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§ion=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 문서 하나를 예시로 들겠다. (예시 문서 링크)
web은 교집합이 없는 벤다이어그램 형태로 추상화 할 수 있는데, html tag들끼리 포함관계를 가지고 있다. 자주 사용되는 html tag는 링크를 참조하시면 된다. 어떻게 내부적인 구조가 구성되어있는지 뜯어보기 위해서는 개발자도구(F12)가 필요하다.
그럴 경우 우측에 해당 창을 발견할 수 있는데, 상단바의 가장 왼쪽에 있는 버튼을 누르게 되면 마우스가 올라간 곳에 해당하는 tag의 범위와 이름을 확인할 수 있다. 예시 문서의 title인 “중2 과학 질문이요”라는 string을 뽑는다고 가정했을 때, 예시는 다음과 같다.
1
2