今からでも間に合う

技術を学ぶのは今からでも遅くない

python入門~はてなブログの記事一覧を取得する~

super-string37.com

上記記事の通信部分を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()

おしまい

探せばあるのかもしれませんが、リファクタ機能が充実した拡張があればもっと楽に実装できそうです。

プライバシーポリシー


d払いポイントGETモール