项目4:新闻聚合

                      

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









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值