上記記事の通信部分をpythonで書き直してみました。
結果、めちゃくちゃ簡単でした。
pythonハマりますねこれは。
環境
- VSCode
- python 3.11.0
必要パッケージ
- requests
- HTTP通信するのに使用します
- feedparser
- ATOMを解析するのに使用します
パッケージのインストール方法についてはこちら
ソース
とりあえず動くところまで
import requests import feedparser from requests.auth import HTTPBasicAuth baseurl = "https://blog.hatena.ne.jp/super-string/super-string.hatenablog.com/atom/" user = "super-string" password = "<API key>" response = requests.get(baseurl + "entry" ,auth=HTTPBasicAuth(user, password)) ret = feedparser.parse(response.content) for entry in ret.entries : if (entry.app_draft == "no") : print(entry.title)
※baseurl/user/passwordは自身の環境に置き換えてください
書いてあることもシンプルで分かりやすいです。
ただ、これだと全記事の取得ができないし何より面白みがないのでもうちょっと改良してみます。
処理を分割して読みやすくする
import requests import feedparser from requests.auth import HTTPBasicAuth def load_entry(url) : response = requests.get(url, auth=HTTPBasicAuth(user, password)) return feedparser.parse(response.content) def get_next_data(response) : try : return response.feed.links[1].href except : return "" def show_titles(entries) : for entry in entries : if (entry.app_draft == "no") : print(entry.title) baseurl = "https://blog.hatena.ne.jp/super-string/super-string.hatenablog.com/atom/" user = "super-string" password = "<API key>" ret = load_entry(baseurl + "entry") show_titles(ret.entries) next = get_next_data(ret) while next != "" : ret = load_entry(next) show_titles(ret.entries) next = get_next_data(ret)
関数に処理を分割して、最後まで読み込めるようにしました。
もうちょっと改良してみます。
クラス化して必要な処理だけを公開
class HatenaEntryLoader : def __init__(self, baseurl_, user_, password_) : self.baseurl = baseurl_ self.user = user_ self.password = password_ def load_entry(self) : ret = self.__load_entry(baseurl + "entry") self.__show_titles(ret.entries) next = self.__get_next_data(ret) while next != "" : ret = self.__load_entry(next) self.__show_titles(ret.entries) next = self.__get_next_data(ret) def __load_entry(self, url) : response = requests.get(url, auth=HTTPBasicAuth(user, password)) return feedparser.parse(response.content) def __get_next_data(self, response) : try : return response.feed.links[1].href except : return "" def __show_titles(self, entries) : for entry in entries : if (entry.app_draft == "no") : print(entry.title)
これで、呼び出し側はこれだけでよくなり、汎用的になりました。
loader = HatenaEntryLoader(baseurl, user, password) loader.load_entry()
おしまい
探せばあるのかもしれませんが、リファクタ機能が充実した拡張があればもっと楽に実装できそうです。