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益智游戏计算汉诺塔问题示例
Mar 05 Python
python基础教程之简单入门说明(变量和控制语言使用方法)
Mar 25 Python
python轻松实现代码编码格式转换
Mar 26 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
Aug 24 Python
Python实现批量压缩图片
Jan 25 Python
简单实现Python爬取网络图片
Apr 01 Python
python Pandas 读取txt表格的实例
Apr 29 Python
Python 的AES加密与解密实现
Jul 09 Python
python 表格打印代码实例解析
Oct 12 Python
Python接口测试数据库封装实现原理
May 09 Python
python 数据库查询返回list或tuple实例
May 15 Python
Python中内建模块collections如何使用
May 27 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
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
PHP编程函数安全篇
2013/01/08 PHP
PHP flush()与ob_flush()的区别详解
2013/06/03 PHP
深入浅析php json 格式控制
2015/12/24 PHP
PHP三种方式实现链式操作详解
2017/01/21 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
2018/12/25 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
a标签的href与onclick事件的区别详解
2014/11/12 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
2016/06/23 Javascript
jQuery中deferred对象使用方法详解
2016/07/14 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
Angular 2.0+ 的数据绑定的实现示例
2017/08/09 Javascript
javascript 日期相减-在线教程(附代码)
2017/08/17 Javascript
json2.js 入门教程之使用方法与实例分析
2017/09/14 Javascript
vue+axios新手实践实现登陆的示例代码
2018/06/06 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
Node.js + express基本用法教程
2019/03/14 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
详解python之简单主机批量管理工具
2017/01/27 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
SHEIN美国:购买时髦的女性服装
2020/12/02 全球购物
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
房地产销售员的自我评价分享
2013/12/04 职场文书
DIY手工制作经营店创业计划书
2014/02/01 职场文书
教育见习报告范文
2014/11/03 职场文书
开票员岗位职责
2015/02/12 职场文书
通知格式
2015/04/27 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
MySQL 条件查询的常用操作
2022/04/28 MySQL