본문 바로가기
실전머신러닝

뉴스 크롤링 with Python

by 다빈치스탁 2020. 9. 3.
728x90
반응형

매번 느끼는거지만 테마주, 급등주 등 시장은  요란도 하다. 어닝서프라이즈(호실적)라고 해서 반드시 호재로 작용하는 것도 아니고 어닝쇼크(실적악화)라고 해서 또 악재로만 작용하는 것도 아니다. 증시격언에 소문에 사서 뉴스에 팔라는 말이 어떤 경우에는 정확히 들어맞기도 한다. 그래서 한 때는 텍스트마이닝 따위는 엄청 쓸모없는 짓이라 생각했었다. 

 

비록 무쓸모일지도 모르지만 시장이 하락한다면 왜 하락하는지를 알아야 그나마 마음이 좀 진정되는 우리는 감정의 동물이다. 이미 벌어진 결과는 어쩔 수 없다고 하더라도 왜? 라는 질문에 대한 답이 없을 경우 더 불안해하는 것이 사람인지라 그런 의미에서는 뉴스를 분석해보는 것도 나쁘진 않을 것 같다. 그리고 드물기는 하지만 뉴스가 선행성 시그널로 작용할때도 있기에 뉴스를 분석해서 보고해주는 로봇에 대해 연구해보자.

 

텍스트마이닝을 수행하기 전에 가장 우선적으로 필요한게 뭘까? 사람은 일을 시킬 때 돈을 주지만 인공지능은 일을 시키려면 밥(데이터)을 줘야 한다. 밥도 안주고 일을 시키게 되면 아무리 컴퓨터라도 뭘 할 수 있는게 없다. 자 그럼 인공지능을 학습시키기 위한 뉴스데이터를 모아보자.

 

데이터를 수집하는 방법은 여러가지가 있겠지만 만만한 네이버를 이용해보자. 초록창에 "네이버 api"라고 써도 되고 개발자센터(https://developers.naver.com/main)로 바로 접속해도 된다. 메뉴 가장 상단에 Application 이라는 메뉴가 있다. 마우스를 오버하면 애플리케이션 등록이 보이는 데 그걸 클릭하고 들어가서 아래의 내용을 채워넣고 마지막에 등록버튼을 누르면 된다. 이때 나오는 키 값을 잘 메모해두자.

 

이름 : 적당한 걸로 써주자.

카테고리 : 기타

사용API : 검색

비로인 오픈... : WEB설정, URL은 자신의 블로그나 카페 URL을 넣어준다.

 

짜잔, 이제 하루 25000건의 API 요청에 대해서는 그닥 제한 없이 호출할 수 있다. 역시 네이버다. 이제부터는 네이버 API를 이용해서 뉴스들을 크롤링 해보자. 우선 네이버개발자센터에서 Products에 마우스를 오버하면 서비스API라는 항목이 보인다. 여기를 클릭하면 친절하게도 샘플코드를 제공한다. java, php,,, 등이 있는데 python을 선택하면 블로그를 검색하는 API코드가 나온다.

 

# 네이버 검색 API예제는 블로그를 비롯 전문자료까지 호출방법이 동일하므로 blog검색만 대표로 예제를 올렸습니다.
# 네이버 검색 Open API 예제 - 블로그 검색
import os
import sys
import urllib.request
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
encText = urllib.parse.quote("검색할 단어")
url = "https://openapi.naver.com/v1/search/blog?query=" + encText # json 결과
# 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)

 

client_id, client_secret 키는 메모해두었던 내용이라 바로 복사해서 붙여넣어주고 "검색할 단어" 대신에 "삼성전자"라고 입력해보자. 그러면 각 블로그의 URL 이나 내용 등이 스크랩되는 걸 볼 수 있을 것이다. 엇? 다했네. 그렇다. 이것 역시 별로 할게 없다. 그러나 우리가 필요한 건 블로그가 아닌 뉴스자료들이기때문에 위의 샘플코드를 토대로 뉴스를 크롤링해서 text 파일에 저장하는 걸 만들어 볼 차례다. 구조는 동일하기 때문에 api URL과 헤더 값만 살짝 변경하면 된다. 마찬가지로 네이버가이드에 친절히 설명이 나와있지만 그것도 귀찮은 사람들은 아래의 코드를 복붙 ㄱㄱ.

 

# 네이버 검색 API예제는 블로그를 비롯 전문자료까지 호출방법이 동일하므로 blog검색만 대표로 예제를 올렸습니다.
# 네이버 검색 Open API 예제 - 블로그 검색
import os
import sys
import urllib.request
from bs4 import BeautifulSoup

client_id = "본인의 아이디"
client_secret = "본인의 키 값"
encText = 'sort=sim&start=1&display=2&query='+urllib.parse.quote("삼성전자")
#url = "https://openapi.naver.com/v1/search/blog?query=" + encText # json 결과
url = "https://openapi.naver.com/v1/search/news.xml?" + encText # xml 결과
print(url)

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()

file = open("naver_news.txt", "w", encoding='utf-8')

if(rescode==200):
    response_body = response.read()
    xmlsoup = BeautifulSoup(response_body, 'html.parser')
    items = xmlsoup.find_all('item')
    #print(items)
    for item in items:
        file.write(item.description.get_text(strip=True) + '\n')

    print("Success")
else:
    print("Error Code:" + rescode)

file.close()

 

위 코드("삼성전자"에 대한 뉴스크롤링)에서 아이디와 비밀키를 본인이 신청한 값으로 업데이트 한 후 실행을 하면 해당 경로에 naver_news.txt라는 파일이 생성될 것이다. 위의 url 인자값에 대해 부연 설명을 하자면 아래의 그림과 같다. 몇건을 조회할 것인지, 정렬을 어떻게 할 것인지 등인데 상황에 맞게 선택하면 된다. 

 

naver_news.txt 파일을 열어보면 짜잔!! 아래와 같이 뉴스의 요약정보가 예쁘게 저장되어 있다.

 

<b>삼성전자</b>가 미국 반도체 업체 엔비디아의 PC용 그래픽칩 신제품 &apos;지포스 RTX 30&apos; 시리즈의 위탁생산을 맡았다. 엔비디아 신제품 수주를 통해 <b>삼성전자</b>의 파운드리(위탁생산) 부문 매출이 늘 것으로 전망된다. 2일...
전세계 증권사들이 <b>삼성전자</b> 주가에 대해 긍정적인 입장을 내놓고 있다. 일부 증권사의 경우 앞으로 <b>삼성전자</b> 주가가 50%는 더 오를 것이라고 보고 있다. 2일(현지시간) 미국 CNBC 방송은 시장정보 업체 레피니티브가...

 

728x90
반응형

댓글