[FastAPI/Crawling] 네이버 뉴스 API를 활용해 야구 뉴스 데이터 수집하기

2024. 6. 24. 18:01·Minding's Programming/FastAPI
728x90
반응형

토이 프로젝트로 야구장 관련 홈페이지를 만들고 있는데, KBO 야구장을 소개하는 것이다보니 해당 뉴스를 함께 노출할 수 있었으면 좋겠다는 생각에 야구 뉴스만을 수집하는 크롤러를 제작해보았다.

 

실시간으로 뉴스 업데이트를 해주는 것이 목표이기 때문에, 기본적으로 비동기적 실행이 가능하도록 제작했다.

 

우선 '야구'라는 키워드를 가진 뉴스를 모두 수집한 다음 link라는 칼럼(네이버 뉴스 상의 하이퍼링크)에서 'kbaseball'이라는 키워드가 포함된 것만 DB에 저장할 리스트에 추가하는 방식으로 설계했다.

 

import aiohttp
import asyncio
from config import get_secret


class NaverNewsScraper:

    NAVER_API_NEWS = "https://openapi.naver.com/v1/search/news.json"
    # API ID와 PW은 자신의 것을 직접 입력하면 된다.
    NAVER_API_ID = get_secret("NAVER_API_ID")
    NAVER_API_SECRET = get_secret("NAVER_API_SECRET")

	# session을 열어 json으로 리턴되는 값 중 ['items']칼럼에 해당하는 값만 돌려받는다.
    @staticmethod
    async def fetch(session, url, headers):
        async with session.get(url, headers=headers) as response:
            if response.status == 200:
                result = await response.json()
                return result["items"]

	# start(시작할 부분), display(한 번에 수집(노출)할 개수)를 설정해준다.
    def unit_url(self, keyword, start):
        return {
            "url": f"{self.NAVER_API_NEWS}?query={keyword}&display=10&start={start}",
            "headers": {
                "X-Naver-Client-Id": self.NAVER_API_ID,
                "X-Naver-Client-Secret": self.NAVER_API_SECRET,
            },
        }

    async def search(self, keyword, total_page):
        # 스크래핑할 url apis list에 입력
        apis = [self.unit_url(keyword, 1 + i * 10) for i in range(total_page)]
        # 데이터를 수집하는 부분
        async with aiohttp.ClientSession() as session:
            all_data = await asyncio.gather(
                *[NaverNewsScraper.fetch(session, api["url"], api["headers"]) for api in apis]
            )
            # DB에 input하기 좋은 형식으로 수정해준다.
            result = []
            for data in all_data:
                if data is not None:
                    for news in data:
                    	# link 내 'kbaseball'이라는 문자열이 포함될 때만 DB에 저장할 뉴스 리스트에 추가
                        if 'kbaseball' in news['link']:
                            result.append(news)
                        else:
                            pass
            return result

    def run(self, keyword, total_page):
        return asyncio.run(self.search(keyword, total_page))

# 이 부분은 해당 파일만 실행하여 테스트할 목적이다.
if __name__ == "__main__":
    scraper = NaverNewsScraper()
    results = scraper.run("야구", 3)
    print(results)
728x90

'Minding's Programming > FastAPI' 카테고리의 다른 글

[FastAPI] HTTP 메소드 요청을 처리하는 데코레이터 정리  (0) 2024.07.09
[FastAPI/AWS/Uvicorn] AWS에 프로젝트 배포하기  (0) 2024.06.20
[FastAPI] 파이썬 멀티 프로세싱  (0) 2024.04.03
[FastAPI] 파이썬 멀티 스레딩 사용해보기  (0) 2024.04.01
[FastAPI] 동시성과 병렬성 개념 정리  (0) 2024.03.31
'Minding's Programming/FastAPI' 카테고리의 다른 글
  • [FastAPI] HTTP 메소드 요청을 처리하는 데코레이터 정리
  • [FastAPI/AWS/Uvicorn] AWS에 프로젝트 배포하기
  • [FastAPI] 파이썬 멀티 프로세싱
  • [FastAPI] 파이썬 멀티 스레딩 사용해보기
Minding
Minding
  • Minding
    Today's Minding
    Minding
  • 전체
    오늘
    어제
    • 울고넘는 딥러닝 (278)
      • Minding's Baseball (57)
        • MLB Statcast (29)
        • 머신러닝으로 홈런왕 예측하기 (3)
        • 야구칼럼 (12)
        • 야구 규칙, 용어 (1)
        • 2022-23 질롱 코리아 (8)
        • 류현진 등판경기 (4)
      • Minding's Programming (185)
        • 프로그래머스 코딩테스트 (21)
        • Knowledge (44)
        • Numpy & Pandas (6)
        • Excel (3)
        • Git (1)
        • Pygame (11)
        • CV (3)
        • Tensorflow tutorial (4)
        • Kaggle and Dacon (4)
        • 에러 코드 (8)
        • FastAPI (8)
        • Airflow (29)
        • Crawling (6)
        • Django (14)
        • AWS (18)
        • Spark (5)
      • Minding's Reading (30)
        • 머신러닝 딥러닝에 필요한 기초 수학 with 파이.. (2)
        • 칼만필터는 어렵지 않아 (11)
        • 밑바닥부터 시작하는 딥러닝 (6)
        • 메이저리그 야구 통계학 2e (8)
        • 논문읽기 (2)
        • 빅데이터를 지탱하는 기술 (1)
      • Minding's Life (5)
        • 주식 (4)
        • 각종 소식 (1)
  • 블로그 메뉴

    • 홈
    • Baseball
    • Programming
    • Reading
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    django
    Airflow
    칼만필터는어렵지않아python
    KBO
    야구
    칼만필터는어렵지않아파이썬
    넘파이
    프로그래머스
    코딩테스트
    MLB
    딥러닝
    pygame
    에어플로우
    파이썬
    게임개발
    칼만필터는어렵지않아
    파이썬게임개발
    파이게임
    데이터 엔지니어
    머신러닝
    데이터분석
    mlb stats api
    칼만필터
    django python
    메이저리그
    Python
    KalmanFilter
    질롱코리아
    AWS
    FastAPI
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Minding
[FastAPI/Crawling] 네이버 뉴스 API를 활용해 야구 뉴스 데이터 수집하기
상단으로

티스토리툴바