Leroy Merlin Scraper — French DIY & Home Improvement avatar

Leroy Merlin Scraper — French DIY & Home Improvement

Pricing

from $5.00 / 1,000 result scrapeds

Go to Apify Store
Leroy Merlin Scraper — French DIY & Home Improvement

Leroy Merlin Scraper — French DIY & Home Improvement

Scrape products, prices, specifications, ratings, and availability from leroymerlin.fr. France's largest home improvement retailer with 140+ stores. Supports search queries and category browsing.

Pricing

from $5.00 / 1,000 result scrapeds

Rating

0.0

(0)

Developer

Studio Amba

Studio Amba

Maintained by Community

Actor stats

0

Bookmarked

31

Total users

1

Monthly active users

13 hours ago

Last modified

Categories

Share

Leroy Merlin Scraper -- France's #1 DIY & Home Improvement Store

Scrape products, prices, brands, SKUs, and (optionally) full specifications from leroymerlin.fr -- France's dominant home improvement retailer with 140+ stores and the deepest online catalog in the French DIY market.

What is Leroy Merlin Scraper?

Leroy Merlin is France's largest home improvement chain and a heavyweight in the European DIY market. Owned by the Adeo group (also behind Bricoman and Weldom), it carries everything from tiles and paint to plumbing fixtures, power tools, kitchen cabinets, and outdoor furniture. The breadth of its catalog makes it a primary data source for anyone tracking the French renovation and construction supply market.

Leroy Merlin protects its site with DataDome anti-bot and geo-IP filtering, with a stricter rule on category and product pages than on search. This actor loads category and product pages in a real browser session over a French residential proxy (Apify RESIDENTIAL, country FR, the default in proxyConfiguration) and fetches search pages through Bright Data Web Unlocker (built in, no account needed). Product data comes from the server-rendered HTML and the structured JSON embedded in each page. You just provide a category URL or a search keyword.

Typical uses:

  • Price monitoring for the French market -- Track pricing on France's largest DIY platform to benchmark against Castorama, Brico Depot, or your own catalog
  • Supplier and brand intelligence -- Analyze which brands dominate specific categories (e.g., Bosch in power tools, Grohe in bathroom fixtures)
  • Building materials research -- Extract specs on tiles, flooring, insulation, and structural materials
  • E-commerce competitive analysis -- Study Leroy Merlin's product positioning, promotional patterns, and assortment depth
  • Renovation project costing -- Pull current prices for materials lists to estimate project budgets at scale

What data does Leroy Merlin Scraper extract?

Two levels, depending on the fetchDetails toggle:

Listing mode (default, fastest -- one page fetch covers 20-50 products):

FieldNotes
nameFull French product title
brandManufacturer name (Bosch, Makita, Dexter, Karcher, ...)
price, currencyCurrent price in EUR
originalPrice, discountWhen the product is on promotion
sku, productIdLeroy Merlin internal reference. Both are the bare numeric id and match the -<id>.html segment of url, so you can join or dedupe on either across runs.
isSponsoredtrue when the site served the product as a paid placement on the listing page. null when the page did not say.
urlCanonical product page URL (always the full ...-<id>.html form)
imageUrlPrimary product image, when the listing exposes it
rating, reviewCountWhen the listing exposes them
inStocknull in listing mode -- listing pages do not expose reliable availability
scrapedAtISO 8601 timestamp

Detail mode (fetchDetails: true -- one extra page fetch per product):

Everything above, plus ean (EAN/GTIN barcode), description, specs (technical attribute table), categories (breadcrumb path), imageUrls (full gallery), and a real inStock value from the product page's structured data (still null if the page doesn't state availability).

Detail mode is blocked by the site right now. Leroy Merlin's bot protection has rejected product detail pages on every route we have since late August 2026 (last measured 2026-09-17: 0 of 6 pages returned content). Runs with fetchDetails: true therefore return the listing-level fields above and name the blocked products in the log and the run's status message. Leave the flag OFF unless you are checking whether the block has lifted. The fields in this section stay in the schema because the actor fills them the moment detail pages are reachable again.

How to scrape Leroy Merlin data

FieldTypeDescription
categoryUrlStringCategory page URL, e.g. https://www.leroymerlin.fr/produits/outillage/outillage-electroportatif/perceuse/perceuse-filaire/. See "Category pages" below: DataDome currently blocks them for automated access, so the actor serves the site's search results for the category keyword when the page itself is blocked.
searchQueryStringFrench product keyword (recommended mode), e.g. "peinture", "perceuse filaire", "carrelage". See "How search works" below.
startUrlsArraySpecific URLs to scrape: category pages, search result pages, or product pages ending in -<id>.html.
maxResultsIntegerMaximum products to return (default: 100, max: 10,000).
fetchDetailsBooleanOFF by default, and best left off: the site blocks product detail pages right now (see Detail mode above), so ON costs extra time per product and usually returns the same listing-level fields. When detail pages are reachable it adds EAN, description, specs, categories, and stock status.
proxyConfigurationObjectProxy for the browser session that loads category and product pages. Default: Apify RESIDENTIAL, country FR. Keep it: non-French exits are geo-blocked.
brightDataApiKeyStringOptional. The actor ships with a built-in Bright Data integration; only set this to bill traffic to your own Bright Data account.

Input priority: startUrls > categoryUrl > searchQuery. Exactly one mode runs and the log states which. To run a search, leave categoryUrl and startUrls empty.

Category pages

Since late August 2026 DataDome blocks leroymerlin.fr category and product pages (/produits/...) for every automated route this actor has (unlocker, scraping browser, patched browser on residential proxies); the search page keeps working for product keywords. A categoryUrl or startUrls run therefore does this, and says so in the log and in the run's status message:

  1. Tries the category page in a browser session over the French residential proxy (the real listing, with pagination and subcategories). As of September 2026 DataDome's device check rejects this browser on every residential exit we tested (Apify and Bright Data, French IPs), so this step usually fails within 20 seconds.
  2. Scrapes the site's search results for the category keyword taken from the URL's last segment (.../perceuse/perceuse-filaire/ becomes perceuse filaire). Those are the site's search ranking for that keyword, not the category tree, and pagination follows the search.
  3. When the keyword is itself a category name (/produits/outillage/ becomes outillage, /produits/.../perceuse/ becomes perceuse), the site redirects that search to the blocked category page. The actor then asks the site's autocomplete API for the related searches it offers for the keyword (outillage makita, outillage electricien, outillage electrique, ...) and scrapes those search results, in that order, until maxResults is reached. The log lists the keywords used.

The status message of a finished run names the route that served it. A run where every route is blocked fails within a few minutes with a message naming the block; it no longer spends an hour retrying.

Cost per result on this route: one Bright Data unlocker call per search page of about 40 products, so roughly 25 to 40 results per call. The unlocker calls are included in the actor's per-result price.

How search works

The actor first scrapes the site's own /search results page for your query -- the same results a visitor sees, in the site's relevance order. The unlock route this actor uses intermittently enforces leroymerlin.fr's robots.txt on that page; when it is unavailable, the actor falls back to the closest official product category, matched via the site's own autocomplete API, and scrapes that category instead. In practice:

  • When direct search is available you get the site's real search results for your exact query.
  • In fallback mode, broad French keywords ("perceuse", "peinture", "carrelage") map cleanly to a category. Multi-word queries fall back word by word ("peinture murale blanche" → "peinture murale" → "peinture") until a category matches. The log names the mode used and the matched categories.
  • If both routes come up empty, the run fails with a clear message instead of returning unrelated products. Use categoryUrl for precise targeting.

How category scraping works

Deep category pages (e.g. /produits/outillage/outillage-electroportatif/perceuse/perceuse-filaire/) list up to ~50 products per page with pagination; the actor walks all pages up to maxResults. Top-level category hubs (e.g. /produits/outillage/) only showcase 12-24 highlighted products, so the actor automatically descends into their subcategories to fill your requested count. If a category genuinely holds fewer products than maxResults, the run succeeds and logs a warning naming the real count -- it never silently under-delivers.

Output

Each product is a structured JSON object. Listing mode example:

{
"name": "Nettoyeur vapeur blanc KARCHER SC3 + lingettes, 1900 W",
"brand": "KARCHER",
"price": 151,
"currency": "EUR",
"url": "https://www.leroymerlin.fr/produits/nettoyeur-vapeur-blanc-karcher-sc3-lingettes-1900-w-91294768.html",
"scrapedAt": "2026-08-17T10:30:00.000Z",
"sku": "91294768",
"productId": "91294768",
"isSponsored": false,
"inStock": null,
"imageUrl": "https://media.adeo.com/media/2853799/media.jpg"
}

With fetchDetails: true:

{
"name": "Nettoyeur vapeur blanc KARCHER SC3 + lingettes, 1900 W",
"brand": "KARCHER",
"price": 151,
"currency": "EUR",
"url": "https://www.leroymerlin.fr/produits/nettoyeur-vapeur-blanc-karcher-sc3-lingettes-1900-w-91294768.html",
"scrapedAt": "2026-08-17T10:30:00.000Z",
"sku": "91294768",
"ean": "4054278966588",
"inStock": true,
"rating": 4.5,
"reviewCount": 231,
"imageUrl": "https://media.adeo.com/media/2853799/media.jpg",
"description": "Le nettoyeur vapeur SC3 de Karcher elimine 99,99% des bacteries sans produit chimique.",
"specs": {
"Puissance": "1900 W",
"Surface conseillee": "75 m²",
"Temps de chauffe": "30 s"
},
"category": "Nettoyeur vapeur",
"categories": ["Electromenager", "Entretien des sols", "Nettoyeur vapeur"]
}

inStock is true/false only when the site states availability; it is null when unknown (listing mode). It is never guessed.

How much does it cost?

Pricing is pay-per-event: $0.01 per run start + $0.005 per result (per product returned). The built-in unlocker traffic for search pages is included. Category and product pages load in a browser over Apify residential proxy, which is billed by your Apify plan as proxy bandwidth (roughly 1-2 MB per category page, images are not loaded). A run's usage cost only settles after it SUCCEEDS.

ScenarioProductsPrice
Quick test50$0.26
Category deep dive200$1.01
Brand analysis500$2.51
Large catalog export1,000$5.01

A run's usage cost only settles after the run reports SUCCEEDED -- reading the dataset mid-run shows a partial count. A failed run charges only the events it emitted before failing. fetchDetails: true does not change the price per product -- it only makes runs slower (one extra page fetch per product, roughly 2-5 s each).

Can I integrate?

Export data in any format Apify supports:

  • JSON, CSV, Excel -- Download directly from the dataset
  • Google Sheets -- Automatic sync via Apify integration
  • Webhooks -- Trigger your pipeline when a run completes
  • API -- Fetch results programmatically
  • Zapier / Make -- Connect to thousands of downstream apps
  • Amazon S3, Google Cloud Storage -- Push to cloud storage buckets

Can I use it as an API?

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("studio-amba/leroymerlin-scraper").call(run_input={
"categoryUrl": "https://www.leroymerlin.fr/produits/revetement-sol-et-mur/peinture-interieure/",
"maxResults": 100,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"{item['name']} - EUR {item['price']}")

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('studio-amba/leroymerlin-scraper').call({
searchQuery: 'perceuse',
maxResults: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

FAQ

Do I need proxies or a Bright Data account? No Bright Data account: the unlocker used for search pages is built in. The optional brightDataApiKey field is only for users who want that traffic billed to their own Bright Data account. Category and product pages are loaded in a browser session through the proxyConfiguration proxy; the default (Apify RESIDENTIAL, country FR) is required because leroymerlin.fr geo-blocks non-French exits and DataDome scores datacenter ranges. A saved task that still carries an Apify proxy without a country gets FR added automatically.

Why did category runs fail with an anti-bot message in September 2026? Between late August and mid September 2026 DataDome rejected the unlocker route on category and product pages while search kept working. Version 0.1.30 moved category and product pages to the browser session described above; search pages stay on the unlocker.

Why does my search return products from a broader category than my exact phrase? When the site's /search page is temporarily unavailable through the unlock route, the actor maps your query to the closest official Leroy Merlin category (see "How search works"). A very specific phrase may resolve to its parent category. For exact scoping, pass a categoryUrl.

Why is inStock null on my results? Listing pages don't expose reliable availability, so listing-mode rows report null (unknown) rather than a guess. Run with fetchDetails: true to read availability from each product page.

Can I scrape specific store inventory? No. The scraper extracts online catalog data. Store-level stock varies by location and is not available through the public website in a structured way.

What categories does Leroy Merlin cover? The full range: outillage (tools), peinture (paint), carrelage (tiles), salle de bain (bathroom), cuisine (kitchen), jardin (garden), electricite, plomberie, chauffage, isolation, and more. Use categoryUrl to target specific departments.

Is the data in French only? Yes. Leroy Merlin France (leroymerlin.fr) is a French-language site. All product names, descriptions, and specs are in French.

How long does a typical scrape take? Listing mode covers 20-50 products per page fetch, so a 100-product run typically finishes in 1-2 minutes. With fetchDetails: true, add roughly 2-5 seconds per product: a 100-product detail run takes about 5-10 minutes. While the site blocks detail pages, the actor stops trying after the first two are rejected, so a detail run costs about a minute more than a listing run rather than the full per-product time.

Limitations

  • The site's /search results page is intermittently unavailable through the unlock route (robots.txt enforcement); in those periods searches are resolved to the nearest official category via the site's autocomplete API
  • ean, description, specs, categories, and inStock require fetchDetails: true, and the site is currently blocking the product detail pages those fields come from (measured 2026-09-17), so runs return listing-level fields only
  • Store-level stock is not available; inStock reflects the online shop only, and is null when the site doesn't state it
  • Product URLs must match Leroy Merlin's pattern (ending with a reference number like -12345678.html)
  • The site occasionally updates its page structure, which may temporarily affect extraction accuracy

Other DIY & home improvement scrapers

Track the full European home improvement market with these companion scrapers:

Your feedback

Found a bug? Need a feature? Open an issue on the actor's page or contact us through Apify. Your feedback helps us keep this scraper running smoothly.

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.