はじめに
お久しぶりです。就活が忙しくて、あんまり技術系の勉強が出来なかったですが、就活が無事終わったので、記事を書きます。実はバイト先の人に頼まれた、業務自動化に関して、ぶち当たった壁についてまとめます。
また、この記事のC♯バージョンとして、以下の記事を参考にしました。@yk109さんには本当に感謝しています。それに、Teratailの記事もとても参考になりました。URLを載せておきます。
・参考記事:SeleniumのChromeDriverで起動済みのブラウザを操作する
・参考記事:Seleniumで既に開いているウィンドウ
誰向けの記事?
この記事は、
・”起動済み”のブラウザを、Pythonで自動操作したい人(Windows上)
・pythonによるseleniumがとりあえず使える人
に向けた記事です。seleniumのインストールとかは省きます。他の記事を参考にしてください。
まあ調査背景として、Python+Seleniumの解説記事のほとんどが、
「Pythonファイル実行」⇒「ブラウザ自動立ち上げ」⇒「そのブラウザを自動操作」
っていうのばかりですが、
「私がブラウザ上で操作」⇒「Pythonファイル実行」⇒「そのブラウザを自動操作」
っていうプロセスを説明する記事があまりなかったので、私がまとめました。(素人が素人向けにまとめる記事なので、なるべく丁寧に書きますが、間違いがあったらご指摘ください。)
私自身の為にも、説明多めで書きます。うざかったらごめんなさい(m´・ω・`)m ゴメン…。でも楽しく書いていきます!
処理手順
やることは2つです。①「Chromeのポート番号を固定し、起動する」②「ポート番号を頼りに、Seleniumがブラウザを認識し、操作する」
①Chromeのポート番号を固定し、起動する
chrome.exeのパス探し
実はChromeでは、EXEファイル実行時にパラメータを渡してやることによって、クライアント側であるChromeのポート番号を固定することが出来ます。その為にもまず、Chrome.exeのPathを知っておくと便利でしょう。という事で、Windowsのアプリ一覧から、下の3枚の画像みたいに、Chromeのパスを探していきましょう。
1.アプリ一覧からChromeを右クリックし、その他から「ファイルの場所を開く」をクリック
2.ショートカットに飛ばされるので、それを右クリックし、「ファイルの場所を開く」をクリック
3.chrome.exeがある場所が示されるので、ここまでのパスをメモする。
私の場合、パスはC:\Program Files\Google\Chrome\Application\chrome.exe
でした。
ポートを固定する引数を指定しながらchrome.exeを実行する
Chromeは、コマンドプロンプトから実行する場合、引数を指定できます。そして今回、以下の2つの引数を指定します。
-remote-debugging-port=9222
--user-data-dir="適当なパス(chromeのデータがいっぱいできても良い場所)"
上のremoteなんちゃらは、chromeのポート番号(クライアントとサーバーでいうと、クライアント)を9222番に固定しています。そして、userなんちゃらは、chromeを動作する上での、諸ファイルを保存しておく場所です。適当でいいですが、結構沢山ファイルができるので注意です。
そして、コマンドプロンプト上で、以下のコマンドを実行する事で、ポート番号を固定しながらchromeを開くことが出来ます。
"C:\Program Files\Google\Chrome\Application\chrome.exe" -remote-debugging-port=9222 --user-data-dir="適当なパス(chromeのデータがいっぱいできても良い場所)"
実行コマンドをbatファイルにする
このままでは、chromeを実行するたびに、コマンドプロンプトでながぁ~いコマンドを打ち込まなきゃいけません。めんどうですね。なので、上記の内容をバッチファイルにしておきましょう。メモ帳上で以下の内容を書き込んで、拡張子を".bat"で保存すればokです。
"C:\Program Files\Google\Chrome\Application\chrome.exe" -remote-debugging-port=9222 --user-data-dir="適当なパス(chromeのデータがいっぱいできても良い場所)"
適当なサイトにアクセスする
先ほどのバッチファイルをクリックして、chromeを起動し、適当なサイトへアクセスしてみてください。試しに、阿部寛のサイトへアクセスしてみます。阿部寛のサイトを開いたら、chromeはそのままにしておいてください。
1.さっき作ったバッチファイルをクリック
2.chromeが起動(今回はゲストモードで起動)
3.阿部寛の公式サイト(http://abehiroshi.la.coocan.jp)へアクセスする。
②ポート番号を頼りに、Seleniumがブラウザを認識し、操作する
開いているchromeのIPアドレスを確認する
selenium側から、既に開いているchromeブラウザを探すとき、IPアドレス+ポート番号が必要になります。それを調べるためにも、コマンドプロンプト上で、以下のコマンドを入力しましょう。やってることはnetstat
でポート番号を絞って検索しているだけです。
netstat -nao | find ":9222"
そして、さっき開いたブラウザが起動していれば、以下の画像のようにIPアドレスとポート番号が見れます。見れない場合は、ブラウザを閉じちゃったとか、タブを開いたり閉じたりしちゃったとかです。バッチファイルをクリックするところからやり直してみてください。
私の場合、以下のIPアドレスでしたね。これを使います。
127.0.0.1:9222
PythonのSeleniumから、開いているChromeのページタイトルを取得する
ここまで来れば、もう完成です。Pythonファイルを作り、以下のコードを記述してください。(このソースをそのまま使う場合、chromedriver.exeを同じフォルダ内においてください)途中のオプションで、先ほどのIPアドレス+ポート番号を使っています。
from selenium import webdriver
from os.path import join
root = join(__file__, "..")
# webdriverオブジェクトを作る(ブラウザが開く)
driver_path=join(root, "chromedriver.exe")
# 起動時にオプションをつける。(ポート指定により、起動済みのブラウザのドライバーを取得)
options = webdriver.ChromeOptions()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(executable_path=driver_path, options=options)
# ページのタイトルを表示する
print(driver.title)
print("========== source ========== ")
print(driver.page_source)
これを実行してみると、阿部寛の情報が表示されますね(シンプルなHTMLソースも表示されますね)。
また、今開いているブラウザ上で、他のサイトにアクセスして、もう一回Pythonファイルを実行すると、アクセス先の情報に変わるのが分かると思います。
最後に
ユーザーが操作している起動済みのブラウザを、Pythonで随時監視するのって、意外とやろうとしている人いないんですかね。公式のドキュメント以外だと、参考記事くらいしかなかったと思います。
私と同じ状況になった誰かさんの為にも、説明多めの記事を書きたかったので、今回まとめました。就活も終わったし、いろいろ頑張っていきたいと思います👍それじゃ!