import argparse
import feedparser
import os
import pickle
import pprint
class MoldingRSS():
def __init__(self):
self.blogs = []
self.rss_dic = {}
def add_rss_blog(self, title: str, url: str) -> None:
"""
ブログの追加
Parameters
----------
title : str
ブログ名
url : str
RSSのURL
"""
self.blogs.append({"title": title, "url": url})
def load_dic_pickle(self, read_dic_path: str) -> None:
"""
RSSの辞書を格納したpickleファイルを読み込む
Parameters
----------
read_dic_pth : str
読み込むpickleファイルのパス
"""
load_dic = {}
if os.path.exists(read_dic_path):
with open(read_dic_path, "rb") as f:
load_dic = pickle.load(f)
self.rss_dic = load_dic
def get_rss_dic(self) -> None:
"""
self.blogsに格納されているRSSからリンクとタイトルを取得
"""
for blog in self.blogs:
f = feedparser.parse(blog["url"])
dic = {e["link"]: e["title"] for e in f["entries"]}
self.rss_dic[blog["title"]] = dic
def get_dic_diff(self, tool_dic: dict) -> dict:
"""
現在取得している辞書と対象辞書の差分を取得
Parameters
----------
tool_dic : dict
引く側の辞書
Returns
-------
dict
差分の辞書
"""
diff_dic = {}
for blog_title, dic in self.rss_dic.items():
diff_dic[blog_title] = []
if tool_dic.get(blog_title, None) is None:
continue
for url, title in dic.items():
if url not in tool_dic[blog_title].keys():
diff_dic[blog_title].append({"title": title, "url": url})
return diff_dic
def save_dic_pickle(self, write_dic_path: str) -> None:
"""
RSSの辞書を格納したpickleファイルを保存する
Parameters
----------
write_dic_path : str
書き込むpickleファイルのパス
"""
with open(write_dic_path, "wb") as p:
pickle.dump(self.rss_dic, p)
def main(setting_path):
# 最新の記事リストを保存するインスタンス
new_rss = MoldingRSS()
# 対象のブログを"タイトル", "RSSのURL"で追加
new_rss.add_rss_blog("ITmedia 総合記事一覧", "https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml")
new_rss.get_rss_dic()
# 以前取得した記事リストを保存するインスタンス
old_rss = MoldingRSS()
old_rss.load_dic_pickle(setting_path)
# 辞書の差分を取得
diff_dic = new_rss.get_dic_diff(old_rss.rss_dic)
# 差分を保存するインスタンス
diff_rss = MoldingRSS()
diff_rss.rss_dic = diff_dic
# 次回実行時に差分を確認するため、最新の記事リストをpickle形式で保存
new_rss.save_dic_pickle(setting_path)
# 内容表示
print("new_rss:")
pprint.pprint(new_rss.rss_dic)
print("old_rss:")
pprint.pprint(old_rss.rss_dic)
print("diff_rss:")
pprint.pprint(diff_rss.rss_dic)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--setting", "-s", default="all_dict.pkl")
args = parser.parse_args()
main(args.setting)