こんにちは!estie(エスティ)で事業開発責任者をしております田中と申します。
こちらはestie Advent Calendar 2021の【18日目】の記事となります!
この記事の背景
一昨年estie Advent Calendar 2019に拙稿を出させていただいてから早2年。
去年はお休みをいただいておりましたが、今年も打順が回ってきましたので僭越ながら寄稿させていただければと思っております。
私は変わらずビジネスサイドにいるので、技術的な話よりも開発なにそれ?って人がよりプログラミングを身近に感じていただける内容を意識しています。Advent Calendarという事で温かい気持ちで読んでいただければ幸いです。
また、社内の投稿予定を見たところ、結構業務に近しい内容多めなので、あえてネタ系に走ってます!笑
ご了承を。
それでは行ってみましょう!
プログラミング歴(前回からの差分中心)
python
ほぼ変わっておらず。そもそも業務で使う機会もあまりなく。。
初心者レベルです。
SQL
めちゃくちゃ向上しました。(自画自賛)
estieは不動産事業者の意思決定を高度化するデータベース及びアナリティクスツールestie proを提供しているのですが、
- こういうデータ出せないの?というお客様への対応
- データを元に新しい価値を提供するための初期仮説構築
- ログに基づくお客様の利用状況の定量的な分析
等をよりスピーディに行おうとする中で自然に身につけました。今では複数DBエンジンでの記法の使い分け、jsonをparseする関数やwindow関数なども活用しており、不動産屋から転身して何やってんだ感が我ながら半端ないです笑
社内では業務であまり触らないビジネスサイドやデザイナー等向けにSQL勉強会を毎週行っているのですが、なぜか中級コースの講師を務めさせていただくまでになりました。
余談ですが、社内slackに#times_hogehogeという業務に関係ない内容を自由に投稿して良いチャンネルがあるのですが、そこでhelpとも言えないぼやきを投稿するとすぐにエンジニアが助けてくれる環境があったからこそ、ここまで来れたかなと思っています。大感謝。
テーマ決め
突然ですが、みなさんサイゼリヤガチャってご存知ですか?
1,000円という予算の中で、サイゼリヤの数あるメニューの中からランダムで注文する品を提案してくれる人気webアプリです。
良い感じのフルコースを提案してくれることもあれば
ほぼ酒やんけ!みたいなメニューが提案されることも。
このサイゼリヤガチャ産みの親であるmarusho氏がestieと深い関わりがあることもあり、よくガチャで遊ばせていただくのですが、しょうもないこと大好きな私はこう思ってしまうのです。
やみつきスパイス(50円)みたいなメニューばっかりを引き当てたい
と。(誰得)
最初は文系らしく、ひたすら「ガチャを回す」ボタンを押し続けるのですが、100回くらい回したところで気付きます。これは人の手では厳しいと。。
そうだ、プログラミングしよう
という事で慣れないpythonに手を出したのが始まりとなります。
環境
% python3 -V
Python 3.8.2
1. まずは情報収集
今回やりたい事はプログラムが自動でやみつきスパイスばっかりになるまで「ガチャを回す」ボタンを押してくれる事です。とりあえず自動でクリックをしてもらうことが必要そうなので、「python webページ クリック」とかでググってみる。
早速seleniumというライブラリがそれをやってくれそう、ということがわかりました。
参考
どうやらボタン部分のhtmlタグを指定してあげれば良さそうです。(知った風)
サイゼリヤガチャのページでボタン部分で何のclassが使われているのかを検証ツールで見てみる。
class = btn
を指定してあげると良さそうです。
また、メニューはh2タグで書かれているので、h2タグの件数を数えて求める件数になるまでは回し続ける、という感じで書けばいけそうな気がしてきました。
2. 書いてみる
必要なライブラリとchrome driverのインストールを済ませ、先人の皆様のお知恵を拝借しつつ(コピペ)書いてみた。
# coding: UTF-8
from selenium import webdriver
import requests
import time
from bs4 import BeautifulSoup
driver = webdriver.Chrome('{ChromeDriver のパス}')
url = 'https://saizeriya-1000yen.marusho.io/'
driver.get(url) # ページを開く
r = driver.page_source # ページソースを取得
count = 0
for r in r:
r =driver.page_source
soup = BeautifulSoup(r, 'html.parser')
h2tags = soup.find_all('h2')
h2_count = len(h2tags)
print(h2_count)
count += 1
if h2_count >9:
print('finish')
print(count)
time.sleep(300)
break
driver.find_element_by_class_name('btn').click()
プロダクションコードではないので動けば良いのです。細かいところは気にしないでください(小声)
3. 求める結果が出るまで回し続ける
大体メニュー数は3〜5になることが多い印象ですが、今回は「9品以上」を目指してみたいと思います。
(補足:合計金額やカロリーの表示列もh2タグのため、上記コードではh2_count >9
を指定しています)
よさそうううううう!!!
これ等倍速です。技術の力すごい...
ただ、なかなか9品以上にならないので、ターミナルを複数立ち上げて並列処理してみる。
キタァァァァァァァ(満足)
半熟卵2つ乗っけて野菜ペーストとやみつきスパイスを添えたペペロンチーノに、コーンクリームスープと、グラスワイン3杯。
意外とまともな食事ができそうです。恐るべしサイゼリヤ...
ちなみにこの結果が出たのは14,455回目でした。並列で4つ回していたので、約6万回回して初めて9品出たということになります。人力で狙っていたら1日かかっていたことでしょう。ガチャって怖いですね。
4. 食べてみる
見たこともないペペロンチーノが爆誕しました。
また、グラスワインが1杯100円とは思えない量であり、しっかり酔っ払いました。
サイゼのコスパ本当すごい、みんな行くべき。
ご馳走さまでした
領域を超えて
以上、ビジネスサイドが再びプログラミングしてみました!
本記事の内容はお遊び半分でしたが、estieでは顧客に提供する価値を最大化するために日々の業務でもこのように開発<>ビジネスという枠を乗り越えた協業がたくさんあります。CTOが顧客のオフィスに1日張り付いてインタビューさせていただいたり、ビジネスサイドが開発側のスクラムイベントに出たり(詳細書き出すともう10記事くらい書けそうなので割愛します)。
私個人に関して言うと日々の業務でSQLを書きすぎて
という煽りスタンプをslackで押されることが常態化していたのですが、実は遂に年明けからPdMにジョブチェンジすることとなりました。このように今までのあり方にとらわれず、現時点でなにが最適であるかを日々議論し、スピーディに実行に移す環境がestieにはあるなと感じています。
終わりに
estieでは不動産業界という巨大な伝統産業に対して、デジタル技術を活用し「産業の真価を、さらに拓く。」ために日々試行錯誤を続けています。
プロダクト・組織ともにまだまだ発展途上なので会社をともに成長させていくための仲間を全方位募集中です!少しでも興味を持っていただき話を聞いてみたいという方がいらっしゃいましたらDMでも、下記ページでもお気軽にお問い合わせください!