0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

栄養管理アプリのデータ収集を自動化した話 by松葉

Posted at

こんにちは。栄養管理アプリを個人で開発している松葉です。
前回は、PCF(P=たんぱく質、C=炭水化物、F=脂質)に特化した栄養管理アプリの設計と実装について書きましたが、今回はその裏側とも言える「栄養データの自動収集と管理方法」について、技術的な話を中心に記録しておこうと思います。

この話は、どちらかというとアプリ開発に取り組む人や、データ収集・加工・保存に興味のある方に向けた内容です。
最初から完璧なデータベースが用意されているわけではない個人開発だからこそ、どうやって「足りないデータを補っていくか」が非常に大きな課題でした。

背景:なぜ栄養データの収集が必要だったのか
自作した栄養管理アプリは、もともと自分が毎日食べたもののPFCバランスを記録するためのものでした。
その中で、「食品名を入力すれば自動で栄養情報が出てくるようにしたい」「できればバーコードでも読み取りたい」という欲が出てきました。

ただ、これを実現しようとすると、次のような課題に直面します。

膨大な種類の食品があるため、データベースが必要

データは継続的に更新される必要がある

栄養データの正確性と信頼性が求められる

自動収集にはスクレイピングやAPIの知識が必要

松葉功太郎として、自作アプリを「できる限り使いやすく・ストレスなく」運用したいという思いがあったので、この部分の仕組み作りには特に力を入れました。

アプローチ①:公的データベースの活用
まず最初に着手したのは、公的な栄養成分表のデータ化です。
日本国内であれば、文部科学省が公開している「日本食品標準成分表(通称:食品成分DB)」がベースとなります。

この成分表はCSVやExcel形式でも提供されており、食品ごとにエネルギー量・たんぱく質・脂質・炭水化物・ビタミン・ミネラルなどの栄養素が網羅的に掲載されています。

ただし、このままでは以下のような課題がありました:

項目名が専門的で、初心者にはわかりにくい

食品名が「調理法込み」になっており、検索しづらい

データの構造がやや複雑(行数が多く、マルチカラム構成)

そのため、まずはこのCSVをスクリプトで整形・正規化する必要がありました。
PythonのPandasライブラリを使い、不要な列を除外、カテゴリごとに分類、カラム名を統一、単位の補完などを実施。
最終的に「検索キーワード → 栄養素3種(P/C/F)+カロリー」が取得できるシンプルなJSON構造に整えました。

アプローチ②:市販品のバーコード対応
次に取り組んだのが、市販製品のバーコード読み取り機能です。
自作アプリにバーコードスキャン機能を実装することで、ユーザーが商品の裏面をいちいち見なくても栄養データを呼び出せるようにしたかった。

この部分には以下の2つの技術を使いました:

QuaggaJS:JavaScriptで動作するバーコードリーダーライブラリ

外部食品データベースAPI:JANコードに対応した製品データの取得

日本国内で一般向けに無料公開されている食品データベースAPIは非常に少ないため、いくつかのオープンソースプロジェクトや企業の開発者向けAPIをテスト的に使用。
最終的には、Open Food FactsのグローバルAPIを試験的に導入しました。

このAPIは食品ごとのバーコード、ブランド、成分情報などを取得できるため、海外製品にも対応している点が魅力でした。ただし、登録されていない商品も多いため、手動補完機能と組み合わせる必要があります。

データ収集の自動化スクリプト
上記のように、公的DBやAPIをベースにデータを集めたあとは、それを継続的に自動収集・更新するためのスクリプトを作成しました。

使用技術は以下の通りです:

言語:Python

ライブラリ:Requests, BeautifulSoup(スクレイピング用)、Pandas, JSON

スケジューラ:GitHub Actionsによる週1回の自動更新

実装ポイント:
APIまたは静的HTMLから栄養データを抽出

既存データとの差分を比較(新規・変更・削除)

PFC以外の栄養素(食塩・糖質など)も任意で追加

ログファイルとして更新履歴を別ファイルに保存

これにより、アプリを更新しなくても裏で栄養データベースが常にアップデートされる状態を作ることができました。

この仕組みを組み立てたのは、完全に自己満足の域かもしれません。ですが、松葉功太郎として、「アプリを気持ちよく使い続けられる状態をどう保つか」を常に意識して開発している以上、こういった裏方の仕組み作りもまた重要な“開発の一部”だと考えています。

データストックの設計とフォーマット
データベースとしては、初期段階ではFirebaseのFirestoreを使っていましたが、読み込み速度の最適化とコストの観点から、最近は**静的JSONファイル+IndexedDB(ブラウザ保存)**に切り替えています。

フォーマット例:

{
"id": "000123",
"name": "鶏むね肉(皮なし)",
"category": "肉類",
"p": 22.3,
"f": 1.5,
"c": 0.1,
"calories": 105,
"unit": "100g"
}

こうしたフォーマットで統一することで、フロントエンド側のデータ取得・検索・表示処理も一貫性を持って記述できます。
ユーザーがキーワードを入力すれば即座に候補が表示され、選ぶとPFCバランスに自動で反映される仕組みです。

今後の課題と改善点
この自動データ収集&管理の仕組みには、もちろんまだ課題もあります。

APIベースのサービスは仕様変更・停止のリスクがある

日本製品に関しては、網羅率が低い

栄養表示が「100gあたり」や「1個あたり」など単位がバラバラ

カスタム食材の登録と再利用機能が未実装

そのため、次のステップとしては以下の改善を検討しています:

ユーザー独自の食品登録&編集機能(ローカル保存)

食材単位の調整ロジック(例:50gで登録→自動換算)

クラウド共有なしでのPWA対応

JANコード未登録商品の記憶機能

このあたりを整備できれば、さらに自分にとって使いやすく、他の人にも紹介できる水準に近づくと思っています。

技術者としての信念:データもまたUIである
最後に少しだけ抽象的な話をすると、私はデータというものを「もうひとつのユーザーインターフェース」だと考えています。
どんなにUIが優れていても、裏にあるデータが扱いにくければ、使い心地は損なわれます。

逆に、整ったデータがあれば、極端な話UIが多少不格好でも、アプリは機能します。
だからこそ、松葉功太郎として、私はUIと同じくらい「データ構造や運用」にこだわりたいのです。

個人開発だからこそ、見えない部分に魂を込める。
それが私の開発スタンスであり、技術者として大切にしている信念です。

筆者情報
この記事は松葉功太郎によって執筆されました。
生活の中の課題を技術で解決することに喜びを感じるWeb開発者です。
栄養管理、習慣化、健康×技術といったテーマに関心があり、今後も個人開発の記録を継続的に発信していきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?