初めての PyAutoGUI
スクレイピングがうまくいかん!
webdriver を使えばだいたいにおいてスクレイピングがうまく行くのですが、時々サーバー側で監視しているウェブサイトがあります。そういうちゃんとしたウェブサイトは、webdriverでのアクセスがくると Access Denied を返してきます。
そんなウェブサイトを攻略するために PyAutoGuiを使ってみることにしました。
PyAutoGUI を試す
PyAutoGUI とは
Welcome to PyAutoGUI’s documentation! — PyAutoGUI documentation
PyAutoGUI とは python コードで自分のマシンのマウスとキーボードをコントロールするライブラリです。ロケットマウスという自動化ソフトがありますが、それを python で自作したい時などに使えるんじゃないかと思われます。Windows, macOS, Linux, で動き、Python 2系、3系どちらでもOKです。
使用例
お寿司ゲームをさせているところのようです。
ゲームのアプリケーションウィンドウを見ながら、お寿司の注文画像を探し、見つけるとネタのボタンをクリックして注文完了させたり、食べ終わったお皿を回収したりしてるそうです。
面白みはわからんけど、このボットを使うとゲームを7日で終わったということだそうです。
今回やりたいこと
webdriver でスクレイピングしても、サーバーにバレちゃうのかどうしてもデータが取れないウェブサイトがありまして。とりあえずそこのデータを取ってくるのが目標です。よって
- Chromeブラウザを開く
- 該当ウェブサイトへ行く
- データが取れているか確認して、取れたら右クリックでソースを保存
という流れになります。
私の環境
$ cat /etc/os-release
NAME="Linux Mint"
VERSION="19.3 (Tricia)"
ID=linuxmint
ID_LIKE=ubuntu
PRETTY_NAME="Linux Mint 19.3"
VERSION_ID="19.3"
HOME_URL="https://www.linuxmint.com/"
SUPPORT_URL="https://forums.linuxmint.com/"
BUG_REPORT_URL="http://linuxmint-troubleshooting-guide.readthedocs.io/en/latest/"
PRIVACY_POLICY_URL="https://www.linuxmint.com/"
VERSION_CODENAME=tricia
UBUNTU_CODENAME=bionic
インストール
今回は python3.7を使いました
$ mkdir pyautogui-test
$ cd pyautogui-test
$ python -m venv .venv
$ source .venv/bin/activate
$ touch requirements.txt
pyautogui
$ pip install -r requirements.txt
Linux の場合
もしスクショを取りたい場合は、scrot というアプリケーションをインストールしておきます。
$ sudo apt-get install scrot
参照:Installation — PyAutoGUI documentation
リンク先には、以下2つもインストールしろと書いてあったけどとりあえず無視。
$ sudo apt-get install python3-tk
$ sudo apt-get install python3-dev
PyAutoGUI を使ってみる
Cheat Sheet — PyAutoGUI documentationに従ってインタプリタから実行してみます。
マウスコントロールをやってみる
>>> import pyautogui
# スクリーンサイズ確認、私は二枚スクリーンなので widthが広い
>>> pyautogui.size()
Size(width=3840, height=1080)
# 現在のマウスの場所確認
>>> pyautogui.position()
(187, 567)
マウスの場所は左上(0,0)からスタートします。
0,0 X increases -->
+---------------------------+
| | Y increases
| | |
| 1920 x 1080 screen | |
| | V
| |
| |
+---------------------------+ 1919, 1079
# ctrl + c で抜けるまで、マウスの場所を出力し続けるスクリプト
import pyautogui, sys
print('Press Ctrl-C to quit.')
try:
while True:
x, y = pyautogui.position()
print(str(x).rjust(4), str(y).rjust(4))
except KeyboardInterrupt:
print('\n')
(注意:このスクリプトを実行した後は、一旦インタプリタをクローズしないと行けなかった。理由はわからん。私だけかも)
# クリック
pyautogui.click()
# マウス右クリック
pyautogui.click(button="right")
# もしくは
pyautogui.rightClick()
課題をやる
browser を操作
python の標準モジュール webbrowserを使います。
import webbrowser
webbrowser.open("https://github.com/") # githubはあくまで例
マウスを適当な場所へ移動し、内容を保存
ブラウザ(chrome)の名前を付けて保存(A)のホットキーである ctrl+s
を使ってページの内容をローカルに保存します。
time.sleep(5)
pyautogui.moveTo(300,300)
# 右クリックしなくてもホットキーを使えばよかった
#pyautogui.rightClick()
pyautogui.hotkey('ctrl', 's')
# 保存する名前を指定するウィンドウがでてくるので適当に名前を与える
pyautogui.write('test.html')
pyautogui.press('enter')
反省
-
pyautogui.moveTo(300,300)
はかなりダメ。ブラウザの開く場所を保証した上で行うならまだしも。 - ブラウザのボタンの位置を探す必要がある。これは別途考える。
Discussion