这篇文章主要为大家详细介绍了python基础教程项目四之新闻聚合,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
《python基础教程》书中的第四个练习,新闻聚合。现在很少见的一类应用,至少我从来没有用过,又叫做usenet。这个程序的主要功能是用来从指定的来源(这里是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>%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添加信息源和输出目的地址的。
这确实是个简单的程序,不过这个程序可是用到了分层了。
以上就是python基础教程项目四之新闻聚合的详细内容。