TonamiLog

ゆるキャン△とスノーボードとオタク

pythonとselenium

ハロートナミです。元気?

最近ワークでseleniumのお勉強をしたので備忘録を産みます


Seleniumとは

driverを操作してブラウザを動かすフレームワークとのこと。

今回はpythonから使う。


導入

pip install selenium

別途動かしたいブラウザのdriverが必要なので落とす。

chromeならchrome webdriverとかでググれば出てくる。

使ってるブラウザとdriverの対応バージョンを要確認とのことだったが、どっちも最新にしてれば多分動く。

使ってみる
from selenium import webdriver
 
# ブラウザ起動
driver = webdriver.Chrome('WebDriverを落としたところ/chromedriver.exe')
# google.comにアクセスして表示
driver.get('https://www.google.com/')

そのへんのチュートリアル読んでとりあえず書いたソース。

これを実行するとchromeが開いて、google.comが表示される。

webdriverってのは導入で落としてきたdriverのことで、exeファイルを直接パスで指定する。

.getはgetリクエストを送れってことであってるよな……?


ツールでブラウザを動かす場合、最後はブラウザを閉じた方がお行儀がいいんだろうけど
開発中はすぐ閉じちゃうと何が起きてるかわからんので開きっぱにしておく。

なお、閉じる時は

driver.quit()

とかで閉じれる。


seleniumで出来る事をもう少し掘っていく

from selenium import webdriver
 
# ブラウザ起動
driver = webdriver.Chrome('WebDriverを落としたところ/chromedriver.exe')
# google.comにアクセスして表示
driver.get('https://www.google.com/')

# 検索フォームに文字列を渡す
formInput = driver.find_element_by_xpath('//*[@id="lst-ib"]')
formInput.send_keys('TonamiLog')

# 検索実行
btnSend = driver.find_element_by_xpath('/html/body/div/div[3]/form/div[2]/div[3]/center/input[1]')
btnSend.click()

xpathとかいう概念が出てくる。
xpathとは何かを書くと大変なので省くけどざっくり言うとHTML中の特定要素を指定するための構文です。

driver.find_element_by_xpath('hoge')

これはselenium頻出関数と思われるファインドエレメントバイxpathさんです。
xpathを見て特定エレメントを取得してくれます。そのまんま。
idとかclass名とかでもエレメント取得出来るんだけど、xpathが一番汎用性高いっぽい。
エレメント取得したらそれを操作していきます。

例えば

# 検索フォームに文字列を渡す
formInput = driver.find_element_by_xpath('//*[@id="lst-ib"]')
formInput.send_keys('TonamiLog')

は、idがlst-ibのHTMLタグからエレメントを探してきて
見つかったエレメントにTonamiLogって文字列を渡してる。
これをするとGoogle.comの検索フォームにTonamiLogって文字が入る。すげえ

次に

# 検索実行
btnSend = driver.find_element_by_xpath('/html/body/div/div[3]/form/div[2]/div[3]/center/input[1]')
btnSend.click()

ですが、これは親要素から順に相対パスでエレメントを探してきて
見つかったエレメントをクリックしてます。
これをするとGoogle.comの検索ボタンが押されて検索が実行される。すげえね

最初のうちはページのソース見て唸りながらxpath書いてたんだけど、
普通にデベロッパーツールからエレメント指定して、ソース右クリック>コピー>xpathで要素のxpathがコピー出来ました。
f:id:Thiroyuki:20180517124534p:plain
文明~!

ちなみに、スクレイピングしたいサイトがアプデされたりして構成が変わるとxpathの指定が狂うので
都度指定し直すかid等絶対パス風に指定出来る仕組みを考えたらいいと思います。

send_keys()とclick()の他にはtextとかがあって、その要素の持つ文字列を簡単に取得出来るし
なんならget_attribute('hoge')でなんでも取得出来ます。get_attribute('value')とかget_attribute('innerHTML')とか
このへんまで理解出来るとブラウザ操作は自由自在で基本的な事はだいたい出来ます。やったね

ちなみにajaxとかの非同期処理で来る値をスクレイピングしたい場合にはWebDriverWaitとかの仕組みが用意されていて
説明省くけどajaxの結果が来たらhogehogeとかも書けます。ググるといっぱい出てくる


これで自由にえっち画像をスクレイピング出来るし
Webアプリをブラウザ経由で自動テストしたり
自社のポータルサイトを自動で操作して悪いことが出来るとか
夢が広がるね。よかったですね。

Unityのtutorialをやった

どうもトナミです。元気?

 

最近続きを読む使って記事作ってたんだけどdoom氏やってないし別に見やすくもならないのでいいかってなりました。ごめんね

 

GW中暇だったのでUnityを入れてクソゲーを作る経験をしました。

昔ういのにゃん氏がやってましたね。

uinyan.com

 

UnityはC#とかで簡単にゲームが作れるよって感じのゲームエンジンです。

インストールとかは調べたらいくらでも出てくるので割愛しますが、インストールしてUnityアカウント(?)を作ったらすぐゲーム開発に取り組む事が出来ます。

 

つってもゲームなんて作った事ないし、さっさとチュートリアルに取り掛かります。

「Unity チュートリアル」とかで検索するといくらか出てくるんですけど

unity3d.comとunity3d.jpチュートリアルの内容が違います。

 

多分.comの方が最新っぽいんですが内容が英語になっていたので.jpの方のチュートリアルをやっていきます。

tutorial.unity3d.jp

これです。

 

基本的にソースコピペすれば出来るんで特にコメントは無いんですが

Playerオブジェクトを追尾するカメラを作るパートだけ、UnityのバージョンのせいかGetComponent()関数がエラーになりました。

チュートリアルだと

GetComponent().position = target.position;

ですけど、これは

GetComponent<Transform>().position = target.position;

じゃないと動かないと思います。

 

気になった(ハマった)のはそれぐらいで、モリモリ作っていくとゲームが出来ます。すげえ

ゲームプログラミングもC#も全然分かってないけど3時間ぐらいでチュートリアルが終わって

盤上のボールを矢印キーで動かして、アイテムを集めるゲームが出来ました。

ざっくりとUnityにおけるコンポーネントの考え方にも触れられました。よかったですね

ただまあ、こんな簡単に作れるんだスゲーと思う一方で、これ使っても自分が普段やるようなゲームを作れるかって言われると想像つかないんで

ゲーム作ってる人たちは凄いですね。

 

日本酒飲みながらチュートリアルで作ったゲームを適当に編集したクソゲーがこれです

ダークソウルだね

roll a ball | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

 

フェードイン・フェードアウトとか、それっぽいワードで検索すればいくらでも手法が出てくるので便利。時代はインターネット

DAW入れて音楽作るぞ~みたいになった時も感じたけど、とにかくhey guys動画を漁っていけば

今までクリエイティブだと思われていた何かが作れるんですよね。

これだけ制作が身近に簡単になったのは趣味の上ではありがたい一方で

お仕事クリエイターの人は本当に大変だろうなとか

センスと努力が半端ないんだろうなとか想像してしまいますね。

なんだかんだで音楽と漫画とゲームが何時迄も大好きなので

クリエイターの方には頭が上がりません。

いつもありがとうございます。

 

おわり