42Tokyoで実施されたPythonイベントに参加してきました。
2DAYSワークショップ『PYTHON自動化プログラムコンテスト』【株式会社ケアリッツ・テクノロジーズ × 42 TOKYO コラボイベント】
概要
このワークショップでは、4人組のチームで、Pythonを用いて「自動化したら便利」と考えられるものをプログラム開発してもらいます。
ケアリッツ・テクノロジーズの開発理念である「本当に役に立つシステムを造る」を、2日間の実践を通じて体感できるワークショップとなっています。
■ スケジュール
12月16日(土)・12月17日(日)10:00〜18:00
<1日目 12/16(土)>
10:00〜11:00 概要説明/サンプルの解説
11:00〜18:00 チーム開発1日目
<2日目 12/17(日)>
10:00〜16:00 チーム開発2日目/発表準備
16:10〜17:30 各チームの成果発表/投票タイム
17:30〜18:00 結果発表 *上位チーム表彰
18:00〜 懇親会(最大20:00まで)
チームメンバーの構成
名前 | 役割 | Python歴 |
---|---|---|
subaru | 運命の人を探すプログラム | 1週間 |
neko | スクレイピング | 1年 |
yuto | スクレイピング | 3ヶ月 |
fukui | PythonGUI表示 | 未経験 |
アイデア出し
今回のテーマとしては「Pythonで自動化して役立つものを作る」であり、課題概要を含め考えた際に、実装方法よりアイデア勝負だと思った。そのため、他に類似しているものが無く、オリジナリティがあるものが望ましいと考えた。アイデア出しの中で、nekoさんが「フォローしている人のフォローしている人を検索できるシステム」というアイデアを出してくれ、色々話し合った結果、それを作ることにした。話が進んでいくにつれ、筆者も昔に似たようなことをInstagramでやってた事を思い出した。
それは、フォローしてる人のフォローしてる人のフォローしてる人達の中で新たな出会いを求めることだ。
図にすると次のイメージである。
このシステムを使う上で必要な情報↓
- ユーザーのアカウント名
- そのアカウント名のパスワード
- 共通の友人がいるアカウント名を2つ
これらの情報を入力することで運命の人の候補が出せるという訳だ。
Instagramの利用規約とプライバシー ポリシーには常に従う必要がある。スクレイピングはユーザーの権利を侵害したり法律に違反したりすることなく、倫理的かつ責任をもって行う必要がある。
作業
進め方としては、タスク管理はGithubの issue、共有したい情報はGithubの Wikiに記述した。オフライン開催だったので、みんなで集まりながら作業を進めた。
自動ログイン
実装する上で大変だったところは、Instagramに自動ログインすることができなかった事である。webスクレイピングする際によく使用される Selenium
ライブラリの機能は使えなかった。理由としては、スクレイピング対策をされていたからだ。そこで、Microsoft社が提供しているplaywright
ライブラリを使うことで問題解決できた。
フォロー一覧取得
InstagramのAPIで、アカウントがフォローしている人を取得する機能は無く、webスクレイピングしてフォロー一覧を取得する必要があった。しかし、web版では1回の読み込みで表示されるアカウント数は12人であり、スクロールしても新しいアカウント名が読み込まれず、情報を取得できなかった。これは手動でも同様の結果であった。
次の日、読み込みされない問題は開発者モードのモバイルエミュレータを使ったら、解決することがわかった。しかし、この状態でスクレイピングするのは通常のweb版との動作が若干異なっており、時間内に対応させることは出来なかった。
運命の相手を探すアルゴリズム
実装手順としては次の通りである。
- 自分がフォローしているアカウント名を格納する
my_list
を作成。 - 引数で渡された2つのアカウント名(文字列)をエラーチェックする。
- 2つのアカウント名から名付けられたリストを作成。(
a_list
,b_list
) - 2次元List
x_list
を作成。 -
a_list && b_list && not my_list
に含まれてるアカウント名をx_list
の要素1に格納する。 -
x_list
の要素1がフォローしているアカウント名をx_list
の要素2に格納する。 -
x_list
のインデックスサイズ分繰り返し処理を行い、x_list
の要素2でnot a_list && not b_list && not myList
を求める。 - リスト
y_list
を作成し、求めたものをy_list
に格納する。
実装の仕方
ChatGPTに実装手順を入力して、コードを書いてもらった。書いてもらったコードはnekoさんと一緒にコードの調整を行い機能を実装した。
筆者はpythonがほぼ未経験で2日間での実装だったため、今回はフルスクラッチで書くのは諦めた。
本来pythonの勉強をするという面では良くないが、プロダクトを完成させる方を優先したため仕方ない。
振り返り
良かった点
・ 自分達が自動化したい機能であったため、モチベーションが上がり開発していて楽しかった。
・ 懇親会の際にたくさんのメンターから、フィードバックを貰えて新たな課題が見つかった。
・ webスクレイピングについての理解が深まった。
・ Githubでタスク管理と情報共有がしっかり行えた。
悪かった点
・ pythonのGUIを動かせる環境がチームメンバー1人だけだった。
・ 開発者モードのモバイルエミュレータを移行する作業をギリギリまで行っていたので、早めに見切りをつけてマージ作業にうつるべきだった。
・ エラーチェックを怠っていたので、バグの原因を見つけずらかった。
今後
もしこのプロダクトを進めるのであれば、次のことをやっていきたい。
- プロダクトを一旦完成させる。
- ユーザーの好みやマッチング度などを測れる機能を作る。
最後に
時間内にプロダクトが完成しなくて、ほんとに悔しい。ちなみに、順位は8位でした。参加した感想としては、チームメンバーのレベル間が近かったため、みんなで楽しく作業できた。チームメンバーは普段喋ったことない人達だったが、これを機に仲良くなれたので良かった。
2日間という短い期間だったけど、またこういうイベントに参加したいですね。
このイベントを主催してくれたケアリッツ・テクノロジーズ様と42Tokyoには感謝です!ありがとうございました!