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]