크롤링

[파이썬] 네이버 Open API를 사용하여 검색 결과 크롤링하기

딱따구르리 2023. 10. 21. 01:22
728x90
반응형

 

 

 

네이버 Open API란?

네이버 OpenAPI는 네이버에서 제공하는 기능, 데이터에 접근할 수 있게 해주는 API(응용 프로그래밍 인터페이스)입니다.

제공하는 기능으로는 검색, 로그인, 번역 등이 있습니다.

 

 

네이버 Open API 사용법

Oepn API를 사용하려면 우선 애플리케이션을 등록해야 합니다. 

아래 사이트에서 네이버 로그인을 한 후 등록할 수 있습니다.

https://developers.naver.com/apps/#/register

 

애플리케이션 - NAVER Developers

 

developers.naver.com

밑의 설명을 보며 따라하시면 됩니다.

등록을 위해선

1) 애플리케이션 이름 작성

2) 사용하고자 하는 API 추가

저는 검색만 사용할 것이기 때문에 검색을 선택했습니다.

더 사용하고자 하는 API가 있다면 추가 선택하시면 됩니다.

 

3) 서비스 환경 선택 후 도메인 추가

app인지 web인지에 따라 작성해야 하는게 다릅니다.

저는 web이기 때문에 도메인을 추가해야 하는데 없어서 localhost를 추가했습니다.

 

등록을 끝내면 아래처럼 Client ID와 Secret이(검은 네모) 발급됩니다. Secret 밑에 '재발급'이라고 써있는데 처음 들어가시면 '보기'라고 되어 있습니다. 그걸 클릭하시면 Secret 넘버를 볼 수 있습니다.

검색 API는 호출 일일 허용량이 25,000번(빨간 네모)으로 정해져있기 때문에 이를 유의해서 사용하시면 됩니다.

 

 

반응형

 

필요한 기능 API 문서 확인

 

https://developers.naver.com/docs/serviceapi/search/blog/blog.md#%EA%B2%80%EC%83%89-_-%EB%B8%94%EB%A1%9C%EA%B7%B8

 

검색 > 블로그 - Search API

검색 > 블로그 블로그 검색 개요 개요 검색 API와 블로그 검색 개요 검색 API는 네이버 검색 결과를 뉴스, 백과사전, 블로그, 쇼핑, 영화, 웹 문서, 전문정보, 지식iN, 책, 카페글 등 분야별로 볼 수

developers.naver.com

검색 API는 위의 링크를 따라 가면 볼 수 있고

다른 API 문서를 확인하려면 홈페이지 상단의 Documents > 서비스 API를 클릭하면 확인 수 있다.

 

 

요청 보내고 응답 받기

1) requests import 하기

2) base_url에 헤더와 파라미터를 포함해 네이버 API에 GET 요청 보내기

3) 응답 데이터 JSON으로 파싱하여 응답 데이터의 'items' 키에 있는 항목 출력

여기서 주의할 점은 응답 요소가 ' rss/channel/item'로 구성되어 있어 item 키에 담겨있다고 생각할 수 있는데

설명을 잘 읽어보면 item이 아니라 items에 담겨있다

4) 발급받은 id, secret 입력하기

5) 검색어 입력 받아 search_naver_blog 함수 호출

import requests  #http 요청을 보내고 응답을 받기 위함

def search_naver_blog(query, client_id, client_secret):
    base_url = "https://openapi.naver.com/v1/search/blog"  #검색 API 기본 URL 주소
    headers = {
        "X-Naver-Client-Id": client_id,
        "X-Naver-Client-Secret": client_secret
    }
    params = {
        "query": query,  #검색어
        "display": 10  #검색 결과 개수
    }

    response = requests.get(base_url, headers=headers, params=params)
    if response.status_code == 200:
        data = response.json()  #JSON 형식으로 파싱
        for item in data['items']:  #JSON 형식 결괏값에서는 'items' 속성의 JSON 배열로 개별 검색 결과를 반환함
            print(f'Item: {item}')
            print()
    else:
        print(f'Error: {response.status_code}')

#발급받은 ID, SECRET -> 본인이 발급받은 id, secret 입력하기
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
query = input('검색어를 입력하세요: ')

search_naver_blog(query, client_id, client_secret)

 

이제 이 코드를 실행시키면 아래와 같은 결과를 얻을 수 있다.

Item: {'title': '<b>보홀</b> 감성숙소, 바탈라리조트 Bathala Resort', 'link': 'https://blog.naver.com/haniyamyam/223241479732', 'description': '<b>보홀</b>에서 유명한 리조트는 헤난, 아모리타, BBC, 사우스팜 등 여러 곳이 있는데, <b>보홀</b>은 가족 단위의 여행객들이 많기 때문에(ㅎㅎ) 가족여행 숙소로 유명한 곳들은 제외하고 예약했다. 한국인들이 많이 가는... ', 'bloggername': '닝꼬일기', 'bloggerlink': 'blog.naver.com/haniyamyam', 'postdate': '20231020'}

Item: {'title': '<b>보홀</b> 0.5박 가성비 숙소 그린파파야의 향기 리조트 후기', 'link': 'https://blog.naver.com/imsera2/223239540342', 'description': '<b>보홀</b> 0.5박 가성비 숙소 그린파파야의 향기 리조트 후기 위치 밤에 도착하는 제주항공 스케줄로 공항 픽업 받아서 <b>보홀</b> 0.5박 숙소 그린파파야의향기 리조트 도착한 시간이 밤 11시가 넘었습니다. <b>보홀</b> 팡라오... ', 'bloggername': '김집순이의 일상', 'bloggerlink': 'blog.naver.com/imsera2', 'postdate': '20231017'}

Item: {'title': '필리핀 <b>보홀</b> 여행 경비 직항 항공권 숙소 픽업 예약 팁', 'link': 'https://blog.naver.com/invu1657/223236700114', 'description': '필리핀 <b>보홀</b> 여행 경비 직항 항공권 숙소 픽업 예약 팁 가성비 좋은 동남아 도시 중 최근에 BOHOL의... 때 #필리핀<b>보홀</b>여행경비 가 약 139만원 나왔어요. 12월에는 성수기라서 예산이 좀 더 높아지겠지만 날씨가... ', 'bloggername': '낭만소녀의 워너비걸즈', 'bloggerlink': 'blog.naver.com/invu1657', 'postdate': '20231015'}

Item: {'title': '필리핀 <b>보홀</b> 맛집 : 빠우 메뉴추천 가격 영업시간 등 후기', 'link': 'https://blog.naver.com/babastu/223234119428', 'description': '진짜 맛있게 먹었던 필리핀 <b>보홀</b> 맛집 빠우 BARWOO 메뉴 추천, 가격, 영업시간, 위치 등 총정리 포스팅입니다 :) 분위기도 좋고 맛도 좋았던 <b>보홀</b> 빠우 <b>보홀</b> 빠우 BARWOO 영업시간 : 오후 12:00~15:00 / 17:00~22:00 휴무... ', 'bloggername': '횸니의 소소한 여행로그', 'bloggerlink': 'blog.naver.com/babastu', 'postdate': '20231013'}

Item: {'title': '<b>보홀</b>네일 아이와 함께 받은 비아디떼 후기!', 'link': 'https://blog.naver.com/mamybebe/223234649976', 'description': '아이들과 함께 다녀왔던 <b>보홀</b> 여행! 오자마자 글을 작성하려 했는데 해야 할 일들이 많이 밀리다 보니 이제야 글을 작성하게 되네요. 이번에 처음 <b>보홀</b>을 다녀 왔는데 힐링이라는 게 바로 이것이 아닐까 싶을... ', 'bloggername': '돌아다니고 끄적거리는 리뷰몽땅', 'bloggerlink': 'blog.naver.com/mamybebe', 'postdate': '20231012'}

Item: {'title': '생일맞이 11월 <b>보홀</b> 3박5일 준비: 가성비 여행 컨셉', 'link': 'https://blog.naver.com/pearlpark11/223234372163', 'description': '이번 <b>보홀</b>여행부터는 그래도 또 기록해보쟈 해서!! 기록하려고 글 써봅니다!!! 가성비 <b>보홀</b> 3박 5일 여행 준비 포스팅 시작! 3박5일 <b>보홀</b>여행 준비물 1.항공권 2.숙박 3.입국시 필요 서류 4.투어 일정(호핑... ', 'bloggername': '그또다의 일상', 'bloggerlink': 'blog.naver.com/pearlpark11', 'postdate': '20231012'}

Item: {'title': '필리핀 <b>보홀</b> 여행 일일 투어 세부 출발 비오비투어 솔직 후기', 'link': 'https://blog.naver.com/pinkyluv83/223236951315', 'description': '<b>보홀</b> 로복강 런치 크루즈 안녕하세요. 해외여행 블로거 Kimi입니다. 엄마와 함께 오랜만에 떠난 지난 3박 5일 세부 자유여행. 하루는 <b>보홀</b> 여행하고 싶어 세부 단독 투어 여행 전문사 비오비투어 통해 세부... ', 'bloggername': 'Kimi의 여행일기', 'bloggerlink': 'blog.naver.com/pinkyluv83', 'postdate': '20231015'}

Item: {'title': '필리핀 <b>보홀</b> 여행 경비 <b>보홀</b> 직항 시간 비그랜드 리조트... ', 'link': 'https://blog.naver.com/uni7741/223237136570', 'description': '필리핀 <b>보홀</b> 여행 경비 <b>보홀</b> 직항 시간 비그랜드 리조트 가격비교 팁 글·사진 by 둔켈 아마도 최근에 가장 핫한 동남아 휴양지 하나를 선택하라면 <b>보홀</b>인데 여전히 많이 떠나고 있는 세부와 비교해도 리조트의... ', 'bloggername': '둔켈의 여행 그리고 이야기', 'bloggerlink': 'blog.naver.com/uni7741', 'postdate': '20231020'}

Item: {'title': '<b>보홀</b> 조용한 해변-사우스 팜 리조트 비치', 'link': 'https://blog.naver.com/knitart/223237200341', 'description': '해변에 야외 풀장도 있어서 강사님이랑 담에 <b>보홀</b> 오면 방문하겠다고 찜해두었다. 날씨가 조금 흐리긴... <b>보홀</b>을 다시 가게 된다면 다이빙 숙소에서 주로 지내고 마지막 날은 이런 리조트에서 지내는 것도 좋을... ', 'bloggername': 'finning', 'bloggerlink': 'blog.naver.com/knitart', 'postdate': '20231015'}

Item: {'title': '필리핀 <b>보홀</b> 호핑투어 발리카삭 버진아일랜드 단독 투어 후기', 'link': 'https://blog.naver.com/skli0612/223238400457', 'description': '필리핀 여행 필리핀 <b>보홀</b> 호핑투어 단독 투어 돌고래와칭, 발리카삭, 버진아일랜드 안녕하세요 여행 인플루언서 에이풋입니다 :) 요즘 뜨고 있는 필리핀 <b>보홀</b>은 수중환경이 아름답고 수중생물도 다양해서... ', 'bloggername': '에이풋의 풋풋한 세계여행', 'bloggerlink': 'blog.naver.com/skli0612', 'postdate': '20231016'}

 

 

 

 

응답 결과 json 파일로 저장하기

1) json 모듈 import 하기

json 파일을 읽거나 쓰려면 json 모듈이 필요합니다.

2) 데이터를 입력받을 results 리스트 선언하기

3) print 하던 item 데이터를 results 리스트에 추가해주기

4) 잊지 말고 results 반환하기

5) 검색 결과를 search_results 변수에 담아 지정한 경로에 json 파일로 저장하기

저는 json 파일을 저장할 data 폴더를 따로 만들었습니다.

json.dump 함수는 json.dump(python 객체, 파일 객체, 아스키 외의 문자 포함 옵션, 들여쓰기 옵션) 으로 구성되어 있습니다.

import requests  #http 요청을 보내고 응답을 받기 위함
import json

def search_naver_blog(query, client_id, client_secret):
    base_url = "https://openapi.naver.com/v1/search/blog"  #검색 API 기본 URL 주소
    headers = {
        "X-Naver-Client-Id": client_id,
        "X-Naver-Client-Secret": client_secret
    }
    params = {
        "query": query,  #검색어
        "display": 10  #검색 결과 개수
    }

    response = requests.get(base_url, headers=headers, params=params)
    results = []
    if response.status_code == 200:
        data = response.json()  #JSON 형식으로 파싱
        for item in data['items']:  #JSON 형식 결괏값에서는 'items' 속성의 JSON 배열로 개별 검색 결과를 반환함
            results.append({
                'item': item
            })
    else:
        print(f'Error: {response.status_code}')
    return results

#발급받은 ID, SECRET -> 본인이 발급받은 id, secret 입력하기
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
query = input('검색어를 입력하세요: ')

#블로그 검색 결과 가져오기
search_results = search_naver_blog(query, client_id, client_secret)

#수집한 데이터 JSON 파일로 저장
with open('../data/search_results.json', 'w', encoding='utf-8') as json_file:  #파일 객체 json_file 변수에 할당
    json.dump(search_results, json_file, ensure_ascii=False, indent=4)

print('데이터를 JSON 파일로 저장했습니다.')

 

다시 이 코드를 실행시키면 아래와 같은 JSON 파일을 얻을 수 있다.

[
    {
        "item": {
            "title": "<b>보홀</b> 감성숙소, 바탈라리조트 Bathala Resort",
            "link": "https://blog.naver.com/haniyamyam/223241479732",
            "description": "<b>보홀</b>에서 유명한 리조트는 헤난, 아모리타, BBC, 사우스팜 등 여러 곳이 있는데, <b>보홀</b>은 가족 단위의 여행객들이 많기 때문에(ㅎㅎ) 가족여행 숙소로 유명한 곳들은 제외하고 예약했다. 한국인들이 많이 가는... ",
            "bloggername": "닝꼬일기",
            "bloggerlink": "blog.naver.com/haniyamyam",
            "postdate": "20231020"
        }
    },
    {
        "item": {
            "title": "<b>보홀</b> 0.5박 가성비 숙소 그린파파야의 향기 리조트 후기",
            "link": "https://blog.naver.com/imsera2/223239540342",
            "description": "<b>보홀</b> 0.5박 가성비 숙소 그린파파야의 향기 리조트 후기 위치 밤에 도착하는 제주항공 스케줄로 공항 픽업 받아서 <b>보홀</b> 0.5박 숙소 그린파파야의향기 리조트 도착한 시간이 밤 11시가 넘었습니다. <b>보홀</b> 팡라오... ",
            "bloggername": "김집순이의 일상",
            "bloggerlink": "blog.naver.com/imsera2",
            "postdate": "20231017"
        }
    },
    {
        "item": {
            "title": "필리핀 <b>보홀</b> 여행 경비 직항 항공권 숙소 픽업 예약 팁",
            "link": "https://blog.naver.com/invu1657/223236700114",
            "description": "필리핀 <b>보홀</b> 여행 경비 직항 항공권 숙소 픽업 예약 팁 가성비 좋은 동남아 도시 중 최근에 BOHOL의... 때 #필리핀<b>보홀</b>여행경비 가 약 139만원 나왔어요. 12월에는 성수기라서 예산이 좀 더 높아지겠지만 날씨가... ",
            "bloggername": "낭만소녀의 워너비걸즈",
            "bloggerlink": "blog.naver.com/invu1657",
            "postdate": "20231015"
        }
    },
    {
        "item": {
            "title": "필리핀 <b>보홀</b> 맛집 : 빠우 메뉴추천 가격 영업시간 등 후기",
            "link": "https://blog.naver.com/babastu/223234119428",
            "description": "진짜 맛있게 먹었던 필리핀 <b>보홀</b> 맛집 빠우 BARWOO 메뉴 추천, 가격, 영업시간, 위치 등 총정리 포스팅입니다 :) 분위기도 좋고 맛도 좋았던 <b>보홀</b> 빠우 <b>보홀</b> 빠우 BARWOO 영업시간 : 오후 12:00~15:00 / 17:00~22:00 휴무... ",
            "bloggername": "횸니의 소소한 여행로그",
            "bloggerlink": "blog.naver.com/babastu",
            "postdate": "20231013"
        }
    },
    {
        "item": {
            "title": "<b>보홀</b>네일 아이와 함께 받은 비아디떼 후기!",
            "link": "https://blog.naver.com/mamybebe/223234649976",
            "description": "아이들과 함께 다녀왔던 <b>보홀</b> 여행! 오자마자 글을 작성하려 했는데 해야 할 일들이 많이 밀리다 보니 이제야 글을 작성하게 되네요. 이번에 처음 <b>보홀</b>을 다녀 왔는데 힐링이라는 게 바로 이것이 아닐까 싶을... ",
            "bloggername": "돌아다니고 끄적거리는 리뷰몽땅",
            "bloggerlink": "blog.naver.com/mamybebe",
            "postdate": "20231012"
        }
    },
    {
        "item": {
            "title": "생일맞이 11월 <b>보홀</b> 3박5일 준비: 가성비 여행 컨셉",
            "link": "https://blog.naver.com/pearlpark11/223234372163",
            "description": "이번 <b>보홀</b>여행부터는 그래도 또 기록해보쟈 해서!! 기록하려고 글 써봅니다!!! 가성비 <b>보홀</b> 3박 5일 여행 준비 포스팅 시작! 3박5일 <b>보홀</b>여행 준비물 1.항공권 2.숙박 3.입국시 필요 서류 4.투어 일정(호핑... ",
            "bloggername": "그또다의 일상",
            "bloggerlink": "blog.naver.com/pearlpark11",
            "postdate": "20231012"
        }
    },
    {
        "item": {
            "title": "필리핀 <b>보홀</b> 여행 일일 투어 세부 출발 비오비투어 솔직 후기",
            "link": "https://blog.naver.com/pinkyluv83/223236951315",
            "description": "<b>보홀</b> 로복강 런치 크루즈 안녕하세요. 해외여행 블로거 Kimi입니다. 엄마와 함께 오랜만에 떠난 지난 3박 5일 세부 자유여행. 하루는 <b>보홀</b> 여행하고 싶어 세부 단독 투어 여행 전문사 비오비투어 통해 세부... ",
            "bloggername": "Kimi의 여행일기",
            "bloggerlink": "blog.naver.com/pinkyluv83",
            "postdate": "20231015"
        }
    },
    {
        "item": {
            "title": "필리핀 <b>보홀</b> 여행 경비 <b>보홀</b> 직항 시간 비그랜드 리조트... ",
            "link": "https://blog.naver.com/uni7741/223237136570",
            "description": "필리핀 <b>보홀</b> 여행 경비 <b>보홀</b> 직항 시간 비그랜드 리조트 가격비교 팁 글·사진 by 둔켈 아마도 최근에 가장 핫한 동남아 휴양지 하나를 선택하라면 <b>보홀</b>인데 여전히 많이 떠나고 있는 세부와 비교해도 리조트의... ",
            "bloggername": "둔켈의 여행 그리고 이야기",
            "bloggerlink": "blog.naver.com/uni7741",
            "postdate": "20231020"
        }
    },
    {
        "item": {
            "title": "<b>보홀</b> 조용한 해변-사우스 팜 리조트 비치",
            "link": "https://blog.naver.com/knitart/223237200341",
            "description": "해변에 야외 풀장도 있어서 강사님이랑 담에 <b>보홀</b> 오면 방문하겠다고 찜해두었다. 날씨가 조금 흐리긴... <b>보홀</b>을 다시 가게 된다면 다이빙 숙소에서 주로 지내고 마지막 날은 이런 리조트에서 지내는 것도 좋을... ",
            "bloggername": "finning",
            "bloggerlink": "blog.naver.com/knitart",
            "postdate": "20231015"
        }
    },
    {
        "item": {
            "title": "필리핀 <b>보홀</b> 호핑투어 발리카삭 버진아일랜드 단독 투어 후기",
            "link": "https://blog.naver.com/skli0612/223238400457",
            "description": "필리핀 여행 필리핀 <b>보홀</b> 호핑투어 단독 투어 돌고래와칭, 발리카삭, 버진아일랜드 안녕하세요 여행 인플루언서 에이풋입니다 :) 요즘 뜨고 있는 필리핀 <b>보홀</b>은 수중환경이 아름답고 수중생물도 다양해서... ",
            "bloggername": "에이풋의 풋풋한 세계여행",
            "bloggerlink": "blog.naver.com/skli0612",
            "postdate": "20231016"
        }
    }
]

 

 

네이버 OpenAPI 클라이언트 id, secret 별도로 관리하기

 

네이버 OpenAPI 클라이언트 id, secret을 따로 관리하고 싶은 분들은 다음 글을 참고해주시기 바랍니다.

 

[파이썬] 네이버 Open API client id, secret 별도로 관리하기

네이버 Open API를 사용하기 위해 개발자 센터에서 발급받은 클라이언트 id, secret은 개인 정보 입니다. 그렇기에 보안상 소스 코드와 함께 깃허브 등에 올리지 않는 것이 좋습니다. 민감한 정보이

buzz-program.tistory.com

 

 

 

728x90
반응형