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错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
Aug 22 Python
浅谈解除装饰器作用(python3新增)
Oct 15 Python
python实现AES加密与解密
Mar 28 Python
python opencv实现图像边缘检测
Apr 29 Python
PyQt5笔记之弹出窗口大全
Jun 20 Python
python代码 FTP备份交换机配置脚本实例解析
Aug 01 Python
Python3 Tkinkter + SQLite实现登录和注册界面
Nov 19 Python
Python tkinter实现图片标注功能(完整代码)
Dec 08 Python
Ranorex通过Python将报告发送到邮箱的方法
Jan 12 Python
Python基础之字符串常见操作经典实例详解
Feb 26 Python
Pycharm安装第三方库失败解决方案
Nov 17 Python
如何基于Python pygame实现动画跑马灯
Nov 18 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 ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
php设计模式之简单工厂模式详解
2014/09/04 PHP
PHP原生函数一定好吗?
2014/12/08 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
PHP实现长轮询消息实时推送功能代码实例讲解
2021/02/26 PHP
Javascript 作用域使用说明
2009/08/13 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
JS验证身份证有效性示例
2013/10/11 Javascript
js快速排序的实现代码
2013/12/08 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
setTimeout学习小结
2017/02/08 Javascript
jQuery设计思想
2017/03/07 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
JavaScript html5 canvas实现图片上画超链接
2017/10/20 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
vue-cli中安装方法(图文详细步骤)
2018/12/12 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
Python的地形三维可视化Matplotlib和gdal使用实例
2017/12/09 Python
基于python3 OpenCV3实现静态图片人脸识别
2018/05/25 Python
python使用udp实现聊天器功能
2018/12/10 Python
python实现机器人卡牌
2019/10/06 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
2020/04/17 Python
浅析Python迭代器的高级用法
2020/07/16 Python
Python hashlib和hmac模块使用方法解析
2020/12/08 Python
教师师德承诺书
2014/03/26 职场文书
药品营销策划方案
2014/06/15 职场文书
电工实训报告总结
2014/11/05 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
社区母亲节活动总结
2015/02/10 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python
Python学习之迭代器详解
2022/04/01 Python
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
2022/04/18 MySQL