Python Web ペ-ジ自動操作
Cookpad 自動ログインファイル作成
ここまでで、Cookpad 「最近見たレシピ」自動ログインファイルを作成する準備ができました。
引き続き、本ファイルを作成していきます。
sc_63pear.py とよく似たファイル構成になります。
- お決まりの作法
Pyton がインスト-ルされている場所を示めします。
#!/usr/bin/python3
Pyton3 のインスト-ル場所がわからない場合は
$ which python3
で知ることができます。
ファイルで使用する文字コ-ドを設定します。
#coding: utf-8
HTTP ヘッダーを出力
print("Content-type: text/html; charset=UTF-8\n\n")
これで Python から出力された文字は Web で見ることができるようになります。 - ライブラリを取り込み
取り込む必要があるライブラリは4つです。
mechanicalsoup の動作のために
import logging
import mechanicalsoup
そして環境変数読込みのために
import os
from dotenv import load_dotenv
dotenv のなかにある load_dotenv ライブラリ
を読み込み
load_dotenv()
で実行しておきます。 - 環境変数値読出
Python OS モジュールを使用し
import os
読出した環境変数値を設定します。
COOKPAD_LOGIN = os.environ['COOKPAD_LOGIN']
COOKPAD_PASSWORD = os.environ['COOKPAD_PASSWORD'] - def main()ブロック作成Ⅰ
StatefulBrowser オブジェクトを作成します。
browser = mechanicalsoup.StatefulBrowser()
次に、途中経過報告をします。
想定された通りのことが起こったことの確認です。
プログラムの通常の操作中に発生したイベントの報告 (例えば、状態の監視や障害の分析)をします。
なくてもよいです。
例えば
logging.info('I told you so')
とすると、うまく通過すると
INFO:root:I told you so
のように表示されます。
ここでは、
logging.info('Navigating...')
としました。
うまく通過したときは
INFO:root:Navigating...
と表示されます。 - def main()ブロック作成Ⅱ
最終的に表示したいペ-ジの URL は
https://cookpad.com//recipe/history
ですので、browser.open('https://cookpad.com/recipe/history')
とします。
- def main()ブロック作成Ⅲ
ログインできていないので
ログインページ
https://cookpad.com/login
にリダイレクトされます。
リダイレクトされていることを確認します。
assert '/login' in browser.get_url() - def main()ブロック作成Ⅳ
ログインフォーム
(class="login_form" の要素内にある form)
を埋めます。
form の 20行前ぐらいに
<div class='login_form'>
があります。
browser.select_form('.login_form form')
name="login" という入力ボックスを埋めます。
browser['login'] = COOKPAD_LOGIN
name="password" という入力ボックスを埋めます。
browser['password'] = COOKPAD_PASSWORD
途中経過報告をします。
logging.info('Signing in...')
submit ボタンを選択してフォームを送信します。
browser.submit_selected() - ログインに失敗
ログインに失敗する場合は
print(browser.get_current_page().prettify())
で現在のページの HTML ソースを表示します。
- def main()ブロック作成Ⅴ
最近見たレシピのページが表示されていることを確認します。
assert '最近見たレシピ' in browser.get_current_page().title.string
最近見たレシピの名前とURLを表示します。
id="main" のなかの <a class="recipe-title
のなかにレシピ名とリンク先があります。
for 文を使って順次これらを表示します。for a in browser.get_current_page().select('#main a.recipe-title'): print(a.text) print(browser.absolute_url(a.get('href')))
href属性の値は相対URLなので、絶対URLに変換しています。
- if ブロック作成
ファイルが直接実行された場合は、
INFO レベル以上のログを出力するよう設定し、
main() が実行されるようにします。if __name__ == '__main__': logging.basicConfig(level=logging.INFO) main()
ここまでで、Cookpad 自動ログインファイルをほぼ作成する事ができました。
引き続き、本ファイルをまとめていきます。