-
Python과 네이버 API로 뉴스 데이터를 수집 해 보자!데이터 수집 2020. 3. 18. 12:06
"개가 사람을 물면 뉴스가 안되지만, 사람이 개를 물면 뉴스가 된다"
뉴스란 현재에 대한 보고서들의 모임이다. 현재의 수많은 일 중에서 다소 특이한 일들 혹은 주목해야 할 일들이 주로 뉴스가 된다. 정확도 여부를 떠나서 우리는 뉴스를 보고 미래를 추론할 수 있을 것이다. 데이터 분석 분야에서도 뉴스 데이터를 주식 분석, 집값 예측 등 많은 분야에서 활용하고 있다.
기본적으로 이러한 뉴스를 수집하기 위해서는 크롤링을 이용하여 수 많은 HTTP에 접속하여 필요한 부분을 데이터화 하는 것이 일반적이나 각 신문사마다 포맷이 다르며 신문사의 사이트 포맷이 바뀌면 코드를 변경해야 하는 단점이 있어 오늘은 네이버에서 제공하는 API와 Python을 이용하여 네이버 뉴스를 수집하고 결과를 엑셀 파일로 저장하는 방법을 소개한다.
1. 네이버 API의 Client ID와 Client Secret 값 취득하기
API로 뉴스 데이터를 요청하기 위해서는 네이버에서 제공하는 Client ID와 Client Secret 값을 사전에 보내 놓을 필요가 있다.(2. Client ID와 Client Secret 값 보내기 참고)
네이버 뉴스 검색 API에 접속하여 "오픈 API 이용 신청" 버튼을 클릭한다.
애플리케이션 등록(API 이용신청)화면에서 필요한 항목을 입력한다.
- 애플리케이션의 이름 : 적당한 이름 아무거나 혹은 자신의 애플리케이션 이름
- 사용 API : "검색"이 이미 선택 되어선택되어 있으므로 그냥 놔둔다. "검색" 선택되어 있지 않은 경우는 "검색"을 선택
- 비로그인 오픈 API 서비스 환경 : "WEB 설정"을 선택하자
-> 웹 서비스 URL : 자신의 URL입력, 자신의 사이트가 없을 경우 임의의 사이트 입력 가능(예, https://naver.com)
"등록하기" 클릭 후 Client ID와 Client Secret 이 생성이 된 것을 확인할 수 있다. 참고로 무제한으로 검색을 요청할 수 있는 것은 아니고 하루 25,000건으로 제한이 있다.
2. Client ID와 Client Secret 값 보내기
필요한 Package는 HTTP요청을 보내는 requests와 데이터 테이블화 하고 엑셀 출력하기 위한 pandas, 데이터 클렌징을 위한 re만 있으면 된다.
"1. 네이버 API의 Client ID와 Client Secret 값 취득하기"에서 획득한 자신의 Client ID와 Client Secret를 입력한다.
나중에 "3.다양한 조건으로 검색 요청 보내기"에서 요청을 보내기 전에 header에 정보를 넣어서 보내면 된다.
import requests import pandas as pd client_id = "xxxxxx" #1.에서 취득한 아이디 넣기 client_secret = "xxxxx" #1. 에서 취득한 키 넣기
3. 다양한 조건으로 검색 요청 보내기
검색어, 출력 포맷, 출력수, 출력 위치를 정해서 요청을 보내는 것이 가능하다.(날짜 지정은 찾지 못했다....)
정상적으로 요청이 되고 응답이 오면 200 이 출력된다.
search_word = '코로나' #검색어 encode_type = 'json' #출력 방식 json 또는 xml max_display = 100 #출력 뉴스 수 sort = 'date' #결과값의 정렬기준 시간순 date, 관련도 순 sim start = 1 # 출력 위치 url = f"https://openapi.naver.com/v1/search/news.{encode_type}?query={search_word}&display={str(int(max_display))}&start={str(int(start))}&sort={sort}" #헤더에 아이디와 키 정보 넣기 headers = {'X-Naver-Client-Id' : client_id, 'X-Naver-Client-Secret':client_secret } #HTTP요청 보내기 r = requests.get(url, headers=headers) #요청 결과 보기 200 이면 정상적으로 요청 완료 print(r)
오류가 날 경우에는 코드를 보고 오류 원인을 찾을 수 있다.
4. 결과물 클렌징 하기
먼저 결과물을 확인해 보자.
json형식을 dict형식으로 변환 후 필요한 정보가 items의 키에 있고 그 형식은 list이므로 pandas를 이용하여 간단히 보기 쉽게 변환이 가능하다.
r.json()
pd.DataFrame(r.json()['items'])
정규표현식을 이용하여 html 코드의 불필요한 항목들을 제거해 보자.
def clean_html(x): x = re.sub("\&\w*\;","",x) x = re.sub("<.*?>","",x) return x df['title'] = df['title'].apply(lambda x: clean_html(x)) df['description'] = df['description'].apply(lambda x: clean_html(x))
5. 결과물 엑셀로 보존하기
pandas를 이용하여 엑셀로 출력한다.
df.to_csv(f'news_search_result_{search_word}.csv')
네이버에서 제공하는 API를 이용하면 간편히 뉴스를 스크래핑 해오는 것이 가능하다. 하지만 내용이 일부분이며, 날짜 지정을 할 수 없는 한계가 있다. 많은 데이터 분석 프로젝트 들이 과거의 데이터부터 수집을 해야 하는 경우가 많으므로 사용처가 한정된다. 모든 데이터를 얻기 위해서는 각 신문사의 사이트에서 크롤링해야 할 필요가 있다.