辽宁快乐12截止时间:the5fire的技术博客

彩票开奖查询 www.8a72.cn 关注Python、Django、Vim、Linux、Web开发、团队管理和互联网--Life is short, we need Python.


python项目练习四:新闻聚合

作者:the5fire | 标签:   | 发布:2011-12-26 10:07 p.m. | 阅读量: 38591, 37529

书中的第四个练习,新闻聚合。现在很少见的一类应用,至少我从来没有用过,又叫做Usenet。这个程序的主要功能是用来从指定的来源(这里是Usenet新闻组)收集信息,然后讲这些信息保存到指定的目的文件中(这里使用了两种形式:纯文本和html文件)。这个程序的用处有些类似于现在的博客订阅工具或者叫RSS订阅器。

先上代码,然后再来逐一分析:

fromnntplibimportNNTPfromtimeimportstrftime,time,localtimefromemailimportmessage_from_stringfromurllibimporturlopenimporttextwrapimportreday=24*60*60defwrap(string,max=70):'''

        '''return'\n'.join(textwrap.wrap(string))+'\n'classNewsAgent:'''
        '''def__init__(self):self.sources=[]self.destinations=[]defaddSource(self,source):self.sources.append(source)defaddDestination(self,dest):self.destinations.append(dest)defdistribute(self):items=[]forsourceinself.sources:items.extend(source.getItems())fordestinself.destinations:dest.receiveItems(items)classNewsItem:def__init__(self,title,body):self.title=titleself.body=bodyclassNNTPSource:def__init__(self,servername,group,window):self.servername=servernameself.group=groupself.window=windowdefgetItems(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]foridinids:lines=server.article(id)[3]message=message_from_string('\n'.join(lines))title=message['subject']body=message.get_payload()ifmessage.is_multipart():body=body[0]yieldNewsItem(title,body)server.quit()classSimpleWebSource:def__init__(self,url,titlePattern,bodyPattern):self.url=urlself.titlePattern=re.compile(titlePattern)self.bodyPattern=re.compile(bodyPattern)defgetItems(self):text=urlopen(self.url).read()titles=self.titlePattern.findall(text)bodies=self.bodyPattern.findall(text)fortitle.bodyinzip(titles,bodies):yieldNewsItem(title,wrap(body))classPlainDestination:defreceiveItems(self,items):foriteminitems:printitem.titleprint'-'*len(item.title)printitem.bodyclassHTMLDestination:def__init__(self,filename):self.filename=filenamedefreceiveItems(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=0foriteminitems:id+=1print>>out,'<li><a href="#">%s</a></li>'%(id,item.title)print>>out,'</ul>'id=0foriteminitems:id+=1print>>out,'<h2><a name="%i">%s</a></h2>'%(id,item.title)print>>out,'<pre>%s</pre>'%item.bodyprint>>out,'''
                </body>
                </html>
                '''defrunDefaultSetup():agent=NewsAgent()bbc_url='//news.bbc.co.uk/text_only.stm'bbc_title=r'(?s)a href="[^"]*">\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=1clpa=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添加信息源和输出目的地址的。

这确实是个简单的程序,不过这个程序可是用到了分层了。

2017-05-15更新:

//the5fireblog.b0.upaiyun.com/staticfile/django-tech-end-article.png
- from www.8a72.cn
----EOF-----

微信公众号:Python程序员杂谈

预售优惠价截止到7月8日23点59分。


其他分类:
  • 女子谎称刷单提成骗贫困大学生16万 用于买化妆品 2018-12-01
  • 西安体育学院体育传媒系与西部网签约校媒合作 2018-12-01
  • 网络投票刷礼物能不能帮孩子“争上游”? 2018-11-28
  • 中共山西省委组织部公示 2018-11-28
  • 【北京天气】最新北京今天天气,实时提供北京气温、空气质量、24小时天气预报、生活指数查询 2018-11-24
  • 格局生变 内容产业未来何去何从 2018-08-18
  • 土地不是劳动成果,而是一种自然资源,就像空气、阳光不是劳动成果而是自然资源一样,所以土地不具有价值,买房只应支付房屋费,不应该支付土地费。 2018-08-14
  • 安全生产月:铁路安全宣传走进车站 2018-08-02
  • 带动乡亲干 各自有实招——三位农村社区党组织书记的故事 2018-08-02
  • 长江中下游正式“入梅”!中东部高温降雨齐上阵 湖北中北部有大到暴雨 2018-07-31
  • 2018年4月27日划拨国家社科基金项目鉴定费名单(2) 2018-07-31
  • [微笑]未来的社会,必然是按需(基本需求)分配+按劳(劳动价值或劳动能力)分配相联合的混合分配方式。 2018-07-30
  • “一带一路”建设工作座谈会 2018-07-30
  • 只要等一等就能多“等”出8600万美元! 2018-07-29
  • 2017年秋季学期学员第十三支部风采 2018-07-18
  • 718| 579| 210| 552| 416| 90| 992| 575| 142| 76|