ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] NAVER openAPI를 활용한 Crawling(도서 검색)
    기타 2019. 9. 25. 15:54

    목표 : openAPI를 활용하여 Crawling을 해보자

    * openAPI : 표준 웹 프로토콜을 이용하여 프로그램 개발에 사용할 수 있는 공개 API(Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스)

     

    - 대표적인 Crawling openAPI

     1) DAUM API : https://developers.kakao.com/

     

    Kakao Developers_

    더 나은 세상을 꿈꾸고 그것을 현실로 만드는 이를 위하여 카카오에서 앱 개발 플랫폼 서비스를 시작합니다.

    developers.kakao.com

     2) NAVER API : https://developers.naver.com/main/

     

    NAVER Developers

    네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음성인식, 음성합성 등이 있습니다.

    developers.naver.com

     

     

    이 글에서는 Naver 검색 API를 이용하여 도서 정보를 Crawling하는 과정을 소개할 것이다.

    그림1. NAVER Developers 메인 화면

    ① 먼저, 네이버 개발자센터(상단 링크 참고 요망)에서 [Application] - [애플리케이션 등록]을 통해 애플리케이션을 등록한다.

    그림2. [Application] - [애플리케이션 등록]

     

    애플리케이션 이름을 정하고 사용 API 중에서 검색을 선택한다. 이때, 웹 설정의 적당한 도메인이 없다면 http://sample.com으로 작성할 것을 권장한다.

    그림3. 애플리케이션 등록(API 신청)

    발급한 ClientID와 ClientSecret을 확인한다.(코드 상에서 필요하므로 따로 작성해둘 것을 권장)

    그림4. ClientID & ClientSecret 확인 

    네이버 개발자 센터의 [Document]=>[검색]을 선택한 후, API 기본 정보를 확인하여 원하는 URL 참조(response값의 형식으로 나뉨(XML/JSON))

    그림5. [검색 서비스] - [도서] – [API 기본 정보]

     

    위와 같이 준비가 다 되었다면, Crawling을 실시한다.

    * 검색 - 블로그에 네이버 개발자센터의 예제가 있음으로 참고할 것을 권장한다.

    * 관련 링크 : https://developers.naver.com/docs/search/blog/

     

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

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

    developers.naver.com

     

     

    크롤링하기 앞서, Web에 대한 이해가 필요하므로 간단하게 설명을 한다면(하단의 그림과 같이 참고할 것)

     

     1) Web은 User(하단의 그림에서는 Google)가 contents를 요청(HTTP request라고 함)하게 되면 parsing 한 후 server로 넘어간다.

     2) Server는 요청된 contents(query를 의미)를 HTML, CSS, Javascript 등으로 응답하게 된다.

     3) 이후, XML 혹은 JSON 형식으로 로딩한 후 렌더링하게 되는데 렌더링을 해주는 서비스가 Web Browser이다.

    그림6. Web에 대한 이해

     

     

    이러한 이론과 NAVER API를 활용하여 도서 정보를 Crawling하는 소스코드를 만들어보자.

     

    먼저, parsing과 Data load를 위해 json과 request 라이브러리를 import한다. 

    그림 7. import

    ② 그 후, 네이버 개발자센터에서 받은 Clint 정보를 변수에 저장한다.

    그림 8. Clinet id 및 secret 저장

    URL query를 입력한 후

    그림9. URL 및 query 입력

    ④ openAPI에 요청한다.

    그림 10. open API 검색 요청

    ⑤ request의 결과값(response를 의미)를 저장한 후, error code를 확인한다.(401과 관련된 '권한없음'이 나오면 애플리케이션 등록을 재확인 권장)

    그림 11. response값 로드 및 error code 확인

    ⑥ 이렇게 search()함수를 다 작성했으면 질의를 요청하여 응답값을 json형태로 로딩한다.

    그림 12. query 요청 및 결과를 json형태로 load

    ⑦ 그 후, 실행시켜 결과를 확인하면 다음과 같다.

    그림 13. Crawling 결과

     

     

    * 소스코드 전체

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    import urllib.request
    import json
     
     
    def search(title):
        #애플리케이션 클라이언트 id 및 secret
        client_id = "애플리케이션 클라이언트 아이디"
        client_secret = "애플리케이션 클라이언트 시크릿"
        
        #도검색 url
        query = "?query="+urllib.parse.quote(title)
      
        url_query = url + query
        
        #Open API 검색 요청 개체 설정
        request = urllib.request.Request(url_query)
        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):
            return response.read().decode('utf-8')
        else:
            return None
     
    #프로그램 진입점
    def main():
        #검색 질의 요청
        res = search(input("질의:"))
        if(res == None):
            print("검색 실패!!!")
            exit()
     
        #검색 결과를 json개체로 로딩
        json_response = json.loads(res)
        if(json_response == None):
            print("json.loads 실패!!!")
            exit()
     
        #검색 결과의 items 목록의 각 항목(post)을 출력
        for item in json_response['items']:
            print("제목:"+item['title'])
            print("설명:"+item['description'])
            print("가격:"+item['price'],end="")
            print('('+item['discount']+')')
            print("url:"+item['link'])
            print("================\n")
     
    #진입점 함수를 main으로 지정
    if __name__ == '__main__':
        main()
     
     

    댓글

by KUKLIFE