Python's Archiver

為方便港臺同胞閱覽,Python中國特別推出簡繁體內容轉換功能

xieaotian 发表于 2008-11-19 10:38

python rss抓取程序

最近用python写了一个rss抓取程序,主要功能是从各rss地址抓取title,link,discription等信息,作为一个在线rss reader的后台,初期作品效果请见[url]http://stuhome.net/readworld.php[/url]
    整个功能分两步实现:
    1.将rss内容解析并放入数据库
    2.从数据库中取出数据并按要求封装入相应文件
    rss的抓取使用了feedparser,接下来就是将数据插入数据库。数据库有2个表,分别保存feed和相应的item.插入流程图如下:
[attach]395[/attach]
这个rss reader的最大不同之处在于保存了一个rss地址的所有历史记录.当然以后肯定还是要对条数做一定限制的.整个流程是为了代码的最优雅化设计的,因此容忍了最后一个判断丧失50%的运行效率(新加入的rss地址不用判断)。况且考虑到日后主要都是更新已有的rss,所以最终还是选取了这个方案.
    废话少说,第一步的代码如下:
rss_fetch.py
'''get rss and insert to database'''
import feedparser
from sqlalchemy import *

def insert(url):
    '''get rss and put into db'''
    #init db link
    db=create_engine("mysql://root:1314521ff@localhost:3306/test")
    metadata=BoundMetaData(db)
    feed=Table('feed',metadata,autoload=True)
    item=Table('item',metadata,autoload=True)
    #fetch rss
    rss=feedparser.parse(url)
    #print process
    print rss.href
    #charge if rss already in db
    feedResult=feed.select().execute(link=rss.href.encode('utf-8')).fetchone()
    #if the feed not already in
    if feedResult==None:
        feed.insert().execute(title=rss.feed.title.encode('utf-8'),link=rss.href.encode('utf-8'),description=rss.feed.description.encode('utf-8'))
        itemFeedId=feed.select().execute().fetchall()[-1][0]
    else:
        itemFeedId=feedResult['id']            
    #insrt items
    for items in rss.entries:
        if item.select().execute(link=items.link.encode('utf-8')).fetchone():
            break
        else:      
            items=map(format,[items.title,items.link,items.date,items.description])
            item.insert().execute(feedId=itemFeedId,title=items[0].encode('utf-8'),link=items[1].encode('utf-8'),description=items[3].encode('utf-8'),pubDate=items[2].encode('utf-8'))

def format (target):
    '''format the string take out \r\n and blank space'''
    target=target.replace("\n","")
    target=target.replace("\r","")
    target=target.replace("\\","\\\\")
    target=target.replace("\'","\\'")
    return target
   
    function insert负责获取rss并判断送入数据库,function format格式化特殊字符(可能ython有现成的函数,但是懒得查啦:P),新手上路,还请大家多多指教.

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.