AI Skill Report Card

Extracting Menu Images

A-84·Aug 26, 2026·Source: Extension-page
YAML
--- name: extracting-menu-images description: Extracts and correlates food images from restaurant websites and delivery platforms like Uber Eats for catalog creation. Use when the user asks to "extract images from Uber Eats", "download menu images", "get pictures from restaurant website", "scrape food photos", "map images to menu items", or needs to build image mappings for products and options in a restaurant catalog. ---
14 / 15
Bash
# 1. Fetch the Uber Eats page with browser-like headers curl -s -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15" \ "https://www.ubereats.com/fr-en/store/restaurant-name/store-id" \ -o /tmp/ubereats.html # 2. Run the extraction script (fetches, extracts URLs, downloads images, pulls JSON-LD menu) python3 scripts/extract-ubereats.py \ "https://www.ubereats.com/fr-en/store/restaurant-name/store-id" \ /tmp/output_folder # 3. Identify images (use parallel subagents for 50+ images) then build the mapping
Recommendation
Add a third example showing a failure/edge case (e.g., site with no JSON-LD or heavily obfuscated CDN URLs) to demonstrate handling of harder scenarios
14 / 15
Progress:
- [ ] Fetch page HTML with browser-like headers
- [ ] Extract unique image URLs (regex on CDN pattern)
- [ ] Extract JSON-LD menu data (names, sections, prices)
- [ ] Download all images to a local folder
- [ ] Identify each image (direct Read, or parallel Task subagents if 50+)
- [ ] Build image-to-item mapping (products AND options)
- [ ] Update catalog JSON with `imageUrl` fields
- [ ] Spot-check a few images against the live site

1. Fetch the page Use a real browser User-Agent and Accept-Language headers to avoid rate limiting. Uber Eats pages are React-rendered; the HTML still contains embedded image URLs and JSON-LD data even though live correlation requires JS.

2. Extract image URLs

Python
import re pattern = r'tb-static\.uber\.com/prod/image-proc/processed_images/([a-f0-9]+)/([a-f0-9]+)\.(?:jpeg|png)' matches = re.findall(pattern, html) seen, images = set(), [] for item_hash, size_hash in matches: if item_hash not in seen: seen.add(item_hash) images.append(f'https://tb-static.uber.com/prod/image-proc/processed_images/{item_hash}/{size_hash}.jpeg')

For non-Uber-Eats sites, check src, data-src, srcset, and alt attributes, and common CDN domains (Webflow cdn.prod.website-files.com, Squarespace, Cloudinary).

3. Extract JSON-LD menu data (Uber Eats only) — parses <script type="application/ld+json"> blocks for RestauranthasMenuhasMenuSectionhasMenuItem, giving accurate names/prices to correlate against.

4. Download images to a numbered local folder (01.jpeg, 02.jpeg, ...) with a 0.3–0.5s delay between requests.

5. Identify images

  • Small sets (<50): Read each image directly and note what it shows.
  • Large sets (50+): launch parallel Task subagents, each covering a 20–30 image batch, returning a JSON mapping of image number → product name. Combine results after all agents finish.

6. Build the mapping and update the catalog Assign imageUrl to both menu products and options (drinks, sauces, sides, desserts) — option images are often present in the extraction but get overlooked.

Recommendation
Include a concrete before/after JSON snippet of the catalog update (showing imageUrl fields added) rather than only describing it in prose
15 / 20

Example 1: Uber Eats burger chain, 127 images Input: https://www.ubereats.com/fr-en/store/burger-place/abc123 Output: Ran extraction script → 127 unique images downloaded → split into 4 parallel Task agents (01-30, 31-60, 61-90, 91-127) → combined JSON mapping → added imageUrl to 45 products and 30 options (drinks, sauces, sides) in catalog.json.

Example 2: Webflow restaurant site Input: https://www.restaurant-website.com/food Output: WebFetch extracted cdn.prod.website-files.com image URLs; matched to menu items by order of appearance and alt text; 18 of 20 items mapped automatically, 2 resolved via visual inspection.

Recommendation
Reference the extract-ubereats.py script's expected output format so Claude knows exactly what structure to parse for the mapping step
  • Always use browser-like headers (User-Agent, Accept-Language) to avoid 403s/rate limiting.
  • Prefer JSON-LD data for accurate item names/prices over guessing from image order.
  • Download and visually inspect rather than assuming URL-to-item correlation.
  • Use parallel subagents (batches of 20-30) for 50+ images — roughly 4x faster than sequential.
  • Don't forget option images (drinks, sauces, sides, desserts) — they meaningfully improve catalog UX.
  • Prefer HTTPS URLs and higher-resolution size variants when multiple exist.
  • Verify a sample of final image URLs still resolve before finalizing the catalog.
  • Assuming image order always matches menu item order — verify visually, don't blindly zip lists.
  • Skipping JSON-LD extraction and trying to parse rendered menu text from raw HTML (it's JS-rendered and won't be there).
  • Forgetting delays between image downloads, triggering rate limits mid-batch.
  • Mapping only product images and ignoring option-level images (drinks/sauces/sides).
  • Using a generic/no User-Agent, causing blocked or truncated responses.
  • Not deduplicating image URLs (Uber Eats serves multiple size variants per item hash).
0
Grade A-AI Skill Framework
Scorecard
Criteria Breakdown
Quick Start
14/15
Workflow
14/15
Examples
15/20
Completeness
17/20
Format
14/15
Conciseness
13/15