파이썬을 활용한 '키워드 수집 → 뉴스 검색 → 본문 추출 과정'

파이썬을 활용한 '키워드 수집 → 뉴스 검색 → 본문 추출 과정'

파이썬을 활용해 "키워드 수집 → 뉴스 검색 → 본문 추출"로 이어지는 데이터 수집 자동화 과정을 단계별 코드 예시와 함께 설명해 드릴게요.


1. 파이썬 환경 및 라이브러리 준비

먼저 데이터를 수집하고 API를 다루기 위해 필요한 도구들을 설치해야 합니다.

Bash
pip install requests beautifulsoup4 pandas

2. API를 활용한 키워드 수집 (구글 트렌드 예시)

네이버 API는 승인이 필요하므로, 여기서는 라이브러리를 통해 접근 가능한 Google Trends 방식으로 키워드를 가져오는 흐름을 보여드립니다.

Python
import requests
from bs4 import BeautifulSoup
defget_realtime_keywords():
 # 구글 트렌드 RSS 피드 등을 활용해 급상승 키워드를 가져오는 로직 (예시)
 url = "https://trends.google.com/trends/trendingsearches/daily/rss?geo=KR"
 response = requests.get(url)
 soup = BeautifulSoup(response.content, "xml")
 keywords = [item.title.get_text() for item in soup.find_all("item")]
 return keywords[:5] # 상위 5개 키워드 반환
print(get_realtime_keywords())

3. 뉴스 데이터 수집 (네이버 뉴스 검색 API 활용)

가장 핵심적인 부분입니다. 네이버 개발자 센터에서 발급받은 Client IDSecret을 사용합니다.

Python
import os
import requests
defsearch_news(query):
 client_id = "YOUR_CLIENT_ID"
 client_secret = "YOUR_CLIENT_SECRET"
 # 네이버 뉴스 검색 API 엔드포인트
 url = f"https://openapi.naver.com/v1/search/news.json?query={query}&display=3&sort=sim"
 headers = {
 "X-Naver-Client-Id": client_id,
 "X-Naver-Client-Secret": client_secret
 }
 response = requests.get(url, headers=headers)
 if response.status_code == 200:
 return response.json()['items'] # 뉴스 제목, 링크, 요약 정보 반환
 else:
 print("Error Code:" + str(response.status_code))
 returnNone
# '비트코인' 관련 최신 뉴스 3개 가져오기
news_list = search_news("비트코인")

4. 뉴스 본문 크롤링 (BeautifulSoup 활용)

API가 제공하는 것은 '요약'일 뿐입니다. AI가 풍부한 내용을 쓰게 하려면 원문 링크에 접속해 본문을 긁어와야 합니다.

Python
defget_news_content(url):
 try:
 headers = {"User-Agent": "Mozilla/5.0"}
 res = requests.get(url, headers=headers)
 soup = BeautifulSoup(res.text, "html.parser")
 # 일반적인 뉴스 사이트의 본문 태그를 찾아 추출 (사이트마다 다를 수 있음)
 # 예: <article> 혹은 class가 'article_view'인 부분
 content = soup.find('article') or soup.find('div', class_='article_body')
 return content.get_text(strip=True) if content else"본문을 찾을 수 없습니다."
 except:
 return"접근 제한된 사이트입니다."
# 첫 번째 뉴스 기사의 본문 가져오기
if news_list:
 full_text = get_news_content(news_list[0]['link'])
 print(full_text[:200]) # 앞부분 200자만 출력

5. 요약 및 다음 단계 연동

이렇게 수집된 full_text를 이제 OpenAI GPT API로 넘겨주면 됩니다.

  1. Input: 수집된 뉴스 본문 + 키워드

  2. Prompt: "위 뉴스 내용을 바탕으로 블로그 포스팅을 작성해줘. 말투는 친근하게 해주고 관련 해시태그도 5개 뽑아줘."

  3. Output: AI가 작성한 블로그 글 완성

구현 시 주의사항

  • Rate Limit: API는 호출 횟수 제한이 있습니다. 너무 빠르게 요청하면 차단될 수 있으니 time.sleep(1) 등을 사용해 간격을 두세요.

  • robots.txt: 크롤링 전 해당 사이트가 자동 수집을 허용하는지 확인해야 합니다. (네이버 뉴스 API를 통해 제공되는 링크는 대부분 요약본 활용을 권장합니다.)

이 코드를 하나의 파일로 합쳐 for문을 돌리면, 1분 안에 수십 개의 뉴스 본문을 수집하는 자동화 파이프라인의 기초가 완성됩니다! 혹시 특정 단계(예: GPT 연동 코드)가 더 궁금하신가요?


팁:: 통합 파이썬 코드

1. 자동화 파이프라인 통합 코드

Python
import requests
from bs4 import BeautifulSoup
import time
import pandas as pd

# --- 설정 (발급받은 API 키 입력) ---
CLIENT_ID = "YOUR_NAVER_CLIENT_ID"
CLIENT_SECRET = "YOUR_NAVER_CLIENT_SECRET"

def get_keywords():
    """1단계: 트렌드 키워드 수집 (구글 RSS 예시)"""
    url = "https://trends.google.com/trends/trendingsearches/daily/rss?geo=KR"
    res = requests.get(url)
    soup = BeautifulSoup(res.content, "xml")
    return [item.title.get_text() for item in soup.find_all("item")][:5]

def search_news_links(query):
    """2단계: 키워드별 뉴스 링크 수집 (네이버 API)"""
    url = f"https://openapi.naver.com/v1/search/news.json?query={query}&display=3"
    headers = {"X-Naver-Client-Id": CLIENT_ID, "X-Naver-Client-Secret": CLIENT_SECRET}
    res = requests.get(url, headers=headers)
    return res.json().get('items', []) if res.status_code == 200 else []

def get_full_content(url):
    """3단계: 개별 뉴스 본문 크롤링"""
    try:
        res = requests.get(url, headers={"User-Agent": "Mozilla/5.0"}, timeout=5)
        soup = BeautifulSoup(res.text, "html.parser")
        # 주요 뉴스사의 본문 태그 패턴 (실제 구현 시 사이트별 대응 필요)
        content = soup.find('article') or soup.find('div', id='dic_area') or soup.find('div', id='articleBodyContents')
        return content.get_text(strip=True)[:1000] if content else "본문 추출 실패"
    except:
        return "접속 불가"

# --- 4단계: 전체 프로세스 실행 (For문) ---
def run_pipeline():
    print("🚀 데이터 수집 파이프라인 시작...")
    keywords = get_keywords()
    final_data = []

    for kw in keywords:
        print(f"🔎 키워드 [{kw}] 관련 뉴스 수집 중...")
        news_items = search_news_links(kw)
        
        for item in news_items:
            content = get_full_content(item['link'])
            final_data.append({
                "keyword": kw,
                "title": item['title'].replace("<b>", "").replace("</b>", ""),
                "link": item['link'],
                "content": content
            })
            time.sleep(0.5) # 차단 방지를 위한 간격

    # 5단계: 엑셀 또는 CSV로 저장
    df = pd.DataFrame(final_data)
    df.to_csv("news_dataset.csv", index=False, encoding="utf-8-sig")
    print(f"✅ 총 {len(final_data)}개의 뉴스 수집 완료 및 저장 성공!")

if __name__ == "__main__":
    run_pipeline()
import requests
from bs4 import BeautifulSoup
import time
import pandas as pd
# --- 설정 (발급받은 API 키 입력) ---
CLIENT_ID = "YOUR_NAVER_CLIENT_ID"
CLIENT_SECRET = "YOUR_NAVER_CLIENT_SECRET"
defget_keywords():
 """1단계: 트렌드 키워드 수집 (구글 RSS 예시)"""
 url = "https://trends.google.com/trends/trendingsearches/daily/rss?geo=KR"
 res = requests.get(url)
 soup = BeautifulSoup(res.content, "xml")
 return [item.title.get_text() for item in soup.find_all("item")][:5]
defsearch_news_links(query):
 """2단계: 키워드별 뉴스 링크 수집 (네이버 API)"""
 url = f"https://openapi.naver.com/v1/search/news.json?query={query}&display=3"
 headers = {"X-Naver-Client-Id": CLIENT_ID, "X-Naver-Client-Secret": CLIENT_SECRET}
 res = requests.get(url, headers=headers)
 return res.json().get('items', []) if res.status_code == 200else []
defget_full_content(url):
 """3단계: 개별 뉴스 본문 크롤링"""
 try:
 res = requests.get(url, headers={"User-Agent": "Mozilla/5.0"}, timeout=5)
 soup = BeautifulSoup(res.text, "html.parser")
 # 주요 뉴스사의 본문 태그 패턴 (실제 구현 시 사이트별 대응 필요)
 content = soup.find('article') or soup.find('div', id='dic_area') or soup.find('div', id='articleBodyContents')
 return content.get_text(strip=True)[:1000] if content else"본문 추출 실패"
 except:
 return"접속 불가"
# --- 4단계: 전체 프로세스 실행 (For문) ---
defrun_pipeline():
 print("🚀 데이터 수집 파이프라인 시작...")
 keywords = get_keywords()
 final_data = []
 for kw in keywords:
 print(f"🔎 키워드 [{kw}] 관련 뉴스 수집 중...")
 news_items = search_news_links(kw)
 for item in news_items:
 content = get_full_content(item['link'])
 final_data.append({
 "keyword": kw,
 "title": item['title'].replace("<b>", "").replace("</b>", ""),
 "link": item['link'],
 "content": content
 })
 time.sleep(0.5) # 차단 방지를 위한 간격
 # 5단계: 엑셀 또는 CSV로 저장
 df = pd.DataFrame(final_data)
 df.to_csv("news_dataset.csv", index=False, encoding="utf-8-sig")
 print(f"✅ 총 {len(final_data)}개의 뉴스 수집 완료 및 저장 성공!")
if __name__ == "__main__":
 run_pipeline()

2. 구현 및 실행 절차

통합 코드를 완성한 후, 실제로 동작시키기 위한 절차는 다음과 같습니다.

  1. 환경 구축:

    • Python이 설치된 환경에서 pip install requests beautifulsoup4 pandas lxml 명령어로 라이브러리를 설치합니다.

  2. 네이버 API 키 발급:

    • 네이버 개발자 센터에 접속하여 애플리케이션을 등록하고 Client IDSecret을 발급받아 코드에 넣습니다.

  3. 코드 실행:

    • 작성된 .py 파일을 실행합니다. 프로그램이 검색어 추출부터 본문 수집까지 자동으로 수행합니다.

  4. 데이터 확인:

    • 생성된 news_dataset.csv 파일을 열어 수집된 제목과 본문이 AI 글쓰기의 재료로 적합한지 확인합니다.

  5. LLM 연동 (다음 단계):

    • 이제 이 데이터를 반복문(for) 안에서 OpenAI의 GPT API나 Gemini API에 전달하여 블로그 포스팅용 원고로 변환하는 코드를 추가하면 자동화 공장이 완성됩니다.

⚠️ 주의사항

  • 크롤링 예절:time.sleep()을 반드시 사용하여 서버에 부하를 주지 않도록 하세요.

  • 뉴스 저작권: 수집된 본문을 그대로 게시하는 것은 저작권 위반입니다. 반드시 AI를 통해 완전히 새로운 문장으로 재구성(Rewriting)해야 합니다.