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 相关文章推荐
Django中的文件的上传的几种方式
Jul 23 Python
对python遍历文件夹中的所有jpg文件的实例详解
Dec 08 Python
python random从集合中随机选择元素的方法
Jan 23 Python
对python使用telnet实现弱密码登录的方法详解
Jan 26 Python
python3中eval函数用法使用简介
Aug 02 Python
用python爬取历史天气数据的方法示例
Dec 30 Python
pytorch 准备、训练和测试自己的图片数据的方法
Jan 10 Python
什么是Python包的循环导入
Sep 08 Python
Python运算符+与+=的方法实例
Feb 18 Python
python3实现Dijkstra算法最短路径的实现
May 12 Python
python入门学习关于for else的特殊特性讲解
Nov 20 Python
python中数组和列表的简单实例
Mar 25 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中iconv函数使用方法
2008/05/24 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
看了就知道什么是JSON
2007/12/09 Javascript
jQuery初学:find()方法及children方法的区别分析
2011/01/31 Javascript
jQuery EasyUI API 中文文档 - Documentation 文档
2011/09/29 Javascript
jquery复选框checkbox实现删除前判断
2014/04/20 Javascript
js中的for如何实现foreach中的遍历
2014/05/31 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
javascript中indexOf技术详解
2015/05/07 Javascript
如何判断Javascript对象是否存在的简单实例
2016/05/18 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
2018/08/20 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
如何使用JavaScript检测空闲的浏览器选项卡
2020/05/28 Javascript
vue路由分文件拆分管理详解
2020/08/13 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
Python正确重载运算符的方法示例详解
2017/08/27 Python
详解Django rest_framework实现RESTful API
2018/05/24 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
Python面向对象之类和实例用法分析
2019/06/08 Python
python中的列表和元组区别分析
2020/12/30 Python
详解python中的异常和文件读写
2021/01/03 Python
python 利用matplotlib在3D空间中绘制平面的案例
2021/02/06 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
英国工具中心:UK Tool Centre
2017/07/10 全球购物
linux系统都有哪些运行级别
2016/03/26 面试题
行政管理毕业生自荐信
2014/02/24 职场文书
毕业自我鉴定书
2014/03/24 职场文书
房屋转让协议书范本
2014/04/11 职场文书
毕业证代领委托书
2014/09/26 职场文书
在校大学生才艺比赛策划书怎么写?
2019/08/26 职场文书