1. 2scraper
  2. E-commerce & retail
  3. Givenchy Beauty
Open source · MITRuns with no key, proxy or account

Givenchy Beauty Scraper

Givenchy Beauty products, prices and shades across 11 storefront locales — as JSON or CSV, no account needed.

  • Playwright
  • Selenium
  • Puppeteer
  • Scraping Browser API
  • JSON
  • CSV
givenchy-scraper
# Category listings
$ python3 playwright_scraper.py --category makeup/lips --site-locale gb
✓ 16 sample rows · 24 columns in sample_output.json
11storefront locales
2modes: category listing and product page
24columns per row
0keys, proxies or accounts needed in testing, Sep 2026
Available Givenchy Beauty scrapers

What the Givenchy Beauty scraper collects

Scrapes givenchybeauty.com category listings (one row per product tile) and product pages (one row each) into JSON and CSV. Rows carry the variant sku and style id, price with its source, shade names and counts, availability and badges, in whichever of the site's 11 locales you pick.

Category listings

Input: A category path (--category) and a locale (--site-locale)

One row per product tile: variant sku, master id, title, subtitle, price and currency, shade and shade count, availability, badge and any computed discount.

Product pages

Input: A product page URL

One row for the product, with its price read from the page's JSON-LD offers.

Quick start

From zero to Givenchy Beauty data in 3 steps

  1. Install

    Clone the repository and install one browser engine. Python 3.9+.

    $ git clone https://github.com/2scraper/givenchy-scraper.git && cd givenchy-scraper
    $ pip install -r requirements.txt -r requirements-playwright.txt
    $ playwright install chromium
    $ python3 playwright_scraper.py --category makeup/lips --site-locale us
  2. Run a scraper

    Pick what you need and run it. Every flag is documented in the README.

    $ python3 playwright_scraper.py --category makeup/lips --site-locale gb
  3. Get structured data

    Rows land in JSON or CSV (--format), with a .meta.json sidecar recording status, pages fetched and why the run stopped.

Output

Givenchy Beauty data fields

24 columns per row in a predictable schema. The most useful ones:

FieldWhat it holds
skuVariant id — the shade-level product id
master_idStyle id shared by every shade of a product
titleProduct name
subtitleThe product's tagline
pricePrice as a number; null on showcase locales
currencyCurrency from microdata or JSON-LD, never defaulted
price_sourceWhere the price came from: tile-microdata, tile-text or jsonld
original_priceStruck list price, only when above the sale price
discount_pctDiscount computed from the two prices
shadeThis variant's shade name
shade_countHow many shades the product comes in
shadesShade names the page actually lists
availabilityStock state, e.g. InStock
badgeTile badge, e.g. "New"
localeStorefront locale the row came from
categoryCategory path, e.g. makeup/lips
[
  {
    "source": "givenchybeauty.com",
    "scraped_at": "2026-09-18T11:13:26.782783+00:00",
    "url": "https://www.givenchybeauty.com/us/p/le-rouge-satin-silk-lipstick-F20100269.html",
    "sku": "P000476",
    "title": "LE ROUGE SATIN SILK LIPSTICK",
    "image_url": "https://www.givenchybeauty.com/dw/image/v2/BBZW_PRD/on/demandware.static/-/Sites-givenc…",
    "price": 50.0,
    "currency": "USD",
    "category": "makeup/lips",
    "price_source": "tile-microdata",
    "locale": "us",
    "master_id": "F20100269",
    "brand": "Givenchy beauty",
    "subtitle": "The New Hydrating Long-Wear Lipstick",
    "shade": "PINK-204",
    "shade_count": 19,
    "shades": [
      "NUDE-1",
      "NUDE-5",
      "PINK-204"
    ],
    "size": null,
    "availability": "InStock",
    "original_price": null,
    "discount_pct": null,
    "badge": "New",
    "page": 1,
    "row_index": 0
  },
  {
    "source": "givenchybeauty.com",
    "scraped_at": "2026-09-18T11:13:26.785316+00:00",
    "url": "https://www.givenchybeauty.com/us/p/le-rouge-ph-reactive-hydra-balm-F20100272.html",
    "sku": "P090620",
    "title": "LE ROUGE PH REACTIVE HYDRA BALM",
    "image_url": "https://www.givenchybeauty.com/dw/image/v2/BBZW_PRD/on/demandware.static/-/Sites-givenc…",
    "price": 45.0,
    "currency": "USD",
    "category": "makeup/lips",
    "price_source": "tile-microdata",
    "locale": "us",
    "master_id": "F20100272",
    "brand": "Givenchy beauty",
    "subtitle": "The PH-Reactive 48-Hour Hydrating Black Balm",
    "shade": "TRANSPARENT-23",
    "shade_count": 1,
    "shades": [
      "TRANSPARENT-23"
    ],
    "size": null,
    "availability": "InStock",
    "original_price": null,
    "discount_pct": null,
    "badge": "New",
    "page": 1,
    "row_index": 1
  }
]

First 2 of 16 rows from a real run — sample_output.json. Long values shortened here.

Built for Givenchy Beauty

Handles what breaks naive Givenchy Beauty scrapers

Showcase locales return null, not fake prices

int/en and ru render the catalogue without prices while their tiles carry platform fallbacks like data-currency="USD" and price 0. Those are ignored: no price container means price and currency are both null.

Variant vs style ids kept apart

One master id covers up to nineteen shades of a lipstick. sku is the variant id the tile, JSON-LD and dedupe all agree on; master_id is the style id the product URL carries.

Unit prices stripped before matching

A gb price node renders "£41.00 (£1,025.00/Kg)". Parenthesised groups are removed first, so the per-kilo price is never read as the shelf price.

Akamai's self-clearing interstitial waited out

When a page comes back as Akamai's behavioural interstitial, the engines wait for the site's own content to appear rather than for the challenge markers to vanish — which would stop on an intermediate fingerprinting document and save a row of nulls.

Everything built in

Scraping infrastructure included

The same tested core runs every 2scraper repository, so the hard parts work the same way on every site.

CAPTCHA handling

Detects the challenge a page really serves and, with a 2Captcha key, solves it only when it blocks the data — a capped number of solves per page.

Proxy rotation

Single proxy or a pool from a file, rotated on blocks with a fresh browser per exit. Credentials stay out of argv and logs.

Fingerprints

Optional complete device identity from the 2Captcha Fingerprint API — user agent, client hints, locale and timezone that agree with each other.

Scraping Browser API

Point --cdp-endpoint at a managed Chromium with its own exit country — no browser infrastructure to run yourself.

Honest run metadata

Every run writes a .meta.json sidecar and distinct exit codes: complete, blocked, empty and partial are never confused, and a failed run never overwrites good data.

Diff two runs

diff_runs.py compares two complete Givenchy Beauty snapshots by id — new, removed and changed rows for monitoring.

Use cases

What teams do with Givenchy Beauty data

Luxury beauty price monitoring

Track Givenchy Beauty prices and discounts per shade with diff_runs.py, which separates real price changes from a change in price source.

Cross-market price comparison

Run the same category across us, gb, jp, de and other locales to compare local prices and currencies.

Shade and assortment tracking

Record shade counts, availability and "New" badges to see launches and discontinued shades.

Full-catalogue snapshots

Feed the robots-allowed product sitemap into product mode to capture every product in a locale.

Access & pricing

Free to run. Pay only for what the site requires.

Runs with no key, proxy or account

Measured Sep 2026, a local Chromium with no key, proxy or Scraping Browser endpoint returned complete runs, and so did a bare GitHub Actions runner from a datacentre address. The paid 2Captcha products add volume from many addresses (proxies), a chosen exit country (the Scraping Browser API), no local browser (Scraping Browser API or Scraper API) and a consistent device identity (fingerprints). Sustained high-rate scraping was not tested.

Optional 2Captcha services — captcha solving, the Scraping Browser API, residential proxies and fingerprints — work behind one key.

Good to know

  • One fetch per listing: the site's pagination parameters are disallowed by robots.txt, so --pages above 1 is ignored.
  • shades lists only the swatches the page draws (e.g. 3 of 19); shade_count has the full number.
  • This repo does not implement a paid solve for Akamai's interstitial; it waits for the page to clear itself.

2scraper vs. hosted scraper APIs

2scraperTypical hosted API
CodeOpen source, MIT — read and patch itClosed
CostFree; optional services billed only when usedSubscription or per request / per result
Runs onYour machine, server or CIThe vendor's infrastructure
OutputJSON/CSV files + run metadataAPI responses
When the site changesFix it yourself or open an issue / PRWait for the vendor
FAQ

Givenchy Beauty scraper FAQ

Which locales are supported?

The 11 the site lists: ca/en, de/de, en/ee, es, fr/fr, gb, int/en, it, jp, ru and us, picked with --site-locale. int/en and ru are showcase storefronts with no prices.

Why does a listing run return only one page?

The site pages with ?start=N&sz=25 and robots.txt disallows both parameters, so this repo deliberately fetches one listing page. To cover a whole locale, iterate the robots-allowed product sitemap in product mode.

Do I need a proxy or API key?

Not for the listings and product pages tested: residential and datacentre addresses both got complete runs in Sep 2026. Proxies and the Scraping Browser API help with volume and a specific exit country.

What formats does it write?

JSON and CSV, plus a <out>.meta.json sidecar with status, stop_reason and failed pages by number.

Why does a category return zero products?

Some categories are served with HTTP 200 and list nothing. The run reports exit 4 (zero products), not a block. Category paths also differ between locales — take them from each locale's own sitemap.

Is it legal?

It reads public product listings and pages and respects the site's robots.txt for pagination. Follow the site's terms and the law where you operate.