python基礎(chǔ)教程項(xiàng)目四之新聞聚合
《python基礎(chǔ)教程》書中的第四個(gè)練習(xí),新聞聚合。現(xiàn)在很少見的一類應(yīng)用,至少我從來沒有用過,又叫做Usenet。這個(gè)程序的主要功能是用來從指定的來源(這里是Usenet新聞組)收集信息,然后講這些信息保存到指定的目的文件中(這里使用了兩種形式:純文本和html文件)。這個(gè)程序的用處有些類似于現(xiàn)在的博客訂閱工具或者叫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>%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()
這個(gè)程序,首先從整體上進(jìn)行分析,重點(diǎn)部分在于NewsAgent,它的作用是存儲(chǔ)新聞來源,存儲(chǔ)目標(biāo)地址,然后在分別調(diào)用來源服務(wù)器(NNTPSource以及SimpleWebSource)以及寫新聞的類(PlainDestination和HTMLDestination)。所以從這里也看的出,NNTPSource是專門用來獲取新聞服務(wù)器上的信息的,SimpleWebSource是獲取一個(gè)url上的數(shù)據(jù)的。而PlainDestination和HTMLDestination的作用很明顯,前者是用來輸出獲取到的內(nèi)容到終端的,后者是寫數(shù)據(jù)到html文件中的。
有了這些分析,然后在來看主程序中的內(nèi)容,主程序就是來給NewsAgent添加信息源和輸出目的地址的。
這確實(shí)是個(gè)簡(jiǎn)單的程序,不過這個(gè)程序可是用到了分層了。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
將pymysql獲取到的數(shù)據(jù)類型是tuple轉(zhuǎn)化為pandas方式
這篇文章主要介紹了將pymysql獲取到的數(shù)據(jù)類型是tuple轉(zhuǎn)化為pandas方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05Pycharm 如何設(shè)置HTML文件自動(dòng)補(bǔ)全代碼或標(biāo)簽
這篇文章主要介紹了Pycharm 如何設(shè)置HTML文件自動(dòng)補(bǔ)全代碼或標(biāo)簽,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Python 16進(jìn)制與中文相互轉(zhuǎn)換的實(shí)現(xiàn)方法
今天小編就為大家分享一篇Python 16進(jìn)制與中文相互轉(zhuǎn)換的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07用Python實(shí)現(xiàn)的等差數(shù)列方式
這篇文章主要介紹了用Python實(shí)現(xiàn)的等差數(shù)列方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12pandas數(shù)據(jù)清洗實(shí)現(xiàn)刪除的項(xiàng)目實(shí)踐
本文主要介紹了pandas數(shù)據(jù)清洗實(shí)現(xiàn)刪除的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06linux系統(tǒng)下pip升級(jí)報(bào)錯(cuò)的解決方法
這篇文章主要給大家介紹了關(guān)于linux系統(tǒng)下pip升級(jí)報(bào)錯(cuò)的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Python函數(shù)命名空間,作用域LEGB及Global詳析
這篇文章主要介紹了Python函數(shù)命名空間,作用域LEGB及Global詳析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09Python如何通過Flask-Mail發(fā)送電子郵件
這篇文章主要介紹了Python如何通過Flask-Mail發(fā)送電子郵件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01python 將md5轉(zhuǎn)為16字節(jié)的方法
今天小編就為大家分享一篇python 將md5轉(zhuǎn)為16字節(jié)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05