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通过ElementTree操作XML获取结点读取属性美化XML
Dec 02 Python
python的即时标记项目练习笔记
Sep 18 Python
Python中AND、OR的一个使用小技巧
Feb 18 Python
Python如何import文件夹下的文件(实现方法)
Jan 24 Python
Python实现的绘制三维双螺旋线图形功能示例
Jun 23 Python
Python 实现异步调用函数的示例讲解
Oct 14 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
对python生成业务报表的实例详解
Feb 03 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
Apr 03 Python
利用 Python ElementTree 生成 xml的实例
Mar 06 Python
Python 读取WAV音频文件 画频谱的实例
Mar 14 Python
Python中np.random.randint()参数详解及用法实例
Sep 23 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中Session的概念
2006/10/09 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
2015/09/28 PHP
关于php中一些字符串总结
2016/05/05 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
通过PHP实现用户注册后邮箱验证激活
2020/11/10 PHP
关于document.cookie的使用javascript
2008/04/11 Javascript
JQuery中的ready函数冲突的解决方法
2010/05/17 Javascript
利用JQuery的load函数动态加载其它页面的内容的实现代码
2010/12/14 Javascript
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
2017/03/28 jQuery
Angular2 父子组件数据通信实例
2017/06/22 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
基于mpvue的简单弹窗组件mptoast使用详解
2019/08/02 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
详解JavaScript匿名函数和闭包
2020/07/10 Javascript
浅谈JS for循环中使用break和continue的区别
2020/07/21 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
Python笔记(叁)继续学习
2012/10/24 Python
python使用心得之获得github代码库列表
2014/06/25 Python
在Django的模型中执行原始SQL查询的方法
2015/07/21 Python
Python探索之实现一个简单的HTTP服务器
2017/10/28 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
Python List列表对象内置方法实例详解
2019/10/22 Python
python+OpenCV实现车牌号码识别
2019/11/08 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
学生会感恩节活动方案
2014/10/11 职场文书