这个项目看了有段时间,因为一直没跑通,而且关于NNTP也不是特别理解。这里是转载code123的分析。

原文地址:http://www.code123.cc/1327.html

书中的第四个练习,新闻聚合。现在很少见的一类应用,至少我从来没有用过,又叫做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 reday = 24*60*60def 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 = titleself.body = bodyclass NNTPSource:def __init__(self,servername,group,window):self.servername = servernameself.group = groupself.window = windowdef 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 = urlself.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.titleprint '-'*len(item.title)print item.bodyclass HTMLDestination:def __init__(self,filename):self.filename = filenamedef 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 = 0for item in items:id += 1print >> out, '<li><a href="#">%s</a></li>' % (id,item.title)print >> out, '</ul>'id = 0for item in items:id += 1print >> out, '<h2><a name="%i">%s</a></h2>' % (id,item.title)print >> out, '<pre>%s</pre>' % item.bodyprint >> out, '''</body></html>'''
def runDefaultSetup():agent = NewsAgent()bbc_url = 'http://news.bbc.co.uk/text_only.stm'bbc_title = r'(?s)a href="[^"]*">\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 = 1clpa = 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:新闻聚合相关推荐

  1. python新闻聚合_使用python对数据进行高效处理,包你玩转分组聚合

    本文主要介绍python的第三方数据分析库pandas,阐述其在数据分析领域应该如何高效地进行分组聚合,共分享5个最佳实践. groupby概念 groupby语句在数据分析中是用来做分组计算的,将数 ...

  2. python新闻聚合_基于Python的新闻聚合系统网络爬虫研究

    基于 Python 的新闻聚合系统网络爬虫研究 左卫刚 [摘 要] 摘 要 本研究旨在创建一个能够从不同页面布局中提取数据的开源爬 虫,其中包括网络爬虫. API .网络爬虫调度器以及 Socket ...

  3. 基于Python的新闻聚合网站设计与实现

    摘 要:本论文研究内容是基于Python的爬虫网络设计,利用Python的Scrapy的框架搭建爬虫网络,并设计一个全新的新闻网站,网站实现对新闻数据的分类,以及用户对新闻的分享.评论等,且本论题设计 ...

  4. Python基础教程书籍案例:新闻采集(新闻聚合)【上】

    这个练习项目来自<Python基础教程(第2版)>,案例原名为"新闻聚合". 项目分为两个阶段: 第一阶段:通过与NNTP服务器进行交互获取新闻源. 第二阶段:获取不同 ...

  5. 4. Python脚本学习实战笔记四 新闻聚合

    4. Python脚本学习实战笔记四 新闻聚合 本篇名言:"人言纷杂,保持自我:工作勤奋,娱乐适度:对待朋友,不玩心术:处理事务,不躁不怒:生活讲究,量入为出:知足常乐,一生幸福!" ...

  6. python项目练习四:新闻聚合

    书中的第四个练习,新闻聚合.现在很少见的一类应用,至少我从来没有用过,又叫做Usenet.这个程序的主要功能是用来从指定的来源(这里是Usenet新闻组)收集信息,然后讲这些信息保存到指定的目的文件中 ...

  7. 【新媒体】现阶段新闻聚合的玩法

    郑昀 20070824<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /& ...

  8. Facebook也大干新闻聚合 “新闻快读”向所有媒体开放

    去年五月,Facebook推出了不离开本站直接阅读新闻的聚合服务"新闻快读"(Instant Articles),用户载入文章的速度大增,不过当时只面向一些特定合作的新闻机构.日前 ...

  9. 用ASP.NET编写一个在线RSS新闻聚合器

    概要 本文讲解了如何使用 XML Web 控件获取远程XML数据并在 ASP.NET 页面显示这些XML数据,以及使用Repeater控件发布数据库中的XML数据.在过去的几年间,随着 异构平台间共享 ...

最新文章

  1. 0409-0416的笔记
  2. 价值为王,市场需要降温
  3. 转载:C++ list 类学习笔记
  4. linux 内核 虚拟文件系统VFS 路径查找 path_lookup
  5. DotNetBar 中 SuperGridControl 加载数据、获取数据、设置样式
  6. 基于spring cloud 的灰度发布实践_【收藏】基于spring cloud灰度发版方案
  7. rabbitmq 集群 ha负载 Consumer raised exception, processing can restart if the connection factory
  8. 解决Linkedin sdk无法保持oauth_token
  9. js实现网页中元素缩放(zoom vs scale)
  10. matlab偏最小二乘法
  11. 我家云刷机omv如何更改设置文件夹权限
  12. 阿里巴巴校招offer面经
  13. chrome 设置保护眼睛颜色
  14. BES2300x笔记(4) -- TWS组对与蓝牙配对(Peer or Pair傻傻分不清)
  15. 新生赛第一题:dls的黑粉
  16. 经贸英语中专用名词与常用词如何翻译?
  17. oj 3014 文件格式变换
  18. iOS获取设备的唯一标识的方法
  19. 笔记本屏幕亮度随着显示内容而变,时亮时暗
  20. jsp mysql留言板制作_Jsp+mysql 制作留言板

热门文章

  1. 如何写一篇设计文档,目录是什么
  2. openwrt 安装 ser2net
  3. 自学app难不难 有c语言,软件编程入门自学到底难不难 零基础自学软件编程的方法...
  4. 用Python实现Excel表格的多对多批量替换
  5. 【java基础】双引号内使用双引号必须在里面的双引号前加转义字符\
  6. 【Python】03 河道横断面数据处理
  7. ZYNQ7000平台介绍
  8. 基于STM32单片机的水质监测系统(Proteus仿真+程序)
  9. 「Poetize9」升降梯上(tyvj2032)(最短路)
  10. Unity初级项目实战:官方宇宙飞机大战游戏(二)