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 错误和异常小结
Oct 09 Python
Python命令行参数解析模块optparse使用实例
Apr 13 Python
Python中的with语句与上下文管理器学习总结
Jun 28 Python
Python中操作mysql的pymysql模块详解
Sep 13 Python
Python3解决棋盘覆盖问题的方法示例
Dec 07 Python
在python中利用最小二乘拟合二次抛物线函数的方法
Dec 29 Python
如何用Python绘制3D柱形图
Sep 16 Python
Python Serial串口基本操作(收发数据)
Nov 06 Python
python 读取串口数据的示例
Nov 09 Python
基于django和dropzone.js实现上传文件
Nov 24 Python
Python爬虫之Selenium实现窗口截图
Dec 04 Python
进行数据处理的6个 Python 代码块分享
Apr 06 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 分页分组类
2009/12/10 PHP
解析thinkphp import 文件内容变量失效的问题
2013/06/20 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
浅谈php命令行用法
2015/02/04 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
XAMPP升级PHP版本实现步骤解析
2020/09/04 PHP
Maps Javascript
2007/01/22 Javascript
jquery 延迟执行实例介绍
2013/08/20 Javascript
对 jQuery 中 data 方法的误解分析
2014/06/18 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
2016/09/15 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
Angular2搜索和重置按钮过场动画
2017/05/24 Javascript
使用npm安装最新版本nodejs
2018/01/18 NodeJs
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
JS与SQL方式随机生成高强度密码示例
2018/12/29 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
[02:28]DOTA2亚洲邀请赛附加赛 RECAP赛事回顾
2015/01/29 DOTA
如何利用Fabric自动化你的任务
2016/10/20 Python
关于Python中异常(Exception)的汇总
2017/01/18 Python
Python随机函数random()使用方法小结
2018/04/29 Python
django从请求到响应的过程深入讲解
2018/08/01 Python
python3 下载网络图片代码实例
2019/08/27 Python
Python 解析xml文件的示例
2020/09/29 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
彪马荷兰官网:PUMA荷兰
2019/05/08 全球购物
Sql面试题
2013/03/20 面试题
EJB的激活机制
2013/10/25 面试题
《花木兰》教学反思
2014/04/09 职场文书
2014年结对帮扶工作总结
2014/12/17 职场文书
毕业生个人总结
2015/02/28 职场文书
少先队中队工作总结
2015/08/14 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
Python学习之包与模块详解
2022/03/19 Python