python基础教程项目四之新闻聚合


Posted in Python onApril 02, 2018

《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 相关文章推荐
python使用xlrd与xlwt对excel的读写和格式设定
Jan 21 Python
python安装twisted的问题解析
Aug 21 Python
python之验证码生成(gvcode与captcha)
Jan 02 Python
python实现二维数组的对角线遍历
Mar 02 Python
Django发送邮件功能实例详解
Sep 02 Python
python 实现turtle画图并导出图片格式的文件
Dec 07 Python
使用tensorflow实现矩阵分解方式
Feb 07 Python
详解Django3中直接添加Websockets方式
Feb 12 Python
python实现扫雷游戏
Mar 03 Python
Python selenium模拟手动操作实现无人值守刷积分功能
May 13 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
Jul 03 Python
Python通过getattr函数获取对象的属性值
Oct 16 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
Apr 02 #Python
python基础教程项目三之万能的XML
Apr 02 #Python
python opencv检测目标颜色的实例讲解
Apr 02 #Python
浅谈python配置与使用OpenCV踩的一些坑
Apr 02 #Python
python基础教程项目二之画幅好画
Apr 02 #Python
通过Python 接口使用OpenCV的方法
Apr 02 #Python
Python 3.x 安装opencv+opencv_contrib的操作方法
Apr 02 #Python
You might like
php error_log 函数的使用
2009/04/13 PHP
php获取当前网址url并替换参数或网址的方法
2010/06/06 PHP
控制PHP的输出:缓存并压缩动态页面
2013/06/11 PHP
纯PHP代码实现支付宝批量付款
2015/12/24 PHP
jQuery LigerUI 插件介绍及使用之ligerDrag和ligerResizable示例代码打包
2011/04/06 Javascript
基于jQuery的公告无限循环滚动实现代码
2012/05/11 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
js判断上传文件的类型和大小示例代码
2013/10/18 Javascript
Javascript实现页面跳转的几种方式分享
2013/10/26 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
滚动条响应鼠标滑轮事件实现上下滚动的js代码
2014/06/30 Javascript
jQuery内容过滤选择器用法分析
2015/02/10 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
2016/05/03 Javascript
12个非常实用的JavaScript小技巧【推荐】
2016/05/18 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
js实现横向拖拽导航条功能
2017/02/17 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
[48:46]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第二场 11.19
2020/11/19 DOTA
python 创建一个空dataframe 然后添加行数据的实例
2018/06/07 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
2019/06/24 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
一道Delphi面试题
2016/10/28 面试题
自我鉴定书范文
2013/10/02 职场文书
土木工程毕业生自荐信
2013/11/12 职场文书
党员自我批评与反省材料
2014/02/10 职场文书
4s店活动策划方案
2014/08/25 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
求职导师推荐信范文
2015/03/27 职场文书
2015年政府采购工作总结
2015/05/21 职场文书
教师节简报
2015/07/20 职场文书
互联网的下一个风口:新的独角兽将诞生
2019/08/02 职场文书
Python IO文件管理的具体使用
2022/03/20 Python
python实现手机推送 代码也就10行左右
2022/04/12 Python