Waitrose Scraper - UK Grocery Products & Prices
Pricing
from $5.00 / 1,000 result scrapeds
Waitrose Scraper - UK Grocery Products & Prices
Scrape the full Waitrose UK grocery catalogue: names, brands, prices, price-per-unit, promotions, ratings, and images. Full category-tree walk with exact per-category counts. No login or cookies required.
Pricing
from $5.00 / 1,000 result scrapeds
Rating
0.0
(0)
Developer
Studio Amba
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Waitrose Scraper
Scrape the full Waitrose UK grocery catalogue — product names, brands, prices, price-per-unit, promotions, ratings and images — with verified per-category counts. No login, no cookies.
Why use this actor?
Waitrose is one of the UK's premium supermarkets, and its online grocery range (roughly 25,000 SKUs) is a clean reference set for price monitoring, competitor analysis, product cataloguing, and market research. Waitrose blocks non-UK traffic and runs Akamai anti-bot, so the data is hard to reach with a normal scraper. This actor solves both and walks the entire category tree, so you get the whole catalogue, not just the first page of a search.
Buyers who use this: pricing analysts, grocery and FMCG brands tracking their own and competitor shelf prices, market researchers, and data teams building UK grocery datasets.
No cookies, no login
This actor reads only public catalogue pages. It never logs in, never needs a Waitrose account, and never touches personal data. Every request is routed through a Bright Data Web Unlocker UK exit, which handles the geo-block and the Akamai Bot Manager challenge for you.
How it works
Waitrose category pages are server-side rendered. Each page embeds a JSON blob
containing the full product objects for that category, the exact product count
(totalMatches), and the list of child categories. This actor:
- Discovers the top-level grocery departments from the site navigation.
- Fetches each category page through Bright Data (UK exit) and parses the embedded product data.
- Recurses down the category tree to the leaf shelves.
- De-duplicates every product by its Waitrose line number.
Because each category reports its exact totalMatches, coverage is verifiable:
the run stores a CATEGORY_TOTALS record in the key-value store so you can
check the count captured against the count Waitrose reports.
How to scrape Waitrose data
- Get a Bright Data account and a Web Unlocker zone (
web_unlocker1). Copy your API key. - Paste the key into the Bright Data API Key input field (or set the
BRIGHT_DATA_API_KEYenvironment variable). - Leave Category empty to scrape the whole catalogue, or set it to a single
department slug (for example
fresh_and_chilled,food_cupboard,frozen) to scope the run. Or set Search Query to search by keyword instead (see below) — the two are mutually exclusive; a search query always wins. - Set Max Products — a small number (20) for a quick test, a large number (30000) for the full catalogue.
- Run the actor. Results stream into the dataset as they are found.
The category slug is the part of the browse URL after .../browse/groceries/.
For example https://www.waitrose.com/ecom/shop/browse/groceries/bakery has the
slug bakery, and a nested shelf uses a path such as
fresh_and_chilled/cheese.
Keyword search
Set Search Query (for example heinz baked beans or oat milk) to search
the whole catalogue by keyword instead of walking a category. This replaces
the category walk entirely and is bounded by Max Products.
Waitrose's own search page and search API aren't reachable for scraping — its
robots.txt disallows the search results URL and the token endpoint needed to
call the search API directly, and Bright Data enforces robots.txt. Instead
this actor matches your query against Waitrose's public product sitemap
(~18,700 products), then fetches each matching product's own page for full
data — name, brand, price, rating, images, and barcode. All words in the
query must appear in the product's name; unlike a category run, coverage
against Waitrose's own totals is not tracked for search results, and the
fetchBarcodes option is not needed for search — barcodes are included
automatically since each match already requires its own product page fetch.
Input
| Field | Type | Required | Description |
|---|---|---|---|
brightDataApiKey | String | Yes* | Bright Data Web Unlocker API key. *Or set BRIGHT_DATA_API_KEY. |
category | String | No | Grocery department/shelf slug to scope the run. Empty = full catalogue. |
searchQuery | String | No | Keyword search across the catalogue, e.g. heinz baked beans. When set, replaces the category walk entirely. |
maxProducts | Integer | No | Maximum unique products to return (default 20). |
sortBy | String | No | Listing order hint (cosmetic). |
fetchBarcodes | Boolean | No | Fetch the EAN/GTIN barcode per product (default false). Adds one extra Bright Data request per product — see below. |
proxyConfiguration | Object | No | Not used — Bright Data handles the UK exit. |
Output
Each result contains:
| Field | Type | Example |
|---|---|---|
name | String | "Waitrose Italian Summer Salad Kit" |
brand | String | "Waitrose Ltd" |
price | Number | 2.50 |
currency | String | "GBP" |
originalPrice | Number | 3.00 |
pricePerUnit | String | "£20.83/kg" |
discount | String | "Any 3 for 2 Cheapest Item Free Mix & Match" |
productId | String | "939428" |
ean | String | "5063210100002" (with fetchBarcodes) |
barcodes | Array | ["5063210100002"] (with fetchBarcodes) |
rating | Number | 4 |
reviewCount | Number | 24 |
imageUrl | String | Primary product image URL |
imageUrls | Array | All image URLs |
description | String | "Pack size: 120g" |
category | String | "301135" |
categories | Array | ["Groceries", "Fresh & Chilled", ...] |
url | String | Full product page URL |
scrapedAt | String | ISO 8601 timestamp |
Stable product identifier
productId is the Waitrose line number. It is the identifier Waitrose
itself uses for the product across its site and stays the same across
re-scrapes, price changes and category moves — use it as the join key when
comparing runs over time.
EAN barcodes (fetchBarcodes)
Waitrose only exposes barcodes on product detail pages, not on category
listings. With fetchBarcodes enabled the actor fetches each product's detail
page and adds two fields:
ean— the primary retail EAN/GTIN, checksum-validated where possible.barcodes— every code Waitrose lists (some products carry an internal or variable-weight code alongside the retail EAN).
This costs one extra Bright Data request per product on top of the normal catalogue walk. On a full ~16,000-product catalogue that roughly doubles the Bright Data spend and run time, so it is off by default. It is most useful for cross-store price matching, where the EAN is the join key between retailers.
Example output
{"name": "Waitrose Italian Summer Salad Kit","brand": "Waitrose Ltd","price": 2.50,"currency": "GBP","pricePerUnit": "£20.83/kg","productId": "939428","rating": 4,"reviewCount": 24,"imageUrl": "https://ecom-su-static-prod.wtrecom.com/images/products/11/LN_939428_BP_11.jpg","description": "Pack size: 120g","category": "301135","categories": ["Groceries", "Fresh & Chilled", "Fresh Salad & Herbs", "Salad Bags"],"url": "https://www.waitrose.com/ecom/products/waitrose-italian-summer-salad-kit/939428-1-2","scrapedAt": "2026-07-03T14:30:00.000Z"}
Cost estimate
A full-catalogue run visits every grocery category page once (roughly
1,500–2,500 pages) through Bright Data Web Unlocker to cover ~25,000 products.
Scoping to a single department is far cheaper — a department such as
fresh_and_chilled (~3,600 products) walks a few hundred category pages. Test
runs with a small maxProducts cost a handful of requests.
Limitations
- Requires a Bright Data Web Unlocker key with a GB exit. Waitrose drops non-UK connections, so this is mandatory.
- Stock/availability is delivery-slot and postcode dependent on Waitrose, so it is not reported per product. The catalogue, pricing, promotions and ratings are.
- Each category page returns its top products; the catalogue is completed by
walking the tree to leaf level. A small number of very large leaf shelves may
not expose their full tail — check the
CATEGORY_TOTALSrecord for coverage. - Data is scraped from the public website and may change without notice. Respect the website's terms of service and use responsibly.
Need this data on a schedule, or a custom version?
We run this scraper as a managed service for businesses: scheduled runs, deduplication, delta detection, and delivery to your inbox, Google Sheets, or API — maintenance included. We can also build a custom version with your exact fields and filters, or combine multiple sources into one feed.
See studioamba.dev/services or email hello@studioamba.dev for a free data sample. We maintain 300+ European web scrapers and answer within one business day.