Just Eat Restaurant Menu Scraper
Pricing
from $3.99 / 1,000 results
Just Eat Restaurant Menu Scraper
Extract detailed menu data from Just Eat restaurant pages including items, prices, variations, deals, and nutritional information.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
Coding Frontned
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
0
Monthly active users
8 days ago
Last modified
Categories
Share
Collect public menu items from canonical Just Eat UK restaurant pages with an ordinary Playwright browser. The Actor does not rewrite navigator properties, suppress automation signals, apply generated fingerprints, or solve access challenges.
Default input
The input form, runtime defaults, and input.example.json use this exact starting configuration:
{"mode": "menuUrl","startUrls": [{"url": "https://www.just-eat.co.uk/restaurants-beirutgarden-london/menu"}],"country": "uk","maxItems": 25,"restaurantSlugs": [],"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "GB"},"navigationTimeoutSecs": 45,"maxRequestRetries": 1,"challengeWaitSecs": 30}
maxItems is an upper bound across all requested restaurants, not an exact-count promise. UK residential proxy access uses the account's proxy allowance and may incur charges; it does not guarantee that Just Eat will grant access.
Supported inputs
mode: "menuUrl": up to 20 canonicalhttps://www.just-eat.co.uk/restaurants-{slug}/menuURLs; defaults to Beirut Garden when URLs are omitted. An explicitly empty URL list is rejected.mode: "restaurantSlug": up to 20 nonempty UK restaurant slug segments. This mode requiresrestaurantSlugsand does not insert the default menu URL.country:ukonly.maxItems: integer from 1 to 200, default 25.navigationTimeoutSecs: integer from 1 to 180, default 45; passed directly to Crawlee's navigation timeout.maxRequestRetries: integer from 0 to 10, default 1; used for transient failures. Access denials and challenges are non-retryable.challengeWaitSecs: integer from 1 to 90, default 30. Gives an ordinary non-interactive browser check time to reach the requested menu. Persistent denials and interactive challenges stop without saving menu rows.proxyConfiguration: GB residential Apify proxy by default. Explicit{ "useApifyProxy": false }uses direct access. HTTP/HTTPSproxyUrlsare supported for a custom proxy. Conflicting or malformed options are rejected. Requested proxy setup and URL-generation failures stop the run rather than silently falling back to direct access.
Unknown fields, invalid hosts/routes, and numeric strings are rejected. PLAYWRIGHT_EXECUTABLE_PATH or CHROME_EXECUTABLE_PATH may select an already-installed browser.
Extraction and source accuracy
The Actor observes relevant public menu API responses made by the page, embedded Next.js menu state, and rendered menu elements. It traverses all recognized menu/category containers and falls back when a source contains no usable rows. Successful rows require an observed item name, category, restaurant identity, and nonnegative GBP price. Prices are GBP major units; only explicitly labelled minor-unit amounts are divided by 100. Choice-based variation prices are the minimum observed variation price and are marked priceIsFrom. A single explicitly typed NoVariation base price is a fixed price, so it is not marked as a choice-based minimum.
Original identifiers stay absent when the source does not provide them. recordId is a stable SHA-256 identity scoped to restaurant, category, and item; identityMethod distinguishes source identifiers from content-derived keys. Optional media, address, cuisine, nutrition, dietary, availability, and variation fields are included only when supported by source data. A dietary option or negated label is not converted into a positive dietary claim. Records are globally deduplicated.
Rows include source-page, HTTP, browser, fingerprint, proxy, and extraction provenance. proxyConfigured reflects actual configured transport, including false for explicit direct access. It does not certify that the proxy provider supplied a particular physical location.
Completion and verification
OUTPUT reports SUCCESS, PARTIAL, NO_RESULTS, or FAILED, with saved records, failed requests, blocked requests, invalid records, and empty menus counted separately. It also reports browser-check waits, recoveries, timeouts, elapsed waiting time and bounded access-failure evidence. Proxy setup failure, browser startup failure, zero usable rows, failed storage, or partial extraction produces an unsuccessful run.
The browser waits for a pending non-interactive check instead of treating its initial HTTP 403 as the final result. It requires a subsequent successful main-document response and recognizable menu content before extraction. Apify's browser image supplies a virtual display, where the Actor uses ordinary headed Chrome; hosts without a display use headless mode. A single session keeps proxy routing and browser cookies consistent; transient network failures use the configured finite retry limit. Persistent denials or interactive challenges retire the session and fail the request. This follows the waiting guidance in Apify Academy; it does not guarantee that the site will grant access.
Run npm ci --ignore-scripts and npm run check for syntax, parser, input/default, browser-check, and injected-runner tests. These are synthetic/local checks; live recovery requires an actual Actor run and inspection of its dataset and OUTPUT summary.