목적과 배경
뉴스는 사회를 읽는 창입니다. 특히 저녁 시간대에 방송되는 주요 종합뉴스 프로그램은 각 방송사마다 다루는 이슈와 시각이 뚜렷하게 드러나는 대표적인 콘텐츠입니다.
목표: KBS, MBC, SBS, JTBC, TV조선, 채널A 6개 방송사의 저녁 메인뉴스 프로그램에서 다룬 뉴스 제목과 기사 링크를 자동으로 수집하고, 이를 PostgreSQL에 저장한 뒤 정치 이슈 및 주제별 편향성을 분석하는 시스템을 만드는 것입니다.
이 작업은 단순한 크롤링이 아닌, 프론트엔드의 다양한 렌더링 방식, 비동기 콘텐츠 로딩, 자바스크립트로 조작되는 UI 등을 고려해야 했던 도전적인 여정이었습니다.
🛠️ 수행한 작업 요약
- Selenium + BeautifulSoup 기반 크롤러 구현
- 6개 방송사별 HTML 구조 및 렌더링 방식 분석
- 날짜별 기사 목록 수집
- 중복 저장 방지 및 PostgreSQL 연동
WebDriverWait
을 도입하여 불안정한 수집 이슈 개선
🖥️ 방송사별 파싱 로직 및 난이도
방송사 | 주요 프로그램 | 로딩 방식 | 구현 난이도 요약 | 난이도 (1~5) |
---|---|---|---|---|
MBC | 뉴스데스크 | .js 기반 정적 HTML | .js 파일에서 날짜별 URL 추출 필요 | ⭐⭐ |
KBS | 뉴스9 | JS 렌더링, 동적 anchor 생성 | WebDriverWait 필수 | ⭐⭐⭐⭐ |
SBS | 8뉴스 | 정적 HTML | 메타태그에서 정보 추출 필요 | ⭐⭐ |
JTBC | 뉴스룸 | SPA 구조, 더보기 버튼 반복 | 동적 로딩 반복 처리 | ⭐⭐⭐⭐ |
TV조선 | 뉴스9/뉴스7 | 공식 API 제공 | catid (평일/주말) 주의 | ⭐ |
채널A | 뉴스A | JS 달력 조작 기반 | 달력 JS 객체 수동 조작 필요 | ⭐⭐⭐⭐ |
⚠️ 구현 시 주의사항 요약
- 페이지 로딩 대기:
time.sleep()
대신WebDriverWait
사용 권장 - 중복 기사 저장 방지: URL 기준
ON CONFLICT DO NOTHING
처리 - 달력 JS 제어: 채널A의 경우 내부 JS 객체(now) 수정 및 JS 함수 호출 필요
- 공식 API 활용: TV조선처럼 API가 제공되면 최우선 활용
🔄 현재 시스템 구조 요약
- 방송사별로 기사 목록을 가져오는
get_articles(broadcaster, date)
통합 함수 구현 - 기사 제목, URL, 날짜, 순서, 방송사 정보를 포함한 DataFrame 생성
- PostgreSQL 테이블
articles
에 중복 없이 삽입 .env
파일로 DB 접속정보 보호tqdm
을 통한 수집 진행 상태 시각화
📅 앞으로의 마일스톤
- [✔ 완료] 방송사별 기사 제목/링크 수집
- [🛠 진행 중] 기사 본문, 기자 이름 수집 기능 추가
- [🔁 예정] Ollama 기반 기사 요약/키워드 자동 추출
- [📊 예정] 방송사별 키워드 통계 분석 및 시각화
- [📆 장기 목표] 뉴스 편향성 분석 및 월별 리포트 자동화
💬 마무리하며
이번 프로젝트는 단순한 웹 크롤링을 넘어, 방송사마다 상이한 웹페이지 구조와 자바스크립트 기반 렌더링, 동적 콘텐츠 제어를 직접 제어하면서 수집 시스템을 구축해본 의미 있는 경험이었습니다.
다음 단계에서는 이 데이터를 기반으로 한 LLM 요약, 키워드 추출, 그리고 정치적 프레이밍 분석까지 도전할 예정입니다. 앞으로도 기술적 여정과 그 결과들을 공유드릴게요.
답글 남기기