Python urllib로 RSS 7일 필터링 후 JSON 저장하는 법

RSS 피드를 수동으로 확인하다 보면 오래된 글과 최신 글이 뒤섞여 있어 정작 필요한 정보를 걸러내는 데 시간이 걸립니다. Python urllib로 RSS를 fetch하고 7일 이내 항목만 JSON으로 저장하면 이 과정을 자동화할 수 있습니다. 외부 라이브러리 없이 표준 라이브러리만으로도 충분히 구현 가능합니다.

Python urllib로 RSS를 fetch하는 기본 구조

Python urllib RSS 7일 필터 JSON 저장

Python 표준 라이브러리인 urllib.request는 별도 설치 없이 HTTP 요청을 처리합니다. RSS 피드는 XML 형식으로 응답이 오기 때문에 xml.etree.ElementTree로 파싱합니다.

기본 fetch 흐름은 다음과 같습니다.

import urllib.request
import xml.etree.ElementTree as ET

url = "https://example.com/rss"
with urllib.request.urlopen(url) as response:
    raw = response.read()

tree = ET.fromstring(raw)

urlopen()은 응답 객체를 반환하며, read()로 바이트 데이터를 가져옵니다. ET.fromstring()은 바이트 데이터를 XML 트리로 변환합니다. 이 구조가 이후 필터링과 저장의 기반이 됩니다.

RSS 피드에 따라 네임스페이스(namespace)가 붙어 있는 경우가 있습니다. 예를 들어 {http://www.w3.org/2005/Atom} 같은 형태입니다. 이 경우 태그 이름 앞에 네임스페이스를 함께 명시해야 항목을 정확히 찾을 수 있습니다.

urllib로 RSS를 fetch하고 XML 파싱까지 이어지는 기본 흐름

7일 이내 항목만 필터링하는 방법

RSS의 각 <item>에는 <pubDate> 필드가 포함됩니다. 이 값을 Python의 datetime으로 변환한 뒤 현재 시각과 비교하면 7일 필터를 적용할 수 있습니다.

pubDate는 보통 RFC 2822 형식으로 기록됩니다. 예: Mon, 12 May 2025 09:00:00 +0000

from datetime import datetime, timedelta, timezone
from email.utils import parsedate_to_datetime

now = datetime.now(timezone.utc)
cutoff = now - timedelta(days=7)

items = []
for item in tree.iter("item"):
    pub = item.findtext("pubDate")
    if not pub:
        continue
    pub_dt = parsedate_to_datetime(pub)
    if pub_dt >= cutoff:
        items.append(item)

parsedate_to_datetime()email.utils 모듈에 포함된 함수로, RFC 2822 날짜 문자열을 datetime 객체로 변환합니다. 별도 설치가 필요 없습니다.

주의할 점은 timezone입니다. pubDate에 timezone 정보가 포함되어 있으면 parsedate_to_datetime()이 자동으로 처리합니다. 그러나 timezone 정보가 없는 피드라면 비교 시 timezone.utc 기준을 맞춰줘야 오류가 발생하지 않습니다.

필터링된 항목을 JSON으로 저장하는 방법

필터링된 항목에서 제목, 링크, 발행일을 추출하고 json 모듈로 저장합니다.

import json

results = []
for item in items:
    results.append({
        "title": item.findtext("title"),
        "link": item.findtext("link"),
        "pubDate": item.findtext("pubDate")
    })

with open("rss_filtered.json", "w", encoding="utf-8") as f:
    json.dump(results, f, ensure_ascii=False, indent=2)

ensure_ascii=False는 한글이 유니코드 이스케이프 없이 그대로 저장되도록 합니다. indent=2는 사람이 읽기 쉬운 형태로 들여쓰기를 적용합니다.

저장 결과 파일(rss_filtered.json)은 실행 위치와 같은 디렉터리에 생성됩니다. 경로를 변경하려면 open()의 첫 번째 인자에 절대 경로 또는 상대 경로를 지정하면 됩니다.

필터링 후 JSON으로 저장된 항목 구조 예시

전체 코드와 실행 흐름 정리

각 단계를 합치면 아래와 같은 완성 코드가 됩니다.

import urllib.request
import xml.etree.ElementTree as ET
import json
from datetime import datetime, timedelta, timezone
from email.utils import parsedate_to_datetime

RSS_URL = "https://example.com/rss"
OUTPUT_FILE = "rss_filtered.json"
DAYS = 7

# 1. fetch
with urllib.request.urlopen(RSS_URL) as response:
    raw = response.read()

# 2. parse
tree = ET.fromstring(raw)

# 3. 7일 필터
now = datetime.now(timezone.utc)
cutoff = now - timedelta(days=DAYS)

results = []
for item in tree.iter("item"):
    pub = item.findtext("pubDate")
    if not pub:
        continue
    try:
        pub_dt = parsedate_to_datetime(pub)
        if pub_dt >= cutoff:
            results.append({
                "title": item.findtext("title"),
                "link": item.findtext("link"),
                "pubDate": pub
            })
    except Exception:
        continue

# 4. JSON 저장
with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
    json.dump(results, f, ensure_ascii=False, indent=2)

print(f"{len(results)}개 항목 저장 완료 → {OUTPUT_FILE}")

실행하면 터미널에 저장된 항목 수가 출력됩니다. 예: 3개 항목 저장 완료 → rss_filtered.json

try/except로 날짜 파싱 오류를 처리한 부분은 필드가 비어 있거나 형식이 다른 피드에서 전체 스크립트가 중단되지 않도록 방어합니다.

단계 사용 모듈 역할
fetch urllib.request RSS URL에서 데이터 수신
파싱 xml.etree.ElementTree XML → 트리 구조 변환
날짜 필터 datetime, email.utils 7일 이내 항목만 추출
저장 json .json 파일로 출력

자주 묻는 질문(FAQ)

Q1. requests 라이브러리 없이도 됩니까?
됩니다. urllib.request는 Python 표준 라이브러리에 포함되어 있어 별도 설치가 필요 없습니다. HTTPS 피드도 기본적으로 지원합니다. 다만 SSL 인증서 오류가 발생하는 경우 ssl.create_default_context()를 활용한 context 설정이 필요합니다.

Q2. Atom 형식 피드에서는 태그명이 달라 작동하지 않습니다.
Atom 피드는 <item> 대신 <entry>, <pubDate> 대신 <updated> 또는 <published>를 사용합니다. 피드 형식을 먼저 확인한 뒤 tree.iter()findtext()의 태그명을 맞게 수정하면 동일한 구조로 동작합니다.

Q3. 저장 파일을 매일 자동으로 실행하려면 어떻게 합니까?
Linux/macOS 환경에서는 cron, Windows 환경에서는 작업 스케줄러를 사용하면 일정 시간마다 스크립트를 자동 실행할 수 있습니다. Python 공식 문서에서 urllib.request 전체 레퍼런스를 확인할 수 있습니다.

cron으로 스크립트를 주기 실행하는 흐름

표준 라이브러리 4개만으로 RSS fetch, 7일 필터, JSON 저장까지 완성됩니다. 구조가 단순한 만큼 피드 URL과 저장 경로만 바꾸면 다른 소스에도 그대로 적용할 수 있습니다.

썸네일: JustDataPlease on Unsplash

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤