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

Maison KOSÉ Scraper

Kosé's Japanese online store (maison.kose.co.jp): products, prices, brands, stock and tax rates, with no key or proxy.

  • Playwright
  • Selenium
  • Puppeteer
  • Scraping Browser API
  • JSON
  • CSV
kose-scraper
# Category listing
$ python playwright_scraper.py --url "https://maison.kose.co.jp/site/cosmedecorte/c/c15/" --pages 3
✓ 6 sample rows · 23 columns in sample_output.json
3routes: category, tag facet, product
72products in a 3-page category run, all distinct (Sep 2026)
0captcha markers across 13 captures (Sep 2026)
0keys, proxies or accounts needed
Available Maison KOSÉ scrapers

What the Maison KOSÉ scraper collects

Scrapes category listings, tag facets and product pages from Maison KOSÉ, Kosé's online store in Japan: title, brand, tax-inclusive JPY price, consumption-tax rate, stock and the site's own badges. Product pages add volume, subcategory, colour count, release date and the variant they group with. Output is JSON or CSV with a run sidecar.

Category listing

Input: A category URL or category id

One row per product tile: title, brand, price, tax rate, stock, image and badges, paginated against the site's own page counter.

Category by id

Input: A category id such as c15

The same listing addressed by id alone, since the id is the only part of the URL that selects a category.

Tag facet

Input: One or more site tags

A tag listing that crosses brands, with the brand read from each tile.

Product page

Input: A product (/g/…) URL

One row with volume, subcategory, colour count, release date and the sibling sku the page canonicalises to.

Quick start

From zero to Maison KOSÉ data in 3 steps

  1. Install

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

    $ git clone https://github.com/2scraper/kose-scraper
    $ cd kose-scraper
    $ python3 -m venv .venv && . .venv/bin/activate
    $ pip install -r requirements.txt
    $ pip install -r requirements-playwright.txt
    $ playwright install chromium
  2. Run a scraper

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

    $ python playwright_scraper.py --url "https://maison.kose.co.jp/site/cosmedecorte/c/c15/" --pages 3
  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

Maison KOSÉ data fields

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

FieldWhat it holds
skuKosé goods code, e.g. JQBA
titleProduct name as the site writes it
brandBrand, read from each tile
priceTax-inclusive price
currencyJPY
tax_rateConsumption-tax rate: 10 standard, 8 reduced on ingestibles
in_stockStock from the site's button text, read as an allowlist
price_is_store_priceWhether the site marks the price as its own selling price (※)
badgesSite flags: new, limited, online
image_urlProduct image
categoryCategory id the row came from
volumeSize or volume (product pages)
colour_countNumber of shades (product pages)
release_dateRelease date (product pages)
variant_ofThe different sku a product page canonicalises to, grouping sizes or shades
[
  {
    "source": "maison.kose.co.jp",
    "scraped_at": "2026-09-18T11:09:57Z",
    "url": "https://maison.kose.co.jp/site/cosmedecorte/g/gJQBA/",
    "sku": "JQBA",
    "title": "AQ ミリオリティ ザ クリーム デコラシオン <60g>",
    "brand": "コスメデコルテ",
    "price": 264000.0,
    "currency": "JPY",
    "in_stock": false,
    "image_url": "https://maison.kose.co.jp/img/goods/S/JQBA_sub.png",
    "category": "c15",
    "price_source": "tile",
    "page": 1,
    "position": 1,
    "mode": "listing",
    "tax_rate": 10,
    "price_is_store_price": null,
    "badges": "new",
    "subcategory": null,
    "volume": null,
    "colour_count": null,
    "release_date": null,
    "variant_of": null
  },
  {
    "source": "maison.kose.co.jp",
    "scraped_at": "2026-09-18T11:09:57Z",
    "url": "https://maison.kose.co.jp/site/cosmedecorte/g/gJLCW/",
    "sku": "JLCW",
    "title": "クレンジング美容水",
    "brand": "コスメデコルテ",
    "price": 7700.0,
    "currency": "JPY",
    "in_stock": true,
    "image_url": "https://maison.kose.co.jp/img/goods/S/JLCW_sub.png",
    "category": "c15",
    "price_source": "tile",
    "page": 1,
    "position": 5,
    "mode": "listing",
    "tax_rate": 10,
    "price_is_store_price": true,
    "badges": "new",
    "subcategory": null,
    "volume": null,
    "colour_count": null,
    "release_date": null,
    "variant_of": null
  }
]

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

Built for Maison KOSÉ

Handles what breaks naive Maison KOSÉ scrapers

Detects the repeating last page

A category walked past its end serves its last page again with HTTP 200. The scraper plans against the site's own page counter and stops when a page adds no new sku.

Canonical links don't hijack rows

Five of twenty measured product pages canonicalise to a different size or shade. The row's URL is built from the page's own sku and the canonical goes to variant_of.

Two tax rates, kept apart

Prices are tax-inclusive at 10% or the reduced 8% on ingestibles. tax_rate is a column so a pre-tax figure is never computed from the wrong rate.

Review cards are not products

Product pages reuse the tile class for staff-review cards. An element-qualified selector sees zero of them instead of inventing fifteen products per page.

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 Maison KOSÉ snapshots by id — new, removed and changed rows for monitoring.

Use cases

What teams do with Maison KOSÉ data

Japanese beauty price monitoring

Track JPY prices for Cosme Decorté and other Kosé brands across runs with diff_runs.py.

Assortment and launch tracking

Watch new and limited badges and release dates to see what Kosé launches and retires.

Stock watching

Follow which products the store marks as unavailable or closed for reservation.

Cross-brand catalogue analysis

Use tag facets to compare skincare lines across Kosé's brands in one table.

Access & pricing

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

Runs with no key, proxy or account

No 2Captcha key, proxy or browser is needed: curl, requests and a browser all got the same full page from a datacentre address, and no captcha marker appeared in 13 captures (measured 2026-09-18). A Japanese exit is not required. Proxies help only at volume, the Scraping Browser API removes local Chromium, and the captcha solver is wired for the day a challenge appears.

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

Good to know

  • One market only: every row is JPY, and the site has no English route.
  • The site offers no sort control, so rows follow the site's own order.
  • The --cdp-endpoint path was not verified live on this site; the profile available had expired.

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

Maison KOSÉ scraper FAQ

Why maison.kose.co.jp and not kose.com?

kose.com has a broken DNS delegation and resolves for nobody (measured 2026-09-18). Kosé's actual online store is Maison KOSÉ, where www.kose.co.jp sends visitors.

Do I need a proxy or a Japanese IP?

No. A German datacentre address was served the same pages, and 12 back-to-back pages all returned HTTP 200.

Are prices before or after tax?

Tax-inclusive. The tax_rate column says whether a product is at the standard 10% or the reduced 8%.

Why are there no discount or rating columns?

Out of 360 price nodes surveyed, none carries a was-price, and no tile or product page publishes a rating. A column that would be null on every row is not shipped.

What output formats are there?

JSON and CSV plus a .meta.json sidecar. A run that finds nothing writes nothing, so last night's good output is never replaced with an empty file.

Is it legal to scrape Maison KOSÉ?

It reads public listing and product pages without logging in or collecting personal data. Follow the site's terms and the law.