所谓的新闻聚合就是搜集新闻信息吧,其中需要从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页面.不会正则表达式是真的看不懂怎么匹配需要搜集的资源的。