2009年3月25日 星期三

Python RssParser with MySQL

其實繼上次寫了python資料型態上下集之後,這次應該來寫一下迴圈與條件式等的教學,但是其實那些東西都是廢話,我下一次再把一些注意事項放上來就好了!不然難道你認為if條件式會寫成怎樣??

這次開始從實例下手,之前我寫過Java RssParser,是儲存成檔案的方式,現在用python教大家如何parse Google RSS新聞檔並儲存 發布時間、標題、連結、相關內容 等資訊到MySQL中。

把玩這支程式之前請先安裝兩個函式庫,feedparserMySQLdb(說明)。裡頭都有安裝說明與教學。

By the way, 我的python是2.5版

sql -- 建立資料庫並使用SQL新增下列資料表

CREATE TABLE IF NOT EXISTS `FEED_MSTR` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
 `DATE` datetime NOT NULL,
 `TITLE` varchar(255) CHARACTER SET utf8 NOT NULL,
 `LINK` text CHARACTER SET utf8 NOT NULL,
 `SUMMARY` text CHARACTER SET utf8 NOT NULL,
 PRIMARY KEY (`ID`),
 KEY `DATE` (`DATE`,`TITLE`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

RssParser.py

#!/usr/local/bin/python
# -*- coding: utf-8 -*-

# Copyright (C) 2009 Kakapo Studio.
# Author: Sam Wang
# Contact: sam.wang.0723@gmail.com

""" This program can parse any RSS or Atom type file on the internet and put it into database. """

import feedparser
import datetime
import MySQLdb

from time import mktime 

data = feedparser.parse(r"http://news.google.com.tw/news?pz=1&ned=tw&hl=zh-TW&topic=t&output=rss")

conn = MySQLdb.connect(host="localhost", user="root", passwd="********", db="YOUR_DATABASE", charset="utf8")
cursor = conn.cursor()

# Loop to get data.
param = []
for item in data.entries:

   # Make tuple to timestamp.
   ts = mktime(item.updated_parsed)
   # Transfer to datetime format.
   dt = datetime.datetime.fromtimestamp(ts)

   ntime = dt.strftime("%Y-%m-%d %H:%M:%S")
   ntitle = item.title.encode('utf8')
   nlink = item.links[0].href.encode('utf8')
   nvalue = item.summary_detail.value.encode('utf8')
  
   # Insert into param.
   param.append((ntime, ntitle, nlink, nvalue))

# Write to database.
sql = "insert into FEED_MSTR(DATE, TITLE, LINK, SUMMARY) values(%s,%s,%s,%s)"
cursor.executemany(sql, param)
  

cursor.close()
conn.close()

稍微說明一下 cursor.executemany(sql, param) 那段,executemany可以用字串當樣板然後給他list或tuples動態給予參數,假設一次update 3筆資料, 每筆有2個欄位, list儲存方式要像如此[(x,x) , (y,y), (z,z)]...這樣update時就會分開成len(list)的執行次數, 每次update len(list[i])個欄位了

2 則留言:

  1. 先打个招呼,你好^.^
    看了你的BLOG有很大收获啊,先谢谢你的分享精神。
    我有一个小问题,你BOLG中的代码是怎么贴上去的啊,我想贴一些代码,但总会提示有问题。你是怎么做到的呢?

    回覆刪除
  2. cindy 妳好! 我之前有po過一篇文章http://samsharehome.blogspot.com/2009/01/blog-post.html

    這網站會幫你把城市碼轉成html code, 貼blog的時候要使用html碼貼上

    回覆刪除