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のレスポンスコードが入ります。
- 作者: 上野宣
- 出版社/メーカー: 翔泳社
- 発売日: 2004/12/09
- メディア: 単行本
- 購入: 4人 クリック: 123回
- この商品を含むブログ (59件) を見る
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">或阿呆のブログ - \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をパースするのは簡単!
参考書籍
- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
Effective Python ―Pythonプログラムを改良する59項目
- 作者: Brett Slatkin,石本敦夫,黒川利明
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/01/23
- メディア: 大型本
- この商品を含むブログ (5件) を見る