先上代码,然后再来逐一分析:
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>%s</pre>' % item.body print >> out, ''' </body> </html> ''' def rundefaultsetup(): agent = newsagent() bbc_url = 'http://news.bbc.co.uk/text_only.stm' bbc_title = r'(?s)a href=[^ rel=external nofollow ]*>\s*<b>\s*(.*?)\s*</b>' bbc_body = r'(?s)</a>\s*<br/>\s*(.*?)\s*<' bbc = simplewebsource(bbc_url, bbc_title, bbc_body) agent.addsource(bbc) clpa_server = 'news2.neva.ru' clpa_group = 'alt.sex.telephone' clpa_window = 1 clpa = nntpsource(clpa_server,clpa_group,clpa_window) agent.addsource(clpa) agent.adddestination(plaindestination()) agent.adddestination(htmldestination('news.html')) agent.distribute() if name == 'main': rundefaultsetup()
这个程序,首先从整体上进行分析,重点部分在于newsagent,它的作用是存储新闻来源,存储目标地址,然后在分别调用来源服务器(nntpsource以及simplewebsource)以及写新闻的类(plaindestination和htmldestination)。所以从这里也看的出,nntpsource是专门用来获取新闻服务器上的信息的,simplewebsource是获取一个url上的数据的。而plaindestination和htmldestination的作用很明显,前者是用来输出获取到的内容到终端的,后者是写数据到html文件中的。
有了这些分析,然后在来看主程序中的内容,主程序就是来给newsagent添加信息源和输出目的地址的。
这确实是个简单的程序,不过这个程序可是用到了分层了。
相信看了本文案例你已经掌握了方法,更多精彩请关注其它相关文章!
推荐阅读:
配置opencv3+python3的方法
python3+opencv的配置教程
以上就是python做出新闻聚合项目的详细内容。
