import feedparser import sqlite3 from datetime import datetime URL = 'http://imabari-news.blog.so-net.ne.jp/index.xml' feedparser.USER_AGENT = 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko' fdp = feedparser.parse(URL) DATABASE = 'rss.sqlite' #SQliteに接続 conn = sqlite3.connect(DATABASE) conn.row_factory = sqlite3.Row c = conn.cursor() #テーブル生成 c.execute('CREATE TABLE IF NOT EXISTS RSSEntries (entry_id INTEGER PRIMARY KEY AUTOINCREMENT, title, link, published);') #IF NOT EXISTS 同名のデータベースが存在しない場合のみ CREATE DATABASE が実行 #INTEGER PRIMARY KEY AUTOINCREMENT 重複なしの数字自動生成 for entry in fdp.entries: #リンクの重複チェック c.execute('SELECT entry_id from RSSEntries WHERE link=?', (entry.link,)) #DB-API のパラメータ割り当てを使います。 #? を変数の値を使いたいところに埋めておきます。 #その上で、値のタプルをカーソルの execute() メソッドの第2引数として引き渡します。 #第2引数はタプルのため要素が一つだけの場合には要素の後にカンマが必要 if len(c.fetchall()) == 0: c.execute('INSERT INTO RSSEntries (title, link, published) VALUES (?,?,?)', (entry.title, entry.link, datetime.strptime(entry.published, '%a, %d %b %Y %H:%M:%S +0900'))) #新着情報 print(entry.title, entry.link) conn.commit() c.close()
14日より前のデータ削除
import sqlite3 import datetime DATABASE = 'rss.sqlite' conn = sqlite3.connect(DATABASE) conn.row_factory = sqlite3.Row c = conn.cursor() scope = datetime.datetime.now() - datetime.timedelta(days = 14); c.execute('DELETE FROM RSSEntries WHERE datetime(published) < datetime(?);', (scope,)) conn.commit() conn.close()
cronで動かないと思ったらDATABASEで絶対アドレスじゃなかったのでエラーがでてました。