Python项目四:新闻聚合

原创 2015年07月09日 22:05:02

代码地址:https://code.csdn.net/ranky2009/pythonsmallproject

编码中遇到的问题Note:
1.在编写中发现使用newnews时出现如下错误:
502 NEWNEWS command disabled by administrator
 
由于使用newnews命令出现问题,所以改为使用其他的命令替代。用group 和article命令,见项目代码。
2.使用如下code打印中文会报错误
代码url_test.py:
from urllib.request import urlopen

with urlopen('http://www.baidu.com') as f:
     print(f.read().decode('utf-8'))
错误:
UnicodeEncodeError: 'gbk' codec can't encode character '\ufeff' in position 0: i
llegal multibyte sequence

错误环境是OS:WIN7, version of python:3.4.3,窗口:控制台cmd
后来发现,这个错误是由于在控制台中运行(python url_test.py)代码。
解决方法:
开始->所有程序->启动IDLE (Python 3.4 GUI - 64 bit)->File->New File,将以上代码拷贝到新文件中,F5运行代码,发现能正确读取中文。
注意:对于不同的网页,要看网页源码是怎样编码方式,有的是utf-8,有的是gb2312。
3.关于match
Match必须从正则表达式开始匹配,
import re
m = re.match(‘.end’, ‘1end’)
print(m.group()) #能够匹配到1end

n = re.match(‘.end, ‘12end’)
print(n.group()) #n为None,报错

 

对书上原始代码略做修改,如下:

from nntplib import NNTP
from time import strftime, time, localtime
from email import message_from_string
from urllib.request import urlopen
import textwrap
import re

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):
        server = NNTP(self.servername)
        groupInfo = server.group(self.group)
        for num in range(5):
            id = str(int(groupInfo[2]) + num)
            articleinfo = server.article(id)[1]
            articleinfoStrings = []
            for line in articleinfo.lines:
                articleinfoStrings.append(line.decode())
            message = message_from_string('\n'.join(articleinfoStrings))
            
            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()
        textString = text.decode('utf-8')
        title = self.titlePattern.findall(textString)
        print(title)
        body = self.bodyPattern.findall(textString)
        #print(body[0])
        for line in body:
            if len(line) > 30 :
                yield NewsItem(title[0], wrap(line))
                break
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', encoding='utf-8')
        print("""
        <html>
            <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
                <title>Today's New</title>
            </head>
            <body>
            <h1>Today's News</h1>
        """, file = out)
        
        print('<ul>', file = out)
        id = 0
        for item in items:
            id += 1
            print('<li><a href="#%i">%s</a></li>' % (id, item.title), file = out)
        print('</ul', file = out)
        
        id = 0
        for item in items:
            id += 1
            print('<h2><a name="%i">%s</a></h2>' % (id, item.title), file = out)
            print('<pre>%s</pre>' % item.body, file = out)
            
        print("""
            </body>
        </html>
        """, file = out)
        
def runDefaultSetup():
    agent = NewsAgent()
        
    bbc_url = 'http://m.cnr.cn/news/20150706/t20150706_519082828_tt.html?tt_group_id=4658836325'
    bbc_title = '<title>(.+?)</title>'
    bbc_body = '<p.*>(.+?)</p>'
    bbc = SimpleWebSource(bbc_url, bbc_title, bbc_body)
    
    agent.addSource(bbc)

    clpa_server = 'nntpswitch.blueworldhosting.com'
    clpa_group = 'comp.lang.python.announce'
    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()

python项目练习四:新闻聚合

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

python项目练习四:新闻聚合

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

<Android 应用之路> 聚闻 ~ 一个聚合数据新闻客户端

使用聚合新闻数据而成的新闻资讯客户端。聚合数据给用户提供了部分免费的数据接口,当然是存在请求次数限制的。学习Android应用开发后第一个小应用采用的就是聚合数据。最近把代码重构(也就是重新写,因为没...
  • poorkick
  • poorkick
  • 2017年06月29日 13:54
  • 651

聚合数据API爬虫:Python

from db import run_sql from config import start_urls import urllib2 from bs4 import BeautifulSoup im...
  • u013542440
  • u013542440
  • 2016年03月10日 21:38
  • 955

python爬虫(抓取百度新闻列表)

一、python请求要抓取的url页面 要抓取的url http://news.baidu.com/ ,先python模拟请求该url#!/usr/bin/python # -*- coding:u...
  • lenovo403
  • lenovo403
  • 2016年02月23日 09:54
  • 2493

Python - 通过requests实现腾讯新闻抓取爬虫

最近也是学习了一些爬虫方面的知识。以我自己的理解,通常我们用浏览器查看网页时,是通过浏览器向服务器发送请求,然后服务器响应以后返回一些代码数据,再经过浏览器解析后呈现出来。而爬虫则是通过程序向服务器发...
  • guangmingsky
  • guangmingsky
  • 2017年06月02日 15:01
  • 2166

基于朴素贝叶斯的关于互联网金融新闻分类(python实现)

中国互联网金融发展迅速,2014年是中国互联网金融起步的一年,但在短短的一年时间内,互联网金融创业者们融资额度一再创高,雨后春笋般涌现出各类互联网金融产品让用户眼花缭乱,随着创业门槛的降低,在即将到来...
  • lechengbupt
  • lechengbupt
  • 2014年11月25日 20:38
  • 1382

python项目练习四:新闻聚合

python项目练习四:新闻聚合  书中的第四个练习,新闻聚合。现在很少见的一类应用,至少我从来没有用过,又叫做Usenet。这个程序的主要功能是用来从指定的来源(这里是Usenet新闻组)...
  • finethere
  • finethere
  • 2014年05月21日 19:23
  • 463

python项目练习四:新闻聚合

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

python爬虫案例——python爬取百度新闻RSS数据

全栈工程师开发手册 (作者:栾鹏) python教程全解 各RSS网站参考http://blog.csdn.net/luanpeng825485697/article/details/...
  • luanpeng825485697
  • luanpeng825485697
  • 2017年12月20日 21:08
  • 1724
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python项目四:新闻聚合
举报原因:
原因补充:

(最多只允许输入30个字)