이 기사는 Python 기본 튜토리얼 프로젝트의 네 번째 부분에 대한 뉴스 집계를 주로 소개합니다. 관심 있는 친구는 "파이썬 기본 튜토리얼" 책의 네 번째 연습인 뉴스를 참조할 수 있습니다. 요즘에는 보기 드문, 적어도 나는 한 번도 사용해 본 적이 없는 응용 프로그램 유형을 유즈넷(Usenet)이라고도 합니다. 이 프로그램의 주요 기능은 지정된 소스(여기서는 유즈넷 뉴스그룹)에서 정보를 수집한 다음 이 정보를 지정된 대상 파일에 저장하는 것입니다(여기에서는 일반 텍스트와 html 파일의 두 가지 형식이 사용됨). 이 프로그램의 사용은 현재의 블로그 구독 도구 또는 RSS 구독자와 다소 유사합니다.
먼저 코드부터 시작한 다음 하나씩 분석해 보겠습니다.
from nntplib import NNTP from time import strftime,time,localtime from email import message_from_string from urllib import urlopen import textwrap import re day = 24*60*60 def wrap(string,max=70): ''' ''' return '\n'.join(textwrap.wrap(string)) + '\n' class NewsAgent: ''' ''' def __init__(self): self.sources = [] self.destinations = [] def addSource(self,source): self.sources.append(source) def addDestination(self,dest): self.destinations.append(dest) def distribute(self): items = [] for source in self.sources: items.extend(source.getItems()) for dest in self.destinations: dest.receiveItems(items) class NewsItem: def __init__(self,title,body): self.title = title self.body = body class NNTPSource: def __init__(self,servername,group,window): self.servername = servername self.group = group self.window = window def getItems(self): start = localtime(time() - self.window*day) date = strftime('%y%m%d',start) hour = strftime('%H%M%S',start) server = NNTP(self.servername) ids = server.newnews(self.group,date,hour)[1] for id in ids: lines = server.article(id)[3] message = message_from_string('\n'.join(lines)) title = message['subject'] body = message.get_payload() if message.is_multipart(): body = body[0] yield NewsItem(title,body) server.quit() class SimpleWebSource: def __init__(self,url,titlePattern,bodyPattern): self.url = url self.titlePattern = re.compile(titlePattern) self.bodyPattern = re.compile(bodyPattern) def getItems(self): text = urlopen(self.url).read() titles = self.titlePattern.findall(text) bodies = self.bodyPattern.findall(text) for title.body in zip(titles,bodies): yield NewsItem(title,wrap(body)) class PlainDestination: def receiveItems(self,items): for item in items: print item.title print '-'*len(item.title) print item.body class HTMLDestination: def __init__(self,filename): self.filename = filename def receiveItems(self,items): out = open(self.filename,'w') print >> out,''' <html> <head> <title>Today's News</title> </head> <body> <h1>Today's News</hi> ''' print >> out, '<ul>' id = 0 for item in items: id += 1 print >> out, '<li><a href="#" rel="external nofollow" >%s</a></li>' % (id,item.title) print >> out, '</ul>' id = 0 for item in items: id += 1 print >> out, '<h2><a name="%i">%s</a></h2>' % (id,item.title) print >> out, '<pre class="brush:php;toolbar:false">%s' % item.body print >> out, '''