지난번 물류시스템 구축에 이어 오늘은 1시간 안에 뉴스 크롤링? 뉴스 요약시스템? 을 만들어 봤다!
이번에도 Good code, Bad code를 생각하며 실습 시작!
아래는 퍼실님이 제시한 상황! (항상 감사합니다 ㅈㅅ퍼실님!)
혹시 보시는 분이 계시다면 같이 해보셔도 재밌습니당:)!
💡 상황
고객A는 매일 아침 구글 뉴스를 보며 하루를 시작한다.
A씨는 매번 뉴스를 찾는 수고를 덜고싶어, 오늘의 뉴스와 뉴스를 검색하는 기능이 있는 뉴스 요약 시스템을 발주했다. 의뢰를 받은 당신은 해당 System을 CLI으로 구현하여 납품해야 한다.
💡 Feedparser - Python에서 RSS 데이터를 처리할 수 있는 라이브러리
라이브러리 설치 :pip install feedparser
라이브러리 사용 :import feedparser
오늘의 뉴스(Today New), 키워드기반 뉴스 검색, 시스템 종료 기능에 접근할 수 있는 메인 시스템을 CLI으로 구현할 것.
뉴스 사이트에서 제공하는 오늘의 뉴스 데이터를 RSS로 조회 후, 출력하는 시스템을 CLI으로 구현할 것.
사용자가 입력한 키워드로 검색한 뉴스 데이터를 RSS로 조회 후, 출력하는 시스템을 CLI으로 구현할 것.
메인 시스템의 동작을 종료하는 기능을 CLI으로 구현할 것.
url_normal = ('https://news.google.com/rss?hl=ko&gl=KR&ceid=KR:ko')
news_data = feedparser.parse(url_normal)
########## 수정 코드 ###########
news_data = feedparser.parse('https://news.google.com/rss?hl=ko&gl=KR&ceid=KR:ko')
try
- except
사랑해여...S2...num_news
, news_data
, print_news
는 오늘의 뉴스나 키워드 뉴스 동일하게 사용하는 부분이다. 이걸 __init__
으로 넣고 함수화함으로 확실히 짧아지고 간결해진 것을 느꼈다. 앞으로도 추상화로 중복 없이 간결한 코드를 짜도록 노력하자!def 함수명(self, 변수명)
으로 주어질 값을 미리 넣어주면 됨import feedparser
class NewsSystem():
def __init__(self):
self.num_news = 2
self.news_data = None
def print_news(self):
try:
for i in range(self.num_news):
news = self.news_data.entries[i]
print("제목 : ", news.title)
print("링크 : ", news.link,'\n')
except:
print('해당 키워드의 뉴스가 없습니다. 다시 입력해주세요!')
return self.topic_news()
def today_news(self):
self.news_data = feedparser.parse('https://news.google.com/rss?hl=ko&gl=KR&ceid=KR:ko')
self.print_news(self.news_data)
def topic_news(self):
topic = str(input('뉴스 키워드를 입력해주세요 : '))
self.news_data = feedparser.parse(f'https://news.google.com/rss/search?q={topic}&hl=ko&gl=KR&ceid=KR%3Ako')
self.print_news(self.news_data)
def shutdown(self):
print('시스템을 종료합니다.')
return exit()
def print_main_message():
print('\n','==' * 20)
print('뉴스 요약 메인 시스템에 접속하셨습니다:)!')
print('[1] 오늘의 주요 뉴스 [2] 키워드 검색 [3] 시스템 종료')
def main():
news_manager = NewsSystem()
while(1):
print_main_message()
try:
select_num = int(input("실행 번호 : "))
except:
print('숫자를 입력해주세요!')
continue
if (select_num == 1):
news_manager.today_news()
elif (select_num == 2):
news_manager.topic_news()
elif (select_num ==3):
news_manager.shutdown()
else:
print('상기 숫자를 입력해주세요:)! ')
continue
if __name__ == "__main__":
main()