[Java] 네이버 검색 API 등록 및 호출하기

    네이버 검색 API 등록

    모든 API가 그러하지만 네이버 검색도 사용하기 위해서는 우선적으로 API 등록해서 키를 발급받아야 한다. 

     

    developers.naver.com/docs/search/blog/

     

    검색 API 블로그 검색 개발가이드

    NAVER Developers - 검색 API 블로그 검색 개발가이드

    developers.naver.com

     

    오픈 API 이용 신청 화면

     

    위 링크로 들어가면 위와 같이 녹색으로 되어 있는 오픈 API 이용 신청 버튼이 존재한다. 이 녀석을 클릭하고

     

    검색 어플리케이션 키 등록 화면

     

    사용 API는 검색을 선택하고 환경을 추가로 설정하는데 웹 형태로 만들고 싶고 내 로컬에서 작업을 하고 싶다면, 위와 같이 로컬호스트 주소를 입력하고 등록하기를 선택한다.

     

    클라이언트 아이디와 시크릿

     

    등록하기를 완료하면 이렇게 Client ID와 Client Secret이라는 값들이 발급되는데 이 2개의 값은 추후 API를 호출할 때 필수로 넣어야 되는 값이다.  키를 발급 받았으면 이제 Java로 간단히 검색을 하는 예제를 만들어보도록 한다.

     

     

    Java로 호출 단계

    NaverCrawler.java

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.HashMap;
    import java.util.Map;
    
    
    /**
     * 네이버 블로그 크롤링
     * 
     * @author steel
     * @since 2021.02.24
     */
    public class NaverCrawler {
    	// 베이스 URL
    	final String baseUrl = "https://openapi.naver.com/v1/search/blog.json?query=";
    	
    	public String search(String clientId, String secret, String _url) {
    		HttpURLConnection con = null;
    		String result = "";
            
            try {
                URL url = new URL(baseUrl + _url);
                con = (HttpURLConnection) url.openConnection();
    
                con.setRequestMethod("GET");
                con.setRequestProperty("X-Naver-Client-Id", clientId);
                con.setRequestProperty("X-Naver-Client-Secret", secret);
    
                int responseCode = con.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) result = readBody(con.getInputStream());
                else result = readBody(con.getErrorStream());
    
            } catch (Exception e) {
                System.out.println("연결 오류 : " + e);
            } finally {
                con.disconnect();
            }
    
            return result;
    	}
    	
    	
    	/**
    	 * 결과를 읽는다
    	 * 
    	 * @param body
    	 * @return
    	 */
    	public String readBody(InputStream body){
    		InputStreamReader streamReader = new InputStreamReader(body);
    
    		try (BufferedReader lineReader = new BufferedReader(streamReader)) {
                StringBuilder responseBody = new StringBuilder();
    
                String line;
                while ((line = lineReader.readLine()) != null) {
                    responseBody.append(line);
                }
    
                return responseBody.toString();
            } catch (IOException e) {
                throw new RuntimeException("API 응답을 읽는데 실패했습니다.", e);
            }
        }
    }
    

    모듈이라 할 수 있는 NaverCrawler 클래스는 2개의 메소드로 이루어 졌는데 검색을 담당하는 search 메소드와 search 메소드에서 나온 결과를 읽어주는 readBody 메소드로 나뉠 수 있다. search 메소드는 3개의 파라미터를 받는데 클라이언트 아이디, 시크릿키 그리고 키워드이다.

     

    이 3가지 값을 이용해서 search 메소드는 네이버 API에 결과를 요청하고 InputStream 형태의 내용을 String 형태로 변환하여 리턴해주는 구조이다.

     

    NaverCrawlerMain.java

    import java.net.URLEncoder;
    import java.util.Map;
    
    
    /**
     * 네이버 크롤러 메인 클래스
     * 
     * @author steel
     * @since 2021.02.24
     */
    public class NaverCrawlerMain {
    
    	public static void main(String[] args) {
    		String id = "여기에클라이언트아이디";
            String secret = "여기에시크릿값";
            
            try {
    	        NaverCrawler crawler = new NaverCrawler();
    	        String url = URLEncoder.encode("needjarvis", "UTF-8");
    	        String response = crawler.search(id, secret, url);
    	        System.out.println(response);	        
            } catch (Exception e) {
            	e.printStackTrace();
            }
    	}
    }
    

     

    최종적으로 NaverCrawler를 호출하는 역할은 NaverCralwerMain이 맡으며, 네이버 검색 API로 발급 받은 아이디와 시크릿값을 각각의 파라미터로 하며 검색어는 utf-8로 인코딩을 거쳐서 파라미터에 반영시킨다. 그리고 최종적으로 나온 결과를 System.out으로 출력한다.

     

    System.out.println으로 뿌린 결과

    {"lastBuildDate": "Wed, 24 Feb 2021 11:06:54 +0900","total": 106,"start": 1,"display": 10,"items": [{"title": "빅데이터 분석 주제 유형","link": "https:\/\/blog.naver.com\/sky00141?Redirect=Log&logNo=222218730000","description": "빅데이터 분석 주제의 4가지 유형 - 이미지 출처:https://<b>needjarvis</b>.tistory.com/505 최적화(Optimization)은 분석 대상과 분석 방법을 모두 알고 있는 경우 문제를 해결하기 위해 수행하는 방법이며, 솔루션... ","bloggername": "제이의 IT Security 블로그","bloggerlink": "https://blog.naver.com/sky00141","postdate": "20210125"},{"title": "엘라스틱서치(Elasticsearch) 노드(Node)의 종류","link": "https:\/\/blog.naver.com\/koys007?Redirect=Log&logNo=222246765077","description": "yml 에서 아래 내용 추가 node.master: false node.data: false node.ingest: true search.remote.connect: false 출처: https://<b>needjarvis</b>.tistory.com/579 [자비스가 필요해]","bloggername": "koys007님의 블로그","bloggerlink": "https://blog.naver.com/koys007","postdate": "20210217"},{"title": "척도(Metrics)","link": "https:\/\/blog.naver.com\/jamsuham75?Redirect=Log&logNo=222216354329","description": "둘간의 개념이 사실상 유사하기 때문에 동일한 개념으로 어쩔 땐 척도를 사용하기도 하고 어쩔 땐 손실함수를 쓰기도 한다. 출처 : https://<b>needjarvis</b>.tistory.com/568","bloggername": "이창현 코딩연구소","bloggerlink": "https://blog.naver.com/jamsuham75","postdate": "20210122"},{"title": "Mysql 페이징","link": "https:\/\/blog.naver.com\/vivacarla?Redirect=Log&logNo=222134289375","description": "page=1로 셋팅함 srchDetail.offSet = (srchDetail.page - 1) * srchDetail.detailViewSize 이므로 detailViewSize 는 이런거 말함 https://<b>needjarvis</b>.tistory.com/259","bloggername": "Act","bloggerlink": "https://blog.naver.com/vivacarla","postdate": "20201103"},{"title": "블록체인 핵심 Keyword 정리","link": "https:\/\/blog.naver.com\/losxodn?Redirect=Log&logNo=221573971343","description": "노드가 없을 경우 서비스를 유지할 수 없음 출처: https://<b>needjarvis</b>.tistory.com/237 [자비스가... 출처: https://<b>needjarvis</b>.tistory.com/239?category=761117 [자비스가 필요해] &gt; 자세한 건 해당 포스팅... ","bloggername": "Smileyujacha 's DAILY BLOG","bloggerlink": "https://blog.naver.com/losxodn","postdate": "20190630"},{"title": "[데이터분석] 장바구니 분석(apriori 알고리즘) 사용 및... ","link": "https:\/\/blog.naver.com\/varkiry05?Redirect=Log&logNo=221725428713","description": "참고: https://<b>needjarvis</b>.tistory.com/59 http://www.dodomira.com/2016/02/15/r%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%97%B0%EA%B4%80%EC%84%B1-%EB%B6%84%EC%84%9D-association-rules-in-r/ http://blog.naver.com/PostView.nhn?blogId=eqfq1... ","bloggername": "나의 색으로 채워지는 곳","bloggerlink": "https://blog.naver.com/varkiry05","postdate": "20191204"},{"title": "블록체인 검증기술, 머클트리, 머클루트 - 모두의 블록체인 #7","link": "https://needjarvis.tistory.com/634","description": "사람 <b>needjarvis</b>.tistory.com [Java] SHA-256 해싱(Hashing) 알고리즘 사용법 [Java] SHA-256 해싱(Hashing)... 이 함수는 미국 국가안보국(NSA)에서 1993년 처음 설계했으며, 미국 국가 표 <b>needjarvis</b>.tistory.com 참고로... ","bloggername": "자비스가 필요해","bloggerlink": "http://needjarvis.tistory.com/","postdate": "20201226"},{"title": "Python Study Links (아나콘다,파이참, Qt5, 시리얼통신)","link": "https:\/\/blog.naver.com\/micomcore?Redirect=Log&logNo=221535759566","description": "Python Anaconda IDLE 실행방법과 파이참 다운 https://<b>needjarvis</b>.tistory.com/170 PyQT5 Tutorial https://wikidocs.net/book/2165 https://mainia.tistory.com/5174 파이썬 공부하려는데 개발환경 공부가 더... ","bloggername": "Digital Power Frontier","bloggerlink": "https://blog.naver.com/micomcore","postdate": "20190512"},{"title": "정형, 비정형, 반정형 데이터","link": "https://valuefactory.tistory.com/958","description": "모두 다 포함이 되어 있는가를 통해 반정형 여부를 판단 한 후, 정형과 비정형을 가리면 되는 것이다. 출처 https://<b>needjarvis</b>.tistory.com/502 공유하기 글 요소 구독하기 가치관제작소 저작자표시 비영리 변경금지","bloggername": "가치관제작소","bloggerlink": "http://valuefactory.tistory.com/","postdate": "20210112"},{"title": "암호화폐(Cryptocurrency)가 중요한 이유.","link": "https:\/\/blog.naver.com\/amc_2020?Redirect=Log&logNo=222202794520","description": "도리안 사토시 나카모토(Dorian Satoshi Nakamoto) 출처: https://<b>needjarvis</b>.tistory.com/406 [자비스가 필요해] 익명의 프로그래머인 '도리안 나카모토 사토시'가 2009년에 시작한 비트코인의 &quot;피어 투 피어 전자 현금... ","bloggername": "AMC Premier","bloggerlink": "https://blog.naver.com/amc_2020","postdate": "20210110"}]}

    최종 결과는 위와 같이 JSON 구조로 리턴이 되며, 다음 포스팅에서는 이 내용들을 파싱하는 법을 알아보도록 한다.

     

    연관포스팅

    [Java] 네이버(Naver) 검색 사용 및 JSON 파싱(Parsing)하기

    댓글

    Designed by JB FACTORY