
エンジニアリング
recherche-maison.com:物件広告からDPEを見つける
自分で作って、自分で販売しているSaaSです。フランスの不動産広告に書いてある情報を写すと、その物件のエネルギー診断書(DPE)を住所付きで見つけます。1,550万件の診断書をブラウザの中で直接検索し、ホスティング費用は月に数セントです。
- saas
はじめに
フランスの不動産広告を見て、「この家、実際はどこにあるんだろう?」と思ったことは ありませんか?広告にはエネルギー等級(AからGまでのあの文字)、面積、市町村を載せる 義務がありますが、住所を載せる義務はありません。ところが、その文字の元になっている 診断書、DPEは公開されているんです!診断書はすべてADEME(フランス環境・エネルギー 管理庁)に提出され、オープンデータとして公開されています。
つまり、広告に書いてあることを写せば、たいてい診断書が見つかり、一緒に住所もわかり ます。それをやってくれるのが recherche-maison で、自分の個人事業(EI Chauquest) として販売しているプロダクトです。
詳しい話の前に、このサイトでやりたかったことをまとめておきます。
機能
- 広告に載っている情報だけで検索:郵便番号または市町村、エネルギー等級、面積
- 広告に診断日や消費量(kWh/m²/年)があれば、それで絞り込み
- 該当する診断書をすべてリストと地図に表示(数件のことが多く、一件だけのことも)
- 診断書を開いて、全データ、建物、地番を確認
- 物件や検索条件を保存して、あとで見返す
- ホスティング費用をほぼゼロにする
最初の計画:大きなデータベース(失敗)
最初のアイデアはよくあるものでした。全部データベースにダウンロードして、その前に APIを置く。コードを書く前に、いくつか数字を測ってみました。
- 診断書 1,550万件、それぞれ 226列
- CSVで約 31GB
- ADEMEのAPIは 500kB/s に制限されているので、全件ダウンロードに約 17時間 (GitHub Actionsは6時間でジョブを止めてしまいます)
この数字を見て、データベースサーバーを置く意味がなくなりました。データは公開情報で、 誰のものでもありません。配るためだけにサーバーを動かし続ける必要はないですよね。 そこで、ブラウザが直接読むParquetファイル(データを列ごとに保存する圧縮形式)に しました。
メリット:
- 圧縮後は約 4.5GB、Cloudflare R2での保存費用は月に数セント
- 管理するデータベースサーバーがない
- 226列あっても追加コストなし。検索は必要な列だけを読みます
デメリット:
- ADEMEが新しい診断書を公開するたびに、毎週ファイルを作り直す必要がある
- 普通のAPIよりセットアップが面倒(レンジリクエスト、バケットのCORS設定)
仕組み
全部の部品には触れず、全体像だけ紹介します。
- 診断書はR2上のParquetファイルで、県(département)ごとにフォルダを分けています。
- 検索はブラウザの中で DuckDB-WASM が実行します。県のファイル全体ではなく、 必要な部分だけをダウンロードします(HTTPレンジリクエスト)。パリだけで診断書は 838,532件もあります!
- 非公開のデータはアカウント、保存した物件、保存した検索条件だけです。これらは 小さなCloudflare Worker(D1データベース、Googleログイン)に置いています。
ややこしいのはここです。D1には行レベルセキュリティがありません。つまり、誰がどの行を 読んでいいかをデータベース自身はチェックしてくれません。そこで、データベースに触れて よいファイルを一つだけにして、他のファイルが触れようとするとテストでビルドが失敗する ようにしました。データベース側のルールほどきれいではありませんが、ちゃんと役目は 果たしてくれます。
落とし穴だらけのデータ
オープンデータは素晴らしいですが、まったくきれいではありません。痛い目にあって 見つけたものを紹介します(今はすべてテストで確認しています)。
- CSVの列名がAPIのフィールド名と違い、しかも二つが入れ替わっています。名前で読むと、 エラーも出ずに住所が別の列に入ってしまいます。
- 座標は住所ごとではなく、診断書ごとのものです。住所でまとめるとデータが失われます。
- 数値を浮動小数点で保存すると誤差が出ます。96列はちょうど小数点以下1桁なので、 10倍した整数で保存しています。
ベースは一度だけ自分のパソコンで構築し、その後は毎週のジョブが変更分だけを取得して います。
結果
サイトは公開中です(フランス語)。既存住宅に加えて、新築、オフィスや店舗、エネルギー 監査もカバーしていて、それぞれ建物(RNB)と地番に紐づいています。全履歴の検索は Googleアカウントで無料、直近2か月の診断書は 月額5ユーロ(Stripe決済)です。
フランス政府のオープンデータポータル data.gouv.fr にも活用事例として公開したので、ADEMEのデータセットのすぐ隣で見つけられます。
限界
- ADEMEに診断書が提出されていない物件は出てきません。DPEがなければ結果もなしです。
- 住所はADEMEがジオコーディングしたもので、おおよその位置のこともあります。
- 一つの広告に複数の診断書が当てはまることがあります。サイトはすべて表示し、 勝手に一つを選んだりはしません。
おわりに
駆け足の紹介でしたが、以上です!フランスで住まいを探している方はぜひ使ってみて ください。欲しい機能があれば気軽に教えてください。Cloudflareで動いている別の プロジェクトが見たい方は、このポートフォリオもその一つです。 こちらで紹介しています。