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 23 Python
Python使用新浪微博API发送微博的例子
Apr 10 Python
使用Python操作Elasticsearch数据索引的教程
Apr 08 Python
python实现文本文件合并
Dec 29 Python
Python实现递归遍历文件夹并删除文件
Apr 18 Python
Python二叉搜索树与双向链表转换实现方法
Apr 29 Python
Python判断是否json是否包含一个key的方法
Dec 31 Python
python实现飞机大战游戏
Oct 26 Python
python读出当前时间精度到秒的代码
Jul 05 Python
python科学计算之scipy——optimize用法
Nov 25 Python
基于PyTorch的permute和reshape/view的区别介绍
Jun 18 Python
Python基础详解之邮件处理
Apr 28 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
中国的第一台收音机
2021/03/01 无线电
通过table标签,PHP输出EXCEL的实现方法
2013/07/24 PHP
thinkphp特殊标签用法概述
2014/11/24 PHP
PHP中检查isset()和!empty()函数的必要性
2019/02/13 PHP
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
js 文本滚动效果的实例代码
2013/08/17 Javascript
javascript创建createXmlHttpRequest对象示例代码
2014/02/10 Javascript
JavaScript替换当前页面的方法
2015/04/03 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
js简单实现调整网页字体大小的方法
2016/07/23 Javascript
javascript实现非常简单的小数取整功能示例
2017/06/13 Javascript
深入理解Vue 的条件渲染和列表渲染
2017/09/01 Javascript
基于ES6 Array.of的用法(实例讲解)
2017/09/05 Javascript
使用JSON格式提交数据到服务端的实例代码
2018/04/01 Javascript
优雅的在React项目中使用Redux的方法
2018/11/10 Javascript
vue 基于element-ui 分页组件封装的实例代码
2018/12/10 Javascript
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
深入浅出vue图片路径的实现
2019/09/04 Javascript
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
JS JQuery获取data-*属性值方法解析
2020/09/01 jQuery
Python程序设计入门(2)变量类型简介
2014/06/16 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
python爬虫获取新浪新闻教学
2018/12/23 Python
Python根据当前日期取去年同星期日期
2019/04/14 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
Omio中国:全欧洲低价大巴、火车和航班搜索和比价
2018/08/09 全球购物
花卉与景观设计系大学生求职信
2013/10/01 职场文书
行政管理人员精品工作推荐信
2013/11/04 职场文书
CNC数控操作工岗位职责
2013/11/19 职场文书
《故乡》教学反思
2014/04/10 职场文书
大学生优秀班干部事迹材料
2014/05/26 职场文书
医学求职信
2014/05/28 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书