pythonで「はてなブログ」にログインしてみた
昨日の記事のRequestsを利用して「はてなブログ」の自分のブログにログインしてみました。 Seleniumを使ってブラウザを操作してログインすれば確実なのは分かっていましたが、出来るだけインストールするソフトを増やしたくないのでRequestsで試しました。 ダメかも知れないと思っていたのですが、無事成功しましたので、どのようにしたかの報告をします。
今回はスクリプトではなくpythonのインタラクティブモードで直接コードを打ち込んで実行しました。その経過を以下に載せます。
ログイン画面のHTML
はてなのログイン画面は次の図のようになっています。
入力項目は、「はてなID」と「パスワード」となっています。プログラムでこれらに入力するにはHTMLコードを調べて、プログラムで指定できるようにその項目の名を知る必要があります。 HTMLの知識がここで必要になりますね。
HTMLコード中から<input
を検索して見つけたのが次の2行です。
<input value="" name="name" autofocus="autofocus" pattern=".{3,}" required="required" type="text" class="text" id="login-name" placeholder="はてなID または メールアドレス"> <input required="required" value="" name="password" class="password" type="password" placeholder="パスワード">
これでHTMLの中で「はてなID」の項目は"name"と呼ばれていることが、また「パスワード」の項目は"password"と呼ばれていることがわかりました。これはname="〜"を見ています。
pythonでのログイン手続き
端末画面を出して実行した経過を次に示します。
>>>と有る行がPythonの命令行です。...とある行は続きの命令行です。
sk@PC:~$ python3 Python 3.6.9 (default, Nov 7 2019, 10:44:02) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import requests >>> import time >>> >>> url = 'https://www.hatena.ne.jp/login?via=200125' >>> >>> id = '自分のID' >>> pword = '自分のパスワード' >>> ses = requests.session() >>> ses.get(url) <Response [200]> >>> login_data = { ... 'name': id, ... 'password': pword, ... } >>> login = ses.post(url, data=login_data) >>> time.sleep(1) >>> print(login.status_code) 200 >>> url2 = 'https://blog.hatena.ne.jp/koukaforest/koukaforest.hatenablog.com/subscribers' >>> req = ses.get(url2) >>> print(req.status_code) 200 >>> print(req.text)
url = 'https://www.hatena.ne.jp/login?via=200125'
で指定しているアドレスは「はてな」のログイン画面を示しています。
自分のID、自分のパスワードは実際に使っているものを記述します。
ses = requests.session()
でsessionオブジェクトsesを作ります。
ses.get(url)
でログイン画面を取得します。
<Response [200]>
は取得に成功したというステータスコードです。
次にログイン時に入力するIDとパスワードをセットにしたログインデータ(辞書型)を準備します。
login = ses.post(url, data=login_data)
でログインデータを使ってログイン画面に送信します。
念の為1秒間待ちます。 今回のように単発のアクセスでは必要ないのですが、スクレイピングする場合は短時間内に続けて多数のアクセスをするとサーバーに負荷を掛けてしまいますので、それを避けるためです。
次の行の200
はログインが成功したというステータスコードです。
次に私のブログないの「読者一覧を見る」をから表示される「このブログの読者」に入ってみます。
「このブログの読者」のURLを調べて変数url2にセットしています。
req = ses.get(url2)゛で「このブログの読者」のページを取得します。結果は
200`でこれも成功です。
最後のprint(req.text)を実行すると、大量(約1000行)のHTMLソースが画面に現れます。 これを処理するのが次の課題なのですが…できるかな?。