[ 1부 ] 네이버 뉴스 크롤링 (본문 포함)
그간에 공부했던 내용들을 종합해서
기술 트렌드 분석을 자동화 해보겠습니다.
챗GPT, 네이버 오픈API, 구글코랩, 구글시트, 앱스스크립트 다 나옵니다.
각 툴들의 장점들을 잘 통합해야 합니다.
여러 AI 툴의 역할
•
네이버 오픈API : 특정 검색어에 대한 네이버 뉴스 검색 결과를 대량으로 받아온다
•
챗GPT : 네이버 뉴스 검색 오픈API 코드 수정, 네이버 뉴스 본문 beautifulsoup 크롤링 코드 작성
•
구글 시트 : 네이버 뉴스 data 저장, 뉴스 본문을 GPT로 분석하여 요약문 작성
•
앱스스크립트 : 코딩을 통해 GPT API 호출 (구글 시트에서 작동하는 GPT 함수 만들기)
이 과정에서 코딩도 많이 필요하고 텍스트 분석도 많이 필요합니다.
이 모든 것을 커버해주는 것은 역시 GPT입니다.
Step #1. 네이버 오픈 API 애플리케이션 등록
•
네이버에서 제공하는 Open API를 이용하기 위해 네이버 개발자 센터에서 Client ID, Client Secret를 발급받는다
•
네이버 개발자 센터가 제공하는 샘플 코드를 복사한다
네이버 개발자 센터에 접속합니다.
애플리케이션(API 이용신청)을 합니다.
등록을 마치면 'Client ID'와 'Secret'이라는 비밀번호가 생성됩니다.
서비스 API > 검색 > 개발 가이드 보기 > 검색 API 블로그 검색 구현 예제 > Python 클릭
이 코드를 복사합니다.
# 네이버 검색 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)
Python
복사
Step #2. 구글 코랩에서 코드 실행(네이버 API 작동확인용)
구글 코랩에 접속합니다. 새 노트를 엽니다.
코랩은 파이썬 코드를 클라우드 환경에서 실행할 수 있게 해주는 플랫폼입니다.
구글이 누구에게나 무료로 제공하는 구글 워크스페이스 기능 중 하나입니다.
코드를 수정합니다.
네이버 개발자 센터에서 발급받은 API의 ID와 SECRET를 복사-붙여넣기 합니다.
이 예제는 사실 네이버 블로그 검색 API 예제입니다.
그러니 url= 되어있는 부분에서 blog라는 단어를 news라고 바꿔줍니다.
그러면 뉴스 검색 API url이 됩니다!
이대로 실행해보면 아래 결과창에 네이버 뉴스 검색 결과가 들어옵니다.
총 10개의 데이터가 들어왔네요.
API 요청의 디폴트 값이 데이터 10개만 가져오는 것이라 그렇습니다
Step#3. 네이버 API 활용하여 뉴스 1천개 수집
•
네이버 개발자 센터에서 복사한 샘플 코드를 챗GPT에게 입력한다
•
코드 수정을 지시하는 프롬프트를 입력한다
※ 사용한 프롬프트
이것은 네이버API를 이용해서 네이버 뉴스 검색을 하는 코드야.
이걸 아래와 같이 수정해줘.
1) 코드를 실행하면 사용자에게 검색어를 물어본다. 그리고 그 검색어로 크롤링을 한다
2) 검색 결과는 1000개를 받아온다
3) 검색결과를 dataframe에 넣는다
4) dataframe을 csv 파일로 다운로드 받을 수 있게 해준다
혹시나 챗GPT에게서 받은 코드에서 혹시나 오류가 난다면,
오류를 복사해서 챗GPT에게 얘기해주세요. 오류 내용을 파악해서 코드를 수정합니다.
데이터 1천개가 잘 들어왔는지 확인해봅니다.
구글 코랩에서 파이썬이 실행되면서 생긴 파일은 아래 메뉴에서 보실 수 있습니다.
왼쪽 사이트 바에서 폴더 모양 아이콘을 선택해보세요.
참고로 이 공간은 파이썬 코딩과 실행을 위한 임시 공간입니다.
창 닫은 후 몇 시간 뒤에 와보면 저 csv 파일은 이미 사라지고 없습니다.
필요한 파일은 PC에 다운로드 받아서 보관하시면 됩니다.
완성된 코드 입니다.(잘 작동합니다)
import os
import sys
import urllib.request
# 네이버 API 정보
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
# 사용자로부터 검색어 입력 받기
search_query = input("검색어를 입력하세요: ")
encText = urllib.parse.quote(search_query)
# API 요청 보내기 (한 번에 최대 100개의 결과)
total_news = []
for start in range(1, 1001, 100): # 1부터 1000까지 100 단위로 증가
url = f"https://openapi.naver.com/v1/search/news.json?query={encText}&display=100&start={start}" # JSON 결과
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()
total_news.append(response_body.decode('utf-8'))
else:
print("Error Code:", rescode)
sys.exit(1)
# 전체 뉴스 결과 출력
for news in total_news:
print(news)
Python
복사
Step #4. 네이버 뉴스 본문 크롤러 만들기
•
챗GPT에게 네이버 뉴스 본문 크롤러 코딩 받아내기
•
챗GPT 도움을 받아가며 네이버 뉴스 본문의 HTML 구조 파악하기
•
네이버 뉴스 본문 1개 크롤링 하기
네이버 뉴스 API를 이용해서 1천개의 뉴스를 받았습니다. 열어보면 5가지 정보가 있습니다.
•
뉴스의 제목
•
오리지널 링크 (원본 언론사의 뉴스기사 링크)
•
링크 (네이버가 재작성한 해당 기사의 네이버 뉴스기사 링크)
•
Publication Date (해당 뉴스가 발행된 날짜)
•
Description (해당 뉴스의 내용 요약 3줄 정도)
네이버가 API로 제공한 이 정보에는 뉴스 본문 full text가 없습니다.
이 뉴스기사를 읽을지 말지를 판단하는 정도라면 title, description 정도만 있어도 되지만,
이것만으로는 기업 분석, 기술 분석, 시장 분석을 할 수는 없습니다.
여러가지 업무를 자동화하려면 우리에게는 full text가 필요합니다.
챗GPT에게서 네이버 뉴스 크롤링 방법을 배웁니다.
그 중 beautifulsoup로 지시합니다.
네이버 뉴스처럼 정적인 HTML 페이지를 크롤링 하기에는 이 정도면 충분하고, 작동도 안정적입니다.
코랩에 가서 실행을 해 봅니다.
[1]번 먼저 실행해서 beautifulsoup를 설치합니다.
그리고 [3]번 코드 블록을 실행합니다.
이렇게 오류가 났습니다.
코드를 보니, 네이버 뉴스 본문을 추출해서 저장한 content라는 변수가 비어있으면 “본문을 찾을 수 없습니다.”라고 출력하라고 되어 있네요.
챗GPT에게 오류 내용 그대로 전달을 합니다.
아~ 본문이 <div>에 들어있을거고 그 id가 아마 articleBodyContents일거라고 합니다.
다만, 그게 다를 수도 있으니 찾아보라 하네요. 그걸 알려주면 자기가 도와준다네요.
그 주소 찾는 방법을 다시 물어봅니다.
챗GPT의 추천대로 네이버 뉴스 열고, 개발자 도구 열어봅니다.
‘검사’ 버튼 누르고 네이버 뉴스 본문에서 여기저기 찍어봅니다.
검사 도구를 선택해서 왼쪽 뉴스 페이지에서 특정 블록을 찍으면 그에 해당하는 HTML 구조가 우측 개발자 도구 화면에서 표시가 됩니다.
뉴스에서 본문이 시작하는 부분을 찍어보니,
<div id=”newsct_article” class ~> 이렇게 나오는 걸로 봐서 newsct_article 이게 주소인 것 같습니다.
GPT에게 알려줍니다.
“본문을 찾을 수 없습니다” 에러가 계속 뜬다고 GPT에게 말해주면,
GPT가 알아서 div id 저 부분의 주소 이름을 계속 바꾸는 시도를 합니다.
이렇게 몇 번 하다보면 GPT가 알아서 newsct_article 이라고 올바른 주소를 채워 넣을 때도 있습니다.
HTML의 본문 주소로 코드를 수정한 후 코랩에서 다시 실행해 봅니다.
이번에는 뉴스 본문이 잘 크롤링 됐네요.
네이버 뉴스 본문 1개 크롤러 코드. (잘 작동합니다)
import requests
from bs4 import BeautifulSoup
# 네이버 뉴스 기사 URL
url = 'https://n.news.naver.com/mnews/article/366/0001009910'
# HTTP 요청 헤더 설정
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'}
# 요청 보내기
response = requests.get(url, headers=headers)
# 응답이 성공적이면
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# 기사 본문 추출
article_body = soup.find('div', {'id': 'newsct_article'})
if article_body:
# 본문 텍스트 추출 및 출력
text = article_body.get_text(strip=True)
print(text)
else:
print("기사 본문을 찾을 수 없습니다.")
else:
print(f"요청 실패: {response.status_code}")
Python
복사
Step #5. 대량 수집 뉴스와 본문 크롤러 통합하기
•
네이버 오픈API를 활용해서 네이버 뉴스 요약 정보 1천개를 받아 온 코드를 복사한다
•
link에서 n.news.naver.com이 들어간 ‘네이버 재생산’ 뉴스만 필터링한다
•
이 url에 차례대로 방문해서 뉴스 본문을 크롤링 하도록 코드를 수정한다
아래와 같이 프롬프트를 쓰고, 기존에 만든 2개의 코드를 입력해줬습니다.
[ 네이버 오픈 API를 활용하여 네이버 뉴스 1천개의 요약 정보를 가져오는 코드를 여기에 삽입 ]
이 코드를 수정해줘.
아래 순서대로 step by step 작동하는 코드를 만들어줘.
2) 'link'에 들어있는 네이버 뉴스 페이지로 가서 네이버 뉴스 본문을 크롤링한다. 내가 제공하는 네이버 뉴스 본문 크롤링 코드를 응용해서 사용한다.
[ 네이버 뉴스 본문 1개 크롤링에 성공한 코드를 여기에 삽입한다 ]
네이버 오픈API 활용 뉴스 대량 수집 + 본문 크롤러 통합 코드 (잘 작동합니다)
import urllib.request
import json
import pandas as pd
import requests
from bs4 import BeautifulSoup
# 네이버 API 키 설정
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
# 검색할 단어 입력받기
search_term = input("검색어를 입력하세요: ")
encText = urllib.parse.quote(search_term)
# 전체 결과를 저장할 리스트
all_results = []
# 1000개의 결과를 가져오기 위한 반복
for start in range(1, 1001, 100):
# 뉴스 검색을 위한 API URL (start 인덱스와 100개씩 가져오기 설정)
url = f"https://openapi.naver.com/v1/search/news?query={encText}&display=100&start={start}"
# 요청 객체 생성
request = urllib.request.Request(url)
# 헤더에 클라이언트 ID와 시크릿 추가
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()
results = json.loads(response_body.decode('utf-8')) # UTF-8로 디코딩
all_results.extend(results['items']) # 결과 아이템 추가
else:
print("Error Code:" + str(rescode))
# 'link' 필드에 'n.news.naver.com'이 포함된 데이터만 필터링
filtered_results = [item for item in all_results if 'n.news.naver.com' in item['link']]
# 필터링된 결과를 데이터프레임으로 저장
df_filtered = pd.DataFrame(filtered_results)
# 데이터프레임을 CSV 파일로 저장 (utf-8-sig 인코딩)
df_filtered.to_csv('naver_news_results.csv', index=False, encoding='utf-8-sig')
# 각 링크에 대한 기사 본문 크롤링
for link in df_filtered['link']:
# HTTP 요청 헤더 설정
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'}
# 요청 보내기
response = requests.get(link, headers=headers)
# 응답이 성공적이면
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# 기사 본문 추출
article_body = soup.find('div', {'id': 'newsct_article'})
if article_body:
# 본문 텍스트 추출 및 출력
text = article_body.get_text(strip=True)
print(f"URL: {link}")
print(f"본문: {text}\n")
else:
print(f"기사 본문을 찾을 수 없습니다: {link}")
else:
print(f"요청 실패: {response.status_code} for URL: {link}")
Python
복사
하지만 제가 한번에 이렇게 성공한건 아니고요.
폰트가 자꾸 깨져서 인코딩 변경해달라는 말도 여러번 했고,
json 처리가 안된다는 오류가 나서 챗GPT와 대화해서 import json도 추가했고,
여러가지 오류와 수정들이 있었습니다.
오류 날 때 마다 GPT와 상의하세요.
이 통합 크롤링 결과를 CSV 파일로 다운로드 받았습니다. 총 259개의 데이터가 있네요.
검색어는 “현대자동차 기술 전략” 입니다.
오늘은 여기까지 해서 1부를 마치겠습니다.
대량의 텍스트를 확보하는 것까지 성공했네요.
다음 2부에서는
이 텍스트 데이터를 구글 시트로 가져가서
챗GPT를 불러서 기사 본문에 대한 주제와 내용 요약을 각각 시키고,
이 요약본을 또 챗GPT로 통합해서 현대자동차의 기술 전략을 정리해 보겠습니다.
AI 툴은 장점이 참 많지만,
그 중 아주 마음에 드는 부분이 바로 공유와 복사가 쉽다는 점입니다.
이 과정을 다 따라해본다면 BEST 이겠고요,
바쁘시다면 위에 나온 코드만 복사해서 본인이 직접 실행만 해보세요.
단, 실행을 해보시려면
네이버 오픈API는 직접 발급받아서 본인의 ID, SECRET을 입력해야 합니다.
감사합니다.
[2부] 구글 시트에서 텍스트 분석 자동화
구글 드라이브에 뉴스 파일(csv) 업로드
1부에서 다운로드 받은 텍스트 파일을 구글 드라이브에 업로드 합니다.
CSV 파일을 구글 시트로 열기
여기서 csv 파일에서 우클릭 > 연결앱 > Google 스프레드 시트로 열어줍니다.
그럼 이렇게 열립니다. 보기 편하게 줄바꿈을 했습니다.
GPT for Sheets and Docs 설치
구글 시트에서 GPT를 쓰기 위해 부가기능을 설치합니다.
“gpt for sheets”라고 검색하면 몇개가 나오는데요,
그 중 GPT for sheets and Docs (제작사 : Talarian)를 선택하고 설치합니다.
그럼 ‘확장 프로그램’ 메뉴 아래에 GPT for Sheets and Docs가 생깁니다.
여기서 Open을 눌러주면 우측에 사이드바가 나와요.
여기서 2가지를 해줘야 합니다.
첫번째는 요금 결제이고요, 두번째는 GPT API 연결입니다.
이 확장 프로그램은 구글 시트에서 챗GPT를 API로 연결해서 사용합니다.
구글 시트의 셀에 적혀있는 텍스트와 내가 만든 질문 프롬프트를
API를 통해서 챗GPT 서버로 보내고, 그 답변을 받아와서 다시 구글 시트에 표시해 줍니다.
챗GPT API도 유료이고요(이 돈은 챗GPT를 만든 OpenAI 회사로 갑니다)
이 API 연결을 해주고 여러가지 GPT 관련된 함수를 만들어둔 GPT fot Sheets and Docs 이거도 유료입니다(이 돈은 이 확장프로그램을 만든 Talarian이라는 회사로 갑니다)
GPT for Sheets and Docs 결제
buy a pack 눌러보면 요금제가 이렇게 나오고요
29달러를 내면 2900만 토큰 만큼의 API 질문-답변을 사용할 수 있네요.
나의 질문과 답변에 어느정도 토큰이 필요한지는
OpenAI의 토크나이저 사이트에서 테스트 해 볼 수 있습니다.
테스트로 뉴스기사 본문 하나 전체를 넣어봤는데 2,467 글자이고, 2,601 토큰이네요.
대충 계산해보면
29달러짜리 팩 하나만 사면 뉴스기사 1만개 정도를 처리할 수 있겠네요.
GPT for Sheets and Docs 직접 만들기
만약에 29달러 결제가 아깝다면,
구글 시트에서 작동하는 GPT API를 직접 만들수도 있습니다.
구글 앱스스크립트를 이용해서 GPT API를 호출하는 코드 작성도
GPT와 함께 시행착오를 거치며 만들어 보았습니다.
이 내용은 별도의 글로 작성하였습니다.
OpenAI의 GPT API 연결
GPT for Sheets and Docs 메뉴에서 API Keys 입력 메뉴를 눌러봅니다.
OpenAI의 GPT 뿐만 아니라 구글 제미나이, 앤트로픽의 클로드, 미스트랄까지 다 가능합니다.
OpenAI의 GPT API는 별도 홈페이지에서 발급받으면 됩니다.
여기서 로그인 하시고 우측상단에서 대시보드 눌러봅니다.
Create new secret key 눌러서 발급받으면 됩니다.
누구나 발급받을 수 있고, GPT Plus나 Team 등 유료사용자가 아니어도 발급 가능합니다.
모든 준비가 끝났네요.
Enable GPT fuctions를 해줍니다.
그럼 이제 우리는 구글 시트에서 여러 개의 GPT 관련된 함수를 사용할 수 있게 됩니다.
우측 사이드바에서 List of GPT functions 확인해보면 함수가 아주 많습니다.
몇가지 함수만 살펴보겠습니다.
기본적인 gpt 함수는 이렇게 작동합니다.
=gpt 라고 쓰고, 괄호 안에 “ “해서 질문 프롬프트를 입력하면 됩니다.
그럼 이 질문이 OpenAI 서버로 전송이 되고, 답변을 받아와서,
이 함수가 적힌 셀에 그 답변을 표시합니다.
이런 식으로 질문 프롬프트와 함께 A4 셀 참조를 넣을 수도 있습니다.
셀 참조가 가능하면 우리는 글 생성 단계를 구조화할 수 있게 돼요.
GPT 함수를 이용한 뉴스 본문 핵심요약
이 함수를 이용해서 뉴스 본문을 요약합니다.
GPT 함수 내에 질문 프롬프트는 이렇게 썼습니다.
=gpt("이 뉴스를 요약해줘. 1) 핵심문장 한줄을 쓴다. 처음에 # 기호를 붙인다. 2) 핵심 문장을 뒷받침하는 주요 사실 3가지를 1), 2), 3) 형식으로 정리한다. 3) 맨 마지막에 빈 줄 2줄을 추가한다 " & F2)
이 함수를 아래로 드래그하여 끝까지 채웁니다.
뉴스 본문이 들어있는 F열의 텍스트까지 질문 프롬프트로 포함을 시키고,
GPT가 그에 대한 핵심요약 답변을 G열에 채워줍니다.
뉴스 본문은 전체 279건이지만, 핵심요약은 샘플로 50개만 전체 복사를 했습니다.
핵심요약이라고는 해도 기사가 50개라서 글이 꽤 길어요.
토크나이저에서 찍어보니 14,000 토큰 정도 되네요.
이 정도 질문은 4o는 거뜬히 받아줍니다.
300개 넘는 기사도 핵심요약만 모아서 넣으면 질문 한번에 받아주겠네요.
물론 질문 창에서 안 받아주면 파일에 담아서 파일 업로드 하며 물어보면 됩니다.
뉴스 기사 50개에 대한 GPT의 정리를 감상해보시죠.
자~ 이렇게 정리가 되었습니다.
저는 여기서 두가지를 강조드리고 싶습니다.
GPT를 활용한 뉴스 분석 결론
결국에는 질문 프롬프트가 중요합니다
뉴스 본문은 아주 자세하고 긴 내용입니다.
구글 시트에서 요약을 시킬 때 어떤 내용을 중심으로,
어떤 정보를 추출해서, 어떤 형식으로 요약을 시킬 것인가 그 부분이 가장 중요하며
그건 역시나 우리의 질문 프롬프트로 결정됩니다.
여러 번의 질문을 시도하며 가장 좋은 요약은 어떤 것인가에 대한 고민이 필요합니다.
다만, 예전에는 뉴스를 찾고 읽고 파악하고 정리하느라 손발이 바빴다면,
이제는 뉴스에서 어떤 정보와 의미를 뽑아낼 것인가를 고민하느라 머리가 바빠져야 합니다.
엄청난 시간 효율화가 가능합니다.
여기까지의 과정을 따라해보셨다면 아마 시간이 오래 걸렸을겁니다.
오류도 많이 나서 답답하고 힘드셨겠죠.
하지만 우리는 뉴스를 아직 단 1건도 읽지 않았습니다.
그럼에도 불구하고 수십 건, 수백 건의 뉴스를 요약해냈죠.
유사 업무의 자동화가 가능합니다.
그리고 이제 잘 작동하는 뉴스 검색, 크롤링 코드를 얻었습니다.
다음 뉴스 분석 업무는 얼마나 걸릴까요?
그저 코드 열고 검색어만 바꾸면 뉴스 수집은 순식간에 끝나겠죠.
그리고 구글 시트 열어서 함수 걸면 뉴스 요약도 끝나겠죠.
뉴스에서 다른 정보를 추출하고 싶다면 구글 시트에서 함수에 쓴 프롬프트만 바꾸면 되죠.
기업 내 확산이 가능합니다.
회사에서 단 한 명 만이라도 이 과정에 성공한다면,
다른 동료들에게는 코드를 복사해주면 됩니다.
원래 업무 스킬이라는 것이 다른 사람에게 전수해주기가 참 어려운 영역인데요,
GPT와 AI 툴을 활용하는 방법과 결과물은 이 전수, 전달, 복사가 참 쉽습니다.
AI 툴을 쓰는 개인과 쓰지 않는 개인의 업무 속도 차이도 상당히 커지겠지만,
쓰는 조직과 쓰지 않는 조직의 차이는 그보다 훨씬 더 크게 벌어질 것으로 예상합니다.
이 모든 과정을 따라해 보시느라
오늘도 수고하셨습니다.
감사합니다.
네이버 뉴스 크롤링 코드 최종본
(뉴스 본문 포함, 구글 드라이브 저장 포함)
1부에서 만든 코드 파일을 첨부드립니다.
다운로드 받아서 구글 드라이브에 업로드 하고,
구글 코랩에서 파일 > 열기 에서 해당 파일을 선택하면 됩니다.
Naver 오픈API의 ID, Secret은 본인꺼 발급받아서 대체해서 복붙해야 합니다.
뉴스 크롤링해서 만든 csv 파일을 구글 드라이브에 저장하는 코드까지 포함되어 있습니다.
코드에서 구글 드라이브 저장 경로를 보시고, 본인 편한대로 수정해주세요.