【Python】MechanicalSoupを使ってWordPressにログインする

 

あ〜Python使ってWordPressにログインしてぇ〜

という方向けの記事です。他にも

ログインする必要があるサイトでスクレイピングして〜

という方にも役立つ記事となっております。

結論から言うと、MechanicalSoupを使うことでログインが必要なサイトに対してスクレイピングできるようになります。それでは早速解説していきます。

動作環境

  • Python 3.8.1
  • pip 21.1.3
  • macOS Catalina 10.15.7
  • MechanicalSoup 1.1.0

MechanicalSoupのインストール

MechanicalSoupはpipでインストールできます。

$ pip install MechanicalSoup

ログイン画面の確認

まずはログイン画面で検証を行います。WordPressのログイン画面を見てみましょう。ログイン画面で右クリックをして検証をクリックします。

すると開発者ツールが開きます。開発者ツールの左うえの矢印(画像内1)をクリックした後ログインフォームを選択すると、フォームのidが「loginform」であることがわかります(画像内2)。

同様にして入力欄のname属性を確認してみるとユーザー名の入力欄は「log」、パスワードの入力欄は「pwd」であることが確認できます。

まとめると

  • ログインフォームのidが「#loginform」
  • ユーザー名のname属性が「log」
  • ユーザー名のname属性が「pwd」

となります。この情報を基にPythonを使ってログインしてみましょう。

 

Pythonで自動ログインする

好きなディレクトリにPythonファイルを作成します。私はwordpressLogin.pyというPythonファイルを作成しました。プログラムの内容としてはまずWordPressの管理画面(https://domein.com/wp-admin)を開きます。するとログイン画面に遷移するのでそれを最初のif文で確認しています。次に先ほど確認したフォームを埋めていきます。埋めるフォームとして「#loginform」を指定します。そして「log」にユーザー名を代入し、「pwd」にパスワードを代入します。最後にフォームの送信を行い、画面タイトルに「ダッシュボード」が含まれているかどうかでログインに成功したかどうかを確認します。

import mechanicalsoup

def main():
    browser = mechanicalsoup.StatefulBrowser()

    # WordPress管理画面を開く
    browser.open('https://your-site-domain.com/wp-admin')

    # ログイン画面に遷移できているかどうかの確認
    if 'ログイン' in browser.get_current_page().title.string:
        print('ログイン画面に遷移成功!')
    else:
        # 遷移できていなかったときは処理を中断する
        print('ログイン画面に遷移失敗!')
        return

    # ログイン画面のフォームを選択
    browser.select_form('#loginform')
    browser['log'] = USER_NAME # name属性がlogの入力欄を埋める
    browser['pwd'] = PASSWORD # name属性がpwdの入力欄を埋める

    # フォームを送信する
    browser.submit_selected()

    # ログインに成功したかどうか確認
    if 'ダッシュボード' in browser.get_current_page().title.string:
        print('ログイン成功!')
    else:
        print('ログイン失敗!')

if __name__ == '__main__':
    main()

上記コードの最初のURLとログインする際のユーザー名とパスワードを適切に変更して実行すると以下のようにログインに成功していることが確認できます。

$ python wordpressLogin.py
ログイン画面に遷移成功!
ログイン成功!

このようにMechanicalSoupを使うことでログインが必要な画面でもスクレイピングを行うことができるようになります。

 

コメント

タイトルとURLをコピーしました