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脚本将Bing的每日图片作为桌面的教程
May 04 Python
简单解析Django框架中的表单验证
Jul 17 Python
在Django中限制已登录用户的访问的方法
Jul 23 Python
python结合API实现即时天气信息
Jan 19 Python
用Python实现斐波那契(Fibonacci)函数
Mar 25 Python
python动态加载包的方法小结
Apr 18 Python
python 平衡二叉树实现代码示例
Jul 07 Python
Python实现快速傅里叶变换的方法(FFT)
Jul 21 Python
python twilio模块实现发送手机短信功能
Aug 02 Python
django数据模型on_delete, db_constraint的使用详解
Dec 24 Python
一些关于python 装饰器的个人理解
Aug 31 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 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将会员数据导入到ucenter的代码
2010/07/18 PHP
smarty内置函数config_load用法实例
2015/01/22 PHP
php二维码生成以及下载实现
2017/09/28 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
使用vue构建一个上传图片表单
2017/07/04 Javascript
vue axios数据请求及vue中使用axios的方法
2018/09/10 Javascript
实例分析vue循环列表动态数据的处理方法
2018/09/28 Javascript
node.js实现微信开发之获取用户授权
2019/03/18 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
VUE中V-IF条件判断改变元素的样式操作
2020/08/09 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
vue实现抽屉弹窗效果
2020/11/15 Javascript
在Python中用keys()方法返回字典键的教程
2015/05/21 Python
Python连接MySQL并使用fetchall()方法过滤特殊字符
2016/03/13 Python
Python存取XML的常见方法实例分析
2017/03/21 Python
Python中的几种矩阵乘法(小结)
2019/07/10 Python
python变量的存储原理详解
2019/07/10 Python
Python 经典算法100及解析(小结)
2019/09/13 Python
python新式类和经典类的区别实例分析
2020/03/23 Python
python中format函数如何使用
2020/06/22 Python
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
师范应届生求职信
2013/11/15 职场文书
职业规划书如何设计?
2014/01/09 职场文书
中文专业学生自我评价范文
2014/02/06 职场文书
贸易经济专业自荐书
2014/06/29 职场文书
关于长城的导游词
2015/01/30 职场文书
2015年度班主任自我评价
2015/03/11 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
苹果的回收机器人可以通过拆解iPhone获取大量的金和铜并外公布了环境保护最新进展
2022/04/21 数码科技
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript