武器商人@Pythonのブログ

Pythonを好んで使っているプログラマです。Pythonこそが最強のプログラミング言語だと思っています。Pythonは使いやすいです。Pythonは書きやすいです。Pythonは読みやすいです。Pythonはパワフルです。Pythonは一貫性があります。Pythonが好きです。

requestsとBeautifulStoneSoupを使いはてなブログAtomPubを使ってブログ情報を取得する

スポンサーリンク

はじめに

はてなブログは何やらAtomPubというApiを使ってブログの情報を取得したり、エントリを投稿したり出来るらしいです。

詳しい仕様は以下で。
はてなブログAtomPub - Hatena Developer Center

今回は手始めに、ブログの情報を取得してみました。

サンプルコード

# -*- coding: cp932 -*-
import requests
from requests.auth import HTTPBasicAuth
from bs4 import BeautifulStoneSoup

if __name__ == "__main__":
    url = "https://blog.hatena.ne.jp/{はてなID}/{ブログID}/atom/entry/{entry_id}" #自分ブログのエンドポイントを入れてね
    userId = "user"       #自分のユーザーIDを入れてね
    apiKey = "pass"       #自分のパスワードを入れてね
    r = requests.get(url, auth=HTTPBasicAuth(userId, apiKey))
    soup = BeautifulStoneSoup(r.content)
    print soup.prettify()
    titletag = soup.find("title")
    print titletag
    title = titletag.text
    print title

実行結果

<?xml version="1.0" encoding="utf-8"?>
<service xmlns="http://www.w3.org/2007/app">
 <workspace>
  <title>
   或阿呆のブログ
  </title>
  <collection href="https://blog.hatena.ne.jp/oneshotlife_tom/oneshotlife-tom.hatenadiary.jp/atom/entry">
   <title>
    或阿呆のブログ - 記事一覧
   </title>
   <accept>
    application/atom+xml;type=entry
   </accept>
  </collection>
 </workspace>
</service>
<title>或阿呆のブログ</title>
或阿呆のブログ

以下、一行一行解説していきます。

必要モジュール

requests

インストールコマンド

$pip install requests
bs4

インストールコマンド

$pip install BeautifulSoup4

参考までに、WindowsでPython2.7をインストールするには、以下が参考になります。(手前味噌)
oneshotlife-python.hatenablog.com

モジュールのインポート

import requests
from requests.auth import HTTPBasicAuth
from bs4 import BeautifulStoneSoup

url,userId,apiKeyの設定

    url = "https://blog.hatena.ne.jp/{はてなID}/{ブログID}/atom/entry/{entry_id}" #自分ブログのエンドポイントを入れてね
    userId = "user"       #自分のユーザーIDを入れてね
    apiKey = "pass"       #自分のパスワードを入れてね

上記は、ユーザー個々に違う値を設定することになります。
IDとパスワードなので、さすがに晒すわけにもいかないので、
仮想の値を記述してあります。

個人の設定によって適宜変更して下さい。

メソッドに直接記載しても良いが、変数に格納することにします。
なお、url,userId,apiKeyは何か?が意外とはまります。

はてなブログのブログ情報のところの「設定」→「詳細設定」と辿っていくと、
「AtomPub」という表示項目があります。

そこにある「ルートエンドポイント」が僕のソースコードで言うところのurlになります。
そこにある「APIキー」が僕のソースコードで言うところのapiKeyになります。

userIdというのは、はてなサービスにログインする際のアカウントのことです。

GETメソッドでリソースを取得する

r = requests.get(url, auth=HTTPBasicAuth(userId, apiKey))
rの値
>>> r
<Response [200]>

このようにHTTPのレスポンスコードが入ります。

今夜わかるHTTP (Network)

今夜わかるHTTP (Network)

r.contentの値
'<?xml version="1.0" encoding="utf-8"?>\n<service xmlns="http://www.w3.org/2007/app">\n  <workspace>\n    <atom:title xmlns:atom="http://www.w3.org/2005/Atom">\xe6\x88\x96\xe9\x98\xbf\xe5\x91\x86\xe3\x81\xae\xe3\x83\x96\xe3\x83\xad\xe3\x82\xb0</atom:title>\n    <collection href="https://blog.hatena.ne.jp/oneshotlife_tom/oneshotlife-tom.hatenadiary.jp/atom/entry">\n      <atom:title xmlns:atom="http://www.w3.org/2005/Atom">&#x6216;&#x963F;&#x5446;&#x306E;&#x30D6;&#x30ED;&#x30B0; - \xe8\xa8\x98\xe4\xba\x8b\xe4\xb8\x80\xe8\xa6\xa7</atom:title>\n      <accept>application/atom+xml;type=entry</accept>\n    </collection>\n  </workspace>\n</service>\n'

このようにレスポンスそのものが格納されます。

BeautifulStoneSoupでXMLをパース

BeautifulStoneSoupのインスタンスを生成
soup = BeautifulStoneSoup(r.content)

引数には、XMLコンテンツそのものを設定します。なので、先ほどGETしたリソースをそのまま設定しちゃいましょう。

prettifyメソッドを使いXMLを整形して表示
<?xml version="1.0" encoding="utf-8"?>
<service xmlns="http://www.w3.org/2007/app">
 <workspace>
  <title>
   或阿呆のブログ
  </title>
  <collection href="https://blog.hatena.ne.jp/oneshotlife_tom/oneshotlife-tom.hatenadiary.jp/atom/entry">
   <title>
    或阿呆のブログ - 記事一覧
   </title>
   <accept>
    application/atom+xml;type=entry
   </accept>
  </collection>
 </workspace>
</service>

XMLコンテンツをパースするには、XMLのタグ付けの構造を知る必要がありますから、整形して表示することは非常に大事です!

findメソッドを使いtitleタグを抽出
titletag = soup.find("title")

titletagには、findしてマッチしたタグがそのまま入ります。

>>> print titletag
<title>或阿呆のブログ</title>
titleタグの値を取得
title = titletag.text

titleにはtitletag内のタグに挟まれている文字列が入ります。

>>> print title
或阿呆のブログ

まとめ

  • requestsを使えばhttpを扱うのは簡単!
  • BeautifulStoneSoupを使えばXMLをパースするのは簡単!

次回予告

はてなブログAtomPubを使ってブログを自動投稿するスクリプトを書きたいと思います。

参考書籍

入門 Python 3

入門 Python 3

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目