👨🏽‍💻

ch3 - 3. API 활용 (JSON 다루기, 뉴스 긁어오기, 카페 글쓰기)

네이버 API 사용하여 뉴스 긁어오기

네이버 API를 사용하기 위해선 먼저 아이디와 키를 발급받아야 합니다. https://developers.naver.com 접속 후 서비스 API → 검색 으로 들어갑니다.
notion imagenotion image
이 책에서 같이 사용해볼 API는 검색 안의 소분류, 뉴스입니다. 다음 페이지에서 오픈 API 이용 신청 버튼을 클릭합니다.
 
notion imagenotion image
어플리케이션 이름은 간단한 영어로 기능을 의미하게 작성하시면 됩니다. ex) getmenews
사용 API는 검색, 환경추가는 WEB 을 선택합니다. 주소 입력 창엔 독자분의 개별 페이지가 없다는 가정하에 각자의 컴퓨터 로컬 환경에서 접근할 수 있도록 http://localhost 를 입력합니다.
위의 과정을 완료하면 아이디와 키가 발급됩니다. 아이디와 키를 복사하여 메모장 혹 안전한 위치에 보관합니다. 항상 API 아이디와 키는 다른 사람에게 노출되지 않도록 잘보관해야합니다.
다음으로 API응용을 위해 네이버에서 제공해준 api 가이드라인을 살펴보겠습니다. https://developers.naver.com/docs/search/blog/
다음 주소로 들어가면 호출 예제가 있습니다. Python 항목을 클릭합시다. 다음은 전문을 복사한 것입니다.
 
# 네이버 검색 API예제는 블로그를 비롯 전문자료까지 호출방법이 동일하므로 blog검색만 # 대표로 예제를 올렸습니다. # 네이버 검색 Open API 예제 - 블로그 검색 import os import sys import urllib.request client_id = "your_id" # 발급받은 아이디를 입력합니다. client_secret = "your_key" # 발급받은 비밀번호를 입력합니다. encText = urllib.parse.quote("제주도") #원하는 검색 키워드를 입력합니다. url = "https://openapi.naver.com/v1/search/blog?query=" + encText # json 형식의 결과 # 윗줄인 요청 url의 뒷부분을 바꿔주면 blog -> news 뉴스 기능 사용 # 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)
 
Jupyter notebook 에서 얻은 결과값입니다. 다음과 같이 json 형태로 "제주도" 에 관련된 최근 뉴스를 긁어오게 됩니다.
{ "lastBuildDate": "Fri, 15 Mar 2019 01:32:09 +0900", "total": 2267217, # 전체 결과값의 개수 "start": 1, # 첫번째거 부터 보여줍니다. "display": 11, # 11개의 결과값을 가져옵니다. 지면 상 3개만 가져왔습니다. "items": [ { "title": "[15일 01시 기준] 오늘 날씨와 미세먼지 '나쁨' ... 미세먼지 한때 기승", "originallink": "http://medicalreport.kr/news/view/98764", "link": "http://medicalreport.kr/news/view/98764", "description": "기압골의 영향으로 18~19일은 <b>제주도</b>에, 20일은 전국에 비가 오겠고", "강원영동과 경상도, <b>제주도</b>에는 21일까지 이어지겠다." "그 밖의 날은 고기압의 영향으로 맑은 날이 많겠다. 기온은 평년(최저기온: -2~6... ", "pubDate": "Fri, 15 Mar 2019 01:16:00 +0900" }, . . . { "title": "[뉴스-in] &quot;상임위원장은 책임있는 말씀을 해줘야&quot;", "originallink": "http://www.ihalla.com/read.php3?aid=1552575600624347122", "link": "http://www.ihalla.com/read.php3?aid=1552575600624347122", "description": "김위원장, 신중한 발언 요구 ○…김경학 <b>제주도</b>" "의회 운영위원장이 도의회 상임위원장들에게 신중한... 홍희선기자 산지천갤러리 전시 파행 ○…" "<b>제주도</b> 위탁을 받아 제주문화예술재단이 운영중인 산지천갤러리가... ", "pubDate": "Fri, 15 Mar 2019 01:02:00 +0900" }, { "title": "녹지국제병원에 국내 자본 우회 투자 의혹 ‘속속’ 드러나", "originallink": "http://www.kukinews.com/news/article.html?no=640929", "link": "http://www.kukinews.com/news/article.html?no=640929", "description": "<b>제주도</b>와 소송전에 돌입한 제주 영리병원인 녹지국제병원의" "사업계획서가 공개됨에 따라 그간 의혹으로만... 한 " "<b>제주도</b> ‘보건의료조례’의 위반 소지가 농후하다는 것이 보건의료노조의 주장이다." "이렇듯... ", "pubDate": "Fri, 15 Mar 2019 01:02:00 +0900" } ] } # 내용이 너무 많은 관계로 끊어서 주석처리하였습니다.
API의 사용자마다 원하는 정보의 양과 파일 형식이 다릅니다. 가져올 데이터의 개수를 정해주고 싶다거나 날짜순으로 정렬하고 싶다거나, 유사도로 정렬하고 싶다면 요청 변수를 통해 사용자의 필요에 맞는 정보를 가져올 수 있습니다.
 
notion imagenotion image
 
 
notion imagenotion image
이런 식으로 요청 url의 끝에 &원하는요청변수 를 써주면 됩니다.
 
위와 같이 API를 활용하면 사용자 개인 사이트에 관련 뉴스를 자동 업데이트하여 매일 뜨게 하는 등 활용도가 아주 다양하니 사용자의 목적에 따라 사용하면 됩니다.