Matval
描述
我创建这个项目是为了给自己订购食物。思考吃什么食谱并找到这些食谱所需的所有食材的过程是一个令人筋疲力尽的过程(对我来说)。由于我确实对烹饪充满热情,而且我已经从事自动化工作很长时间了,我认为我可以提高效率,将这个过程从每周几个小时(~4)减少到大约30分钟。我喜欢花时间烹饪或制作其他有趣的东西,而不是查找食谱和配料。
如果有人在读这篇文章,你认为这可以帮助你,那么这个项目就是为你准备的。
支持的超市
由于我目前住在瑞典,我把目标对准了五家主要超市:
- 伊卡
- 合作
- 威利斯
- 亨科普
- Mathem
可能会增加更多的超市。
项目功能
- 根据营养需求和个人喜好制定每周膳食计划
- 比较超市中同一产品的价格,以找到最优惠的价格
- 跟踪历史价格以发现趋势和购买时间
- 查找产品的营养价值
- 在所有支持的超市中搜索完整的产品目录
- 为任何配料找到最便宜的选择
- 按类别浏览产品
- 每周自动抓取和刷新产品数据(这是一个额外的设置,但可行)
项目限制
- 不支持将商品添加到超市购物车。受支持的超市的robots.txt不允许自动购物车,并且遵守了这一界限。除非我们能通过一个像人类一样的浏览器扩展来实现这一点(公平地说,如果有多个人这样做,我不知道他们的基础设施是否能承受巨大的请求量)
- 还没有用户界面。该项目目前通过需要API访问的MCP服务器通过Claude/GPT/等运行。未来计划推出独立UI。
- 超市网站定期更新,可以更改API端点、页面结构或URL格式。这可能需要在更换后对刮板进行维护。
- 抓取器没有针对实时端点的自动测试,因此网站中的突破性更改可能会被忽视,直到下一次计划的抓取运行没有产生任何数据。
- 产品重复数据删除基于名称和类别,这意味着具有相同名称但不同变体(例如不同尺寸)的产品可能会干扰彼此的价格数据,直到刮刀提供唯一的外部产品ID。
- 数据新鲜度取决于抓取计划。价格仅与上次成功运行时的价格一样。
快速开始
这就是你可以尝试这个项目的方法(请这样做),我建议运行mathem scraper,这是我最喜欢的超市之一。
Bash(Linux/macOS)
cp .env.example .env
# Edit .env with your database credentials
# Provide a password to POSTGRES_PASSWORD
# Start PostgreSQL and the shelfwatch MCP server
docker compose up postgres shelfwatch
# Run a scraper (replace with coop, hemkop, ica, mathem, or willys)
docker compose --profile scrape run --rm scraper Windows(PowerShell)
Copy-Item .env.example .env
# Edit .env with your database credentials
# Provide a password to POSTGRES_PASSWORD
# Start PostgreSQL and the shelfwatch MCP server
docker compose up postgres shelfwatch
# Run a scraper (replace with coop, hemkop, ica, mathem, or willys)
docker compose --profile scrape run --rm scraper 使用cron进行调度(Linux/macOS)
建议的设置是每周运行一次每个刮板,间隔一小时:
0 1 * * 1 cd /path/to/matval && docker compose --profile scrape run --rm scraper mathem >> /var/log/matval/mathem.log 2>&1
0 2 * * 1 cd /path/to/matval && docker compose --profile scrape run --rm scraper coop >> /var/log/matval/coop.log 2>&1
0 3 * * 1 cd /path/to/matval && docker compose --profile scrape run --rm scraper ica >> /var/log/matval/ica.log 2>&1
0 4 * * 1 cd /path/to/matval && docker compose --profile scrape run --rm scraper willys >> /var/log/matval/willys.log 2>&1
0 4 * * 1 cd /path/to/matval && docker compose --profile scrape run --rm scraper hemkop >> /var/log/matval/hemkop.log 2>&1robots.txt合规性: Willys和Hemkop都指出 Crawl-delay: 10 和 Visit-time: 0400-0845 UTC 在他们的robots.txt中。他们的抓取器通过以下方式强制执行抓取延迟 DOWNLOAD_DELAY = 10 和 CONCURRENT_REQUESTS = 1上述cron条目安排两个抓取器在允许的访问窗口(04:00-08:45 UTC)内启动。
使用任务计划程序进行日程安排(Windows-计划在未来进行)
______________________________________________________________________
收集哪些数据
每个刮板收集每种产品的以下内容:
- 名字 -超市网站上显示的产品名称
- 类别和子类别 -产品在商店目录中的位置
- 价格 -当前售价
- 单价 -每公斤、升或其他类似单位的价格(例如12.50 kr/kg)
- 货币 -始终关注受支持的超市
- 数量/包装尺寸 -例如“500克”、“1升”、“6包”
- 可用性 -产品目前是否有库存
- 产品链接 -直接链接到产品页面
- 产品编号 -超市的内部SKU,用于跟踪变体并避免重复
- 营养 -每100克分解物,包括能量、脂肪、碳水化合物、蛋白质、盐和纤维(如有)
Coop还提供:
- Ean条形码 -可用于在商店之间交叉引用产品
- 促销 -主动折扣或会员优惠
每次刮板运行时,价格和可用性变化都会自动记录在历史表中,因此您可以在不进行任何额外配置的情况下跟踪价格随时间的变化。
______________________________________________________________________
发展
安装依赖项
uv sync运行测试
pytest tests/测试使用 试验容器 为了启动一个真正的PostgreSQL实例,Docker必须正在运行。
代码质量
uv run ruff check .
uv run ruff format .
uv run mypy .预提交钩子会自动执行这些检查。使用以下方式安装它们:
uv run pre-commit install