Selenium記事第2弾です。と、メルカリのお話。
※途中出てくるコードはVBです。
現在Seleniumを使ってChromeを操作しているのですが、ログインが必要なサイトの自動操作を行う場合、特に何もせずに以下の様な記述でChromeを立ち上げると・・・
chromeDriver = New ChromeDriver() chromeDriver.Start() chromeDriver.Get(url)
この様に処理を実行する度にログイン画面を経由する状態となってしまいます。
ですが、IDとパスワードを入力してログインボタンを押すだけ-
という様なサイトであれば、ただ入力を自動化してしまえば良いだけなので何も問題は無いのですが・・・
問題はreCAPTCHA等のbot対策がされているこういったサイトの場合。
この場合はプログラムで突破するのが非常に困難になります。
とりあえずはこのフォームを検知した時点で一旦処理を止めて、手動で認証を行い通過できたら処理を再開させる。という形で何度か運用してみましたが・・・。
非常ーに効率が悪い!そりゃそうだ。
という事で起動時に毎回出現するこのログインフォームを何とかしようというお話です。
対策としては考えられるのは以下の4つ。
- 処理を止めてユーザーが人力で認証を行う
- プログラム上で突破する仕組みを追加する
- 既にログイン済みで開いているブラウザを利用する
- 最初だけ認証後、セッション情報を保持しておいてログイン状態を維持する
1は既に試した結果、手間が掛かりすぎるので×
2は技術的に厳しいので×
3は出来そうに無いので×
という事で4の方法で何とかできないかを検討してみました。
何か難しそうに聞こえるかもしれませんが、そもそも普段PCを起動してブラウザを立ち上げると、開いていたタブとかログイン状態含め前回終了時の状態そのままで起動しますよね。(注:ブラウザの設定によります)
要はそれと同じ事をしようと言うだけです。
という事で色々と調べてみた結果・・・
なんと従来の起動処理に1行追加するだけで解決しました!!!超簡単!
' [今までの処理] chromeDriver = New ChromeDriver() chromeDriver.Start() chromeDriver.Get(url)
' [修正後の処理] chromeDriver = New ChromeDriver() ' PROFILE_PATHは定数として宣言済み chromeDriver.AddArgument("user-data-dir=" & PROFILE_PATH) ' ← 追加 chromeDriver.Start() chromeDriver.Get(url)
※ちなみにChromeの場合ですので、FirefoxやIEの場合はまた書き方が変わります。
ここで追加している「user-data-dir」で指定しているものは、「プロファイル(のパス)」です。プロファイルにはcookieやら履歴、ブラウザの設定情報などが含まれています。
既にChromeをインストールしている場合は、以下の手順で確認出来ます。
①Chromeを起動する
②アドレスバーに「chrome://version」と入力し、エンター
③Chromeの情報が表示されるため、「プロフィールパス」のフォルダを開く
フォルダの中に様々なデータが含まれているのが確認できると思います。
つまりこのフォルダの情報を読み込む事で、サイトのログイン状態も維持できるという事ですね。
一つ注意点として、上のソースコードで「PROFILE_PATH」と宣言している部分の中身はバージョン情報画像赤枠内の
「C:\Users\%username%\AppData\Local\Google\Chrome\User Data\Default」
ではなく、最後の「Default」は省いた
「C:\Users\%username%\AppData\Local\Google\Chrome\User Data」
を記述します。
「Default」まで記述してしまうと読み込みが出来ませんので注意して下さい。
既存のプロファイル情報を使用したく無い場合は、適当に作成した空フォルダのパスを入力すればOKです。その場合は「chromeDriver.Start()」を実行した時点でプロファイルデータが自動生成されます。
これで、一度ログインすれば次回以降は既にログイン済みの状態を維持する事が可能になりました。
プロファイルは上記手順で幾らでも追加できますので、これを使えばアカウントの切り替えなんかも簡単に実装できますね。
ちなみに、プロファイルが既に使用されていた場合は以下の様なエラーが出ます。
これは、既に起動済みのChromeがそのプロファイルを読み込んでいるという事なので、起動しているChromeを終了させてプロファイルを解放すれば動作するはずです。
※エラーが続く様であれば新規プロファイルを設定すれば動く様になります。
以上、今回はここまで。
また活用できそうなものが見付かれば紹介していきます。
コメント
こんにちは。メルカリ出品ツールを利用させていただいているものです。本当にこのツールには大変お世話になっています。ラクマバージョンは今のところ公開予定はない状態でしょうか?
いま、Pythonを勉強中でれいんさんのホームページを参考にさせて頂いております。
将来的に同じように自動出品ツールや分析などできるようになりたいと思うので今後も参考にさせていただければと思いますのでよろしくお願いします。
本当は6月にラクマ機能も追加しようと思っていたのですが、修正する時間が取れず伸び伸びになっておりました。
ラクマ版を作る予定はあるのですが、時期は未定です。すみません。
Defaultまで書いていたせいで、うまく動作しませんでした。
非常に助かりました。ありがとうございます!
firefox ではどのように既存のプロファイルを読み込めば良いのでしょうか?
※ちなみにChromeの場合ですので、FirefoxやIEの場合はまた書き方が変わります。
↑
この一文が知りたい…
[…] Seleniumで次の実行時にもサイトのログイン状態を維持したい場合 […]