所谓的新闻聚合就是搜集新闻信息吧,其中需要从nntplib模块来导入NNTP服务器,搜了几个免费NNTP服务器还是没效果,还需要urllib模块,我想之后的网络爬虫会用到这个来下载源代码资源,还需要re模块,里面的正则表达式真正的太有压力了。
正则得看看,先看code:
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 seld.distinations:
dest.receiveItems(items)
class NewsItem:
"""
包括标题和主题文本的简单新闻项目
"""
def __init__(self,title,body):
self.title=title
self.body=body
class NNTPSource:
"""
从NNTP组中获取新闻项目的新闻来源
"""
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,datahour)[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 mssage.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.finall(text)
bodies=self.bodyPattern.finall(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:
"""
将所有新闻项目格斯会话为HTML的目标类
"""
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</h1>
"""
print >>out,'<u1>'
id=0
for item in items:
id+=1
print >>out,'<li><a href="#%i">%s</a></li>'%(id,item.title)
print >>out,'</u1>'
id=0
for item in items:
id+=1
print >>out,'<h2><a name="%i">%s</a></h2>'%(id,item.title)
print >>out,'<pre>%</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="[^"]*">\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 = 'neontetra.realize.com'
clpa_group = 'comp.lang.python.announce'
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()
先调用runDefaultSetup()来获取新闻来源,先后生成类NewsAgent和SimpleWebSource的实例,获取新闻的来源,其中 类SimpleWebSource实现了下载新闻资源的功能,title和bodies经过zip()变成元组列表。Agent.addSource()把来源放到目标对象source列表中。NNTPSource用于从NNTP组中获取新闻项目的来源,并且可以指定time,PlianDestination会输出手机的新闻资源,HTMLDestination会生成html页面.不会正则表达式是真的看不懂怎么匹配需要搜集的资源的。