| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- khaiii
- Anaconda
- github markdown
- 자바파이썬
- 카우치코딩 #couchcoding #6주포트폴리오 #6주협업프로젝트
- github
- Technical Writing
- expression statement is not assignment or call html
- Machine Learning
- 파이썬
- address
- taskkill
- Morphological analysis #Corpus
- 비동기
- 코딩온라인
- SSR
- 마크다운
- 서버사이드렌더링
- 출처: 자바의 신 8장
- 카우치코딩 #couchcoding #6주포트폴리오 #6주협업프로젝트v
- 모바일웹스킨
- PID
- 클라이언트사이드렌더링
- gitbash
- 필사
- terminate
- Kakao
- 플젝후체크
- #스파르타코딩클럽후기 #내일배움캠프후기
- 파이콘
- Today
- Total
개발 일기
파이썬으로 뉴스 피드 수집하기 본문
개요
최근 미국 주식을 조금씩 투자하면서, 세계 경제에 대해 관심을 갖게 되었다. 어느 때보다도 미국이 세계 경제의 중심에 서있고 트럼프의 정책 방향에 주가가 주도되는 것을 보고 있다. 경기의 흐름을 정확히 예측할 수는 없겠지만, 적어도 시장의 흐름을 이해는 하고 싶었다.슈카월드나, 언론사 공식 채널들이 매우 유용하지만, 나는 영상을 보는 것보다는 핵심 뉴스만 3분 안에 읽는 것을 선호한다그래서 파이썬으로 주요 매체 뉴스 피드를 크롤링하는 프로젝트를 만들게 되었다.
매일 관심 키워드를 주제로 뉴스를 구독하고, 신뢰할 만한 다양한 매체 (+ 정치 성향이 다양한) 에서 타이틀과 요약 중심으로 빠르게 훑는 사이트다.
기술 선택 (초기 셋업 단계여서 계속 추가 예정)
1. 메인 언어 - Python : 크롤링에 적합 하기도 하고, 해당 코드는 저장/조회가 복잡하거나 엔티티가 많은 주제가 아니어서, Python 으로 간결하게 짜는 게 효율적이라고 생각했다. 지난 2년 반동안 주로 자바/코틀린만 해왔기 때문에, 파이썬으로 애플리케이션을 만들어보고 싶은 개인적인 바람도 있었다.
Fast API 프레임워크와 SQL Alchemy 를 함께 사용했다.
2. Airflow - 선택한 주기에 맞게 Crawl
- 단순한 스케줄링으로는 Spring Scheduler로도 충분하다. 현업에서 많이 썼기 때문에 러닝 커브도 없었다.
- 하지만 버전 관리, DAG 모니터링, UI 추적, 재실행/알림 등 더 정교한 기능을 제공하기에, Airflow를 선택했다 medium.com+14
3. Docker
기능 구현
프로젝트는 짧게 아래 사이클을 마무리하고, 추가 기능을 만들것이다.
1. 프로젝트는 도커 세팅 (readme.md 참고)
2. RSS 파서 구현
3. 저장/조회 API 구현
4. 프론트 구현
5. 인프라 구축 및 운영 배포
나는 스프링, 자바 만을 경험했다보니 그러한 관점에서 파이썬이 새롭게 느껴지는 부분을 자주 언급할 것 같다.
이번 포스팅에서는 docker-compose.yml 파일 등 환경 세팅에 대해 짧게 소개해보겠다.
환경 세팅
먼저 docker 세팅은 read.me 를 참고하자.
1. postgres 서비스에서
volumes 에 두 라인이 있다. 첫번째 라인은 컨테이너 최초 기동 시 1회 작동하며, 도커 postgres 가 참고해서 테이블을 생성하기 위함이다. 도커 컨테이너는 종료 시, 데이터 백업을 위해서 'postgres-db-volume:/var/lib/postgresql/data' 와 같은 설정이 필수다.
services:
postgres:
image: postgres:13
container_name: rss_postgres
environment:
POSTGRES_USER: rssuser
POSTGRES_PASSWORD: rsspass
POSTGRES_DB: rss
ports:
- "5432:5432"
volumes:
- ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
- postgres-db-volume:/var/lib/postgresql/data
rss_api:
image: apache/airflow:2.7.2
container_name: rss_api
environment:
AIRFLOW__CORE__EXECUTOR: LocalExecutor
AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres:5432/airflow
AIRFLOW__CORE__FERNET_KEY: ''
AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: 'false'
AIRFLOW__CORE__LOAD_EXAMPLES: 'false'
depends_on:
- postgres
volumes:
- ./dags:/opt/airflow/dags
- ./logs:/opt/airflow/logs
command: webserver
ports:
- "8080:8080"
env_file:
- .env
airflow-scheduler:
image: apache/airflow:2.7.2
container_name: rss_scheduler
depends_on:
- postgres
volumes:
- ./dags:/opt/airflow/dags
- ./logs:/opt/airflow/logs
command: scheduler
pgadmin:
image: dpage/pgadmin4
container_name: pgadmin
restart: always
environment:
PGADMIN_DEFAULT_EMAIL: admin@example.com
PGADMIN_DEFAULT_PASSWORD: admin123
ports:
- "5050:80"
depends_on:
- postgres
volumes:
postgres-db-volume:
env 파일은 spring 의 application.yml 처럼 DB 정보를 기입한다.
ENV=local
DB_USER=rssuser
DB_PASSWD=1234
DB_HOST=postgres
DB_PORT=5432
DB_NAME=db
load_dotenv()는 호스트 머신 기준이다. env 파일이 컨테이너 내부 경로에 존재해야, env 파일의 내용을 자동으로 컨테이너 환경 변수로 전달할 수 있다.
import os
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker
from sqlalchemy.orm import DeclarativeBase
from dotenv import load_dotenv
load_dotenv() # .env 파일 불러오기
user = os.getenv("DB_USER")
passwd = os.getenv("DB_PASSWD")
host = os.getenv("DB_HOST")
port = os.getenv("DB_PORT")
db = os.getenv("DB_NAME")
DATABASE_URL = f"postgresql://{user}:{passwd}@{host}:{port}/{db}"
class Base(DeclarativeBase):
pass
db.py
컨테이너에 잘 등록되었는지 확인하려면, 아래 명령어로 확인해보자.

코드는 아래에서 확인할 수 있다.
https://github.com/jieun-dev1/rss