Puppeteer(パペティア)+ PyAutoGUIで、
今風かつ無敵なブラウザ自動操作を
実現したみた(い)


Python駿河 勉強会 #4 2019.8.24

お前誰よ?(1)


  • 趣味
    • ドライブ
      (クルマは、所有欲を満たす存在としてではなく、
       移動手段として好きです)
    • 映画鑑賞(雑食系)
    • 天体観測(最近、全然できてないけど)
    • 子ども相手の野外活動
      (野外炊飯、レクリエーション、小物のクラフト等)
    • 読書(雑食系)
    • 他もろもろ(やっぱり雑食系。興味が移ろいやすい)
### お前誰よ?(2) - 本業 - 業務系システム(具体的には、生産管理・原価管理) SE・プログラマ・時々マネージャもどき - 過去本業 - EC(いわゆるネット通販)モール・カートシステムの導入保守SE Ruby on Rails・Yiiなど
### アジェンダ 1. ブラウザ自動操作の手段について → Puppeteerのご紹介 2. 考えた → やりたいこと 3. PyAutoGUIのご紹介 4. python-shellで PuppeteerとPyAutoGUIとを組み合わせてみた(い)
### 1. ブラウザ自動操作の手段について ### → Puppeteerのご紹介 スクレイピング(= Webからの情報収集)が主眼だと ちょっと違う選択肢もありますが(Beautiful Soup, Scrapyなど)、 ここではWebアプリのテスト等を主眼として ブラウザの自動操作を可能にしてくれるライブラリを挙げてみます。
- 定番のSelenium - 強み - 様々なブラウザの自動操作が可能である。 - 長年使われており、Web上の情報が豊富である。 - Python, Ruby, Java等、様々な言語から使用可能である。 - 弱み - 環境構築がちょっと煩雑 - 自動操作するブラウザに対応したドライバが必要 - ブラウザだけバージョン上がり、 ドライバがそのバージョンに対応してなくて 動かなくなった……といったトラブルに時々出くわす。
- 最近名を聞くPuppeteer(パペティア) - 強み - 環境構築が簡単。ただし……(後述)。 - 天下のGoogleChromeが公式に提供しているという安心感あり。 - slowMoオプションで、実行速度を簡単に変えることが可能(らしい)。 - 実際に画面を起動せずに操作する(= ヘッドレスモード)ことが容易。 - Chrome拡張機能のPuppeteer recorderを使って、 RPAみたく、手動操作結果から自動操作スクリプトを自動生成することが可能 (注: Seleniumにも同様のオプションはあります) - 弱み - Chromeにしか対応していない。 - そして……。
この会的には、 大変残念なPuppeteerの弱みとして……。
自動操作スクリプトが、Pythonでは書けません! Node.js(= サーバサイドのJavaScriptエンジン) です。orz
とはいえ、PythonでPyppeteerを使うという手が、なくも無さそう。 ### 手段1. Python移植版のPyppeteerを使ってみる Puppeteer (Chrome の自動操作ライブラリ) を Python に移植してpyppeteerという名前で公開しました(miyakogiさん) https://miyakogi.github.io/blog/20170902/pyppeteer.html#.XWCMUej7Q2w オープンソースって素晴らしいですね。 ### 手段2. Node.jsライブラリのpython-shellを使って、Node.jsからPythonスクリプトを呼び出す
Pyppeteerもたいへんそそられるのですが、 Puppeteer recorderでPuppeteerスクリプトを自動生成できるメリットを生かしたいので、 今回は手段2.を突き詰めてみようと思いました。
### 2. 考えた → やりたいこと - SeleniumやPuppeteerで自動操作できない or 難しいWebページもある……。 (HTML5で画面全体を描画してるページとか。 SeleniumやPuppeteerでのDOM解析というアプローチでは、 こうしたページのテキストボックスやボタンにアクセスできない) こうしたページの操作も自動化したい。 - Webブラウザの外の、別のGUIアプリからデータを取って、 Webページのテキストボックスに貼り付けたりとかしたい。
そこで。
### 3. PyAutoGUIのご紹介 - キーボード入力やマウス操作などのGUI操作を自動化するスクリプトをPythonで書ける、簡易RPA。 - テキストボックスやボタンの検知は、画像マッチングで行う。 - 簡潔にまとまった良記事 - PyAutoGUIでマウス操作などのGUI操作する方法 - 白猫学生のブログ http://whitecat-student.hatenablog.com/entry/2016/06/27/010812
### 4. python-shellでPuppeteerとPyAutoGUIとを組み合わせてみた(い) まだそこまで試せてないんですが……。 とりあえず、Node.jsスクリプトから、 PyAutoGUIを使ったPythonスクリプトを呼べることは無事確認できました。 ↓ PyAutoGUIでただスクショを取るだけのPythonスクリプト。 ```python:pyauto.py import pyautogui pyautogui.screenshot('test.png') ``` ↓ そのPythonスクリプトを呼ぶNode.jsスクリプト。 ```python:pyauto.py var {PythonShell} = require('python-shell'); PythonShell.run('pyauto.py', null, function (err, result) { if (err) throw err; }); ```
### ご静聴、 ### ありがとうございました!