766a573989
- adapters/openfoodfacts.py: OFF API 适配器(限速+User-Agent) + JSONL/.gz dump 读取 - etl/transform.py: 纯函数转换(GTIN 校验/净含量解析+归一/营养 per_100g 双能量/过敏原添加剂清洗/关键词分类映射) - etl/load.py: psycopg upsert(product/food_detail/product_image) + product_source 字段级溯源 - jobs/seed_off.py: CLI(--barcodes API / --dump 文件 / --limit) - 测试: 13 个离线 transform 单测(fixture) + 可跳过的 DB 集成测试 - 依赖: 增加 psycopg[binary] - 实跑: 从 OFF API 拉 5 个真实条码入本地 postgres 验证通过 - docs/etl-openfoodfacts.md: 流程/运行/字段映射 Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
27 lines
872 B
JSON
27 lines
872 B
JSON
{
|
|
"code": "3017624010701",
|
|
"product_name": "Nutella",
|
|
"product_name_en": "Nutella hazelnut spread",
|
|
"brands": "Ferrero, Nutella",
|
|
"quantity": "400 g",
|
|
"countries": "France, China",
|
|
"categories": "Spreads, Hazelnut spreads, Chocolate spreads",
|
|
"categories_tags": ["en:spreads", "en:chocolate-spreads"],
|
|
"ingredients_text": "Sugar, palm oil, hazelnuts, cocoa, skimmed milk powder",
|
|
"allergens_tags": ["en:milk", "en:nuts"],
|
|
"additives_tags": ["en:e322"],
|
|
"serving_size": "15 g",
|
|
"nutriscore_grade": "e",
|
|
"image_front_url": "https://images.openfoodfacts.org/images/products/301/762/401/0701/front_en.jpg",
|
|
"nutriments": {
|
|
"energy-kj_100g": 2252,
|
|
"energy-kcal_100g": 539,
|
|
"fat_100g": 30.9,
|
|
"saturated-fat_100g": 10.6,
|
|
"carbohydrates_100g": 57.5,
|
|
"sugars_100g": 56.3,
|
|
"proteins_100g": 6.3,
|
|
"salt_100g": 0.107
|
|
}
|
|
}
|