作ったものを振り返る Part1.2

初めに

教習所予約確認botは全てPythonで実装しました。

概略

ここではログイン処理とソースの取得について振り返ります。

ログイン処理

ログインの方法はCookieを使う方法 や 仮想ブラウザを使う方法 がありますが、今回は動的なページに強い・実装が楽(ツカッテミタカッタ)というので仮想ブラウザを使う方法を選択しました。

というわけで以下ではSeleniumchrome-webdriverを使用した説明を行います。

流れ

  1. 図1. のように使用しているブラウザの開発者ツールを表示させ、対象となるログインフィールドのxpathを取得
  2. そのフィールドにusernameとpasswordをsend_keys()を用いて入力
  3. ログインボタンのxpathを取得してclick()

たったこれだけでログイン処理ができてしまいます!

このログイン処理をすると仮想ブラウザ内でログイン処理をした後のページ(図2)に遷移します。

[caption id="attachment_77" align="alignnone" width="600"]login 図1. ログイン画面[/caption]

[caption id="attachment_78" align="alignnone" width="300"]select_car_type 図2. 車種の選択[/caption]

車種の選択

図2のページでは車種を選択します。

流れ

  1. selectタグ形式であるので、select形式として取得
  2. 車種が番号で識別されているので、番号を指定して車種を指定
  3. OKボタンを取得してclick()

これで図3のように車種を指定したときの予約ページに遷移することができました!

このページについてスクレイピングをしていきたいのでこのページのソースを返してブラウザの処理は終了です。

ブラウザをclose()しないとメモリに残るので注意しましょう。

[caption id="attachment_79" align="alignnone" width="600"]reservation_list 図3. 予約リスト[/caption]

GPUを使いたくない

Seleniumchrome-webdriverは標準ではGPUを使った実行がされます。

もともとの構想としてHerokuでの定期実行を行いたかったのでGPUを使いたくなかったわけです。

そんな時に見つけたのがこの記事です。

chrome-driverのoptionでheadless指定をしてあげるだけです!簡単ですね!

注意

Herokuで運用し始めようとした時にこのwebdriverの部分でエラーが出ました。

解決方法としてはこの記事にある通り

の2つをbuildpackに追加するのと

options.binary_location = '/app/.apt/usr/bin/google-chrome'
self.browser = webdriver.Chrome(chrome_options=options)

のようにバイナリの場所を指定してあげる必要があります。