kakashi-blog・カカシブログ・

Python備忘録を書きドローンやバイクなど好きな事で生きて行こうとしているブログ

Python

Seleniumで自動ログインする方法|Python備忘録

投稿日:2019年11月28日 更新日:

前回はSeleniumでブラウザをスクロールさせました。今回は、ログイン画面にIDとパスワードを自動で入力して、ログインするところまでやってみます。

結論から言うと、開発者ツール(F12)で入力欄とボタンのidを探し、find_element(By.ID, 'id名') で選んで、send_keys() で入力、click() で押す だけです。

要点

  • 操作したい入力欄やボタンは、ブラウザの開発者ツール(F12)で探します
  • 文字の入力は send_keys()、ボタンを押すのは click() です
  • ページが読み込まれる前に次へ進むとエラーになるので、待ち時間を入れます
  • Selenium 4.3以降は find_element_by_id が使えません。find_element(By.ID, ...) を使います

自動ログインのコード(今の書き方)

当時はYahoo! JAPANのログイン画面で試しました。下のコードは、当時のコードを今のSeleniumの書き方に直したものです。ブログ用に書き直したもので、まだ動作を確かめていません。また、Yahoo! JAPANのログイン画面はその後作りが変わっているので、idはそのページで探し直してください(探し方は後で書きます)。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

username = 'id'        # ID、メールアドレス、携帯番号など
password = 'password'  # パスワード

browser = webdriver.Chrome()
browser.get('ログインページのURL')
wait = WebDriverWait(browser, 10)

user_name = wait.until(EC.element_to_be_clickable((By.ID, 'username')))
user_name.send_keys(username)
browser.find_element(By.ID, 'btnNext').click()

psw = wait.until(EC.element_to_be_clickable((By.ID, 'passwd')))
psw.send_keys(password)
browser.find_element(By.ID, 'btnSubmit').click()

コードの中身

1. 必要なライブラリを読み込む

webdriver はブラウザを動かすため、By は操作する場所を指定するため、WebDriverWait と EC は、操作できるようになるまで待つために使います。

2. IDとパスワードを変数に入れる

username にログインID(メールアドレスや携帯番号)を、password にパスワードを入れます。

パスワードをコードに直接書くと、ファイルを人に渡したときに漏れてしまいます。自分のパソコンで試すだけにして、人に見せるときは必ず消してください。

3. ブラウザを開く

webdriver.Chrome() でChromeを開き、get() でログインページを開きます。

Seleniumで開いたYahoo! JAPANのログイン画面

当時はChromeのバージョンに合った「ChromeDriver」を自分でダウンロードする必要がありましたが、Selenium 4.6以降は自動で用意してくれるようになりました。

4. ページが表示されるまで待つ

プログラムは、ブラウザが完全に読み込まれていなくても次の操作に進んでしまうので、エラーになることがあります。人が操作するなら、入力できるようになるまで待ったり、ボタンが出てから押したりしますよね。それをプログラムでもやります。

当時は time.sleep(10) で10秒待っていました。今のコードの wait.until(...) は、入力欄が操作できるようになるまで最大10秒待ち、操作できるようになったらすぐ次へ進みます。決まった秒数を待つより無駄がありません。

5. 入力欄とボタンを探して操作する

find_element(By.ID, 'username') の 'username' の部分に、操作したい場所のidを入れます。send_keys() で文字を入力し、click() でボタンを押します。

ID入力→「次へ」ボタン→パスワード入力→「ログイン」ボタン、と同じことを2回くり返せばログインできます。

操作したい場所(id)の探し方

  1. 操作したいページをブラウザで開き、WindowsならF12キーを押して開発者ツールを開きます
  2. HTMLの行にカーソルを合わせると、画面のその部分が青くなります。操作したい場所が青くなる行を、階層を下りながら探していきます
  3. 操作したい場所だけが青くなる行が見つかったら、その中の id="..." の部分がidです
開発者ツールでID入力欄のidを探しているところ
開発者ツールでID入力欄のidを探しているところ

当時のYahoo! JAPANでは、IDの入力欄が username、「次へ」ボタンが btnNext でした。

開発者ツールで次へボタンのidを探しているところ

当時のコード(参考)

2019年に書いて動いていたコードです。Selenium 4.3以降では find_element_by_id が削除されたため、このままでは AttributeError になります。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

username=('id')#ID or メール or 携帯番号
password=('password')#パスワード

browser = webdriver.Chrome()
browser.get('https://login.yahoo.co.jp/config/login?.src=www&.done=https://www.yahoo.co.jp')
time.sleep(10)

user_name=browser.find_element_by_id('username')
user_name.send_keys(username)
btn=browser.find_element_by_id('btnNext')
btn.click()
time.sleep(5)

psw=browser.find_element_by_id('passwd')
psw.send_keys(password)
logbt=browser.find_element_by_id('btnSubmit')
logbt.click()

注意点

  • 自動ログインは、自分のアカウントで使うだけにしてください
  • サイトによっては、利用規約で自動操作を禁止していたり、ロボットかどうかを確かめる画面(画像認証など)が出たりします。使う前に規約を確認してください

まとめ

  • 入力欄やボタンのidは、開発者ツール(F12)で探します
  • find_element(By.ID, 'id名') で選び、send_keys() で入力、click() で押します
  • 待ち時間は、time.sleep() より WebDriverWait のほうが無駄がありません
  • Selenium 4.3以降は find_element_by_id が使えないので、古い記事のコードは書き直しが必要です

ブラウザのスクロールはPython備忘録 selenium ブラウザスクロール編、Seleniumで商品データを集めた記録はAmazonのスクレイピングの記事にまとめています。


退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

-Python
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

関連記事

Seleniumの使い方入門|ブラウザを開いてスクロールする

Pythonでウェブブラウザを動かしてみたいと思い、Seleniumというライブラリを使ってみました。この記事では、Chromeを自動で開いて、ページを一番下までスクロールし、また一番上に戻るところま …

PythonでExcelを操作する方法|openpyxlの基本

Pythonの勉強で覚えた、Excelを操作する方法をまとめました。初心者向けの備忘録です。 結論から言うと、openpyxlで load_workbook() で開き、wb[‘シート名’] でシート …

PythonのPillowで画像処理|切り抜き・回転・リサイズの基本

画像処理というと大げさですが、PythonのPillow(ピロー)を使って、画像を少し操作してみました。 結論から言うと、Image.open() で読み込めば、crop() で切り抜き、rotate …

Tkinterのメッセージボックスで出る謎ウインドウの消し方

Pythonのtkinterでメッセージボックスだけを出したいのに、何もない小さなウインドウ(謎ウインドウ)が一緒に出てきて、処理が止まってしまうことがあります。 結論から言うと、謎ウインドウの正体は …

Amazonのスクレイピングは禁止?Seleniumで試した結果と正しい方法

PythonでAmazonの商品名・価格・ASINコードを集めようとして、普通のスクレイピングでは取れず、何時間も悩んだことがあります。 結論から言うと、Amazonは利用規約でロボットなどによる自動 …