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

Rakuten Ichiba Scraper

Japan's largest marketplace — prices, Rakuten points, shipping, shops and reviews. No key, no proxy, no account.

  • Playwright
  • Selenium
  • Puppeteer
  • Scraping Browser API
  • JSON
  • CSV
rakuten-scraper
# Keyword search
$ python3 playwright_scraper.py --url "https://search.rakuten.co.jp/search/mall/コーヒー/" --pages 3
✓ 9 sample rows · 42 columns in sample_output.json
42output columns
45products per listing page
135rows from a 3-page run, 100% priced, Sep 2026
0keys, proxies or accounts needed (measured Sep 2026)
Available Rakuten Ichiba scrapers

What the Rakuten Ichiba scraper collects

Scrapes Rakuten Ichiba keyword searches, genre listings and single item pages into 42 columns: price in JPY, Rakuten points and point rate, shipping fee, delivery estimate, shop, genre, review score and count, and per-variant prices on item pages. Output is JSON or CSV with a sidecar that records the site's own result cap.

Keyword search

Input: A search.rakuten.co.jp/search/mall/{keyword}/ URL

45 products per page with price, points, shipping, shop, genre, rating and review count; the site's own filters in the URL survive pagination.

Genre listing

Input: A genre URL by Rakuten's genre id

Every product in a Rakuten genre, paginated with ?p=N, with the same columns as a search.

Single item

Input: An item.rakuten.co.jp/{shop}/{code}/ URL

One item with per-variant prices, a variant count and a was-price only when Rakuten marks it verified.

Filtered search

Input: A search URL with price-band or other filters

Narrows a query with Rakuten's own filters — the way to reach more of a result set the site caps at 150 pages.

Quick start

From zero to Rakuten Ichiba data in 3 steps

  1. Install

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

    $ git clone https://github.com/2scraper/rakuten-scraper.git && cd rakuten-scraper
    $ python3 -m venv .venv && . .venv/bin/activate
    $ pip install -r requirements.txt -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.

    $ python3 playwright_scraper.py --url "https://search.rakuten.co.jp/search/mall/コーヒー/" --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

Rakuten Ichiba data fields

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

FieldWhat it holds
sku{shopCode}:{manageNumber} — Rakuten's own item code, the same on listing and item pages
titleItem title as the merchant writes it
pricePrice as a number
currencyJPY, as stated by the site's own page-1 JSON-LD
pointsRakuten points earned on purchase
point_ratePoint multiplier (e.g. 10 for a 10x campaign)
shipping_feeShipping fee; 0 when free
delivery_estimateThe site's delivery estimate text
subscription_priceSubscription (定期購入) price where offered
price_maxHighest variant price when variants differ
ratingReview score; null on unreviewed items
review_countNumber of reviews
shop_nameMerchant selling the item
brandBrand from Rakuten's own brand tag
categoryGenre path as text
genre_rankThe item's rank in its genre ranking, where published
[
  {
    "source": "rakuten.co.jp",
    "scraped_at": "2026-09-21T09:22:22.033307+00:00",
    "url": "https://item.rakuten.co.jp/ajinomoto/r4901111371248/",
    "sku": "ajinomoto:r4901111371248",
    "title": "【9/24まで P10倍!】味の素AGF ブレンディ スティックブラック100本コーヒー スティックコーヒー インスタントコーヒー 簡単 大容量 まとめ買い AGF ギフト お中元",
    "brand": "味の素AGF",
    "price": 2447.0,
    "currency": "JPY",
    "original_price": null,
    "discount_pct": null,
    "rating": 4.76,
    "review_count": 475,
    "in_stock": true,
    "image_url": "https://thumbnail.image.rakuten.co.jp/@0_mall/ajinomoto/cabinet/prd/48/r4901111371248_2…",
    "category": "水・ソフトドリンク > コーヒー > インスタントコーヒー",
    "price_source": "state",
    "page": 1,
    "position": 1,
    "variant_id": "r4901111371248",
    "item_number": "10000338",
    "price_max": 6975.0,
    "has_price_range": true,
    "subscription_price": 2324.0,
    "points": 220,
    "point_rate": 10,
    "shipping_fee": 0.0,
    "free_shipping": true,
    "delivery_estimate": "最短9/23お届け",
    "shop_name": "味の素グループ公式ショップ",
    "shop_code": "ajinomoto",
    "shop_id": 383220,
    "shop_url": "https://www.rakuten.co.jp/ajinomoto/",
    "genre_id": 303017,
    "genre_path": "/0/100316/100356/303017",
    "genre_rank": 2,
    "is_super_deal": false,
    "is_39shop": true,
    "is_official_shop": true,
    "variant_count": null,
    "original_price_label": null
  },
  {
    "source": "rakuten.co.jp",
    "scraped_at": "2026-09-21T09:22:22.033563+00:00",
    "url": "https://item.rakuten.co.jp/sawaicoffee-tea/ac-sale-1960/",
    "sku": "sawaicoffee-tea:ac-sale-1960",
    "title": "\先着300円OFFクーポン配布/ 送料無料 コーヒー コーヒー豆 コーヒー粉 珈琲豆 豆のまま \"グルメ大賞9度受賞の1番選ばれるコーヒーセット\" 澤井珈琲 1kg 2kg…",
    "brand": "澤井珈琲",
    "price": 2788.0,
    "currency": "JPY",
    "original_price": null,
    "discount_pct": null,
    "rating": 4.7,
    "review_count": 50175,
    "in_stock": true,
    "image_url": "https://thumbnail.image.rakuten.co.jp/@0_mall/sawaicoffee-tea/cabinet/thum/ff26/ac-sale…",
    "category": "水・ソフトドリンク > コーヒー > コーヒー豆",
    "price_source": "state",
    "page": 1,
    "position": 2,
    "variant_id": "ac-sale-1960-80-as-m",
    "item_number": "10001136",
    "price_max": 8888.0,
    "has_price_range": true,
    "subscription_price": 2509.0,
    "points": 50,
    "point_rate": 2,
    "shipping_fee": 0.0,
    "free_shipping": true,
    "delivery_estimate": "最短9/23お届け",
    "shop_name": "澤井珈琲Beans&Leaf",
    "shop_code": "sawaicoffee-tea",
    "shop_id": 198667,
    "shop_url": "https://www.rakuten.co.jp/sawaicoffee-tea/",
    "genre_id": 201402,
    "genre_path": "/0/100316/100356/201402",
    "genre_rank": 1,
    "is_super_deal": false,
    "is_39shop": true,
    "is_official_shop": false,
    "variant_count": null,
    "original_price_label": null
  }
]

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

Built for Rakuten Ichiba

Handles what breaks naive Rakuten Ichiba scrapers

Skips the decoy JSON-LD

A search page's only JSON-LD holds 10 SEO-carousel items while the page holds 45 products. The scraper reads the page's own __INITIAL_STATE__ payload instead, using JSON-LD only for the currency.

Detects page-1 repeats past the end

Rakuten serves page 1 again for out-of-range ?p= values with HTTP 200. Every page is checked against the offset the server says it used, so a run never fills up with duplicates.

Sponsored slots filtered

Paid placements injected into the result list are dropped and position counts emitted rows, so the same listing gives the same positions in every engine.

Points tracked, throttles waited out

A 10x point campaign is a discount that never touches price, so diff_runs.py tracks points too. A 503 throttle gets a wait at the same exit rather than being reported as a block.

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

Use cases

What teams do with Rakuten Ichiba data

Japanese e-commerce price monitoring

Track prices, points and shipping for a product set across the many shops that sell the same article.

Effective-price analysis

Combine price, point_rate and shipping_fee to see the real cost of an item through a Super Sale or point campaign.

Merchant and assortment research

Map which shops sell in a genre, how many are official stores, and how they rank and are reviewed.

Market entry and category sizing

Use the site's own result totals and genre listings to gauge category depth and price bands in Japan.

Access & pricing

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

Runs with no key, proxy or account

Listings and item pages need no key, proxy or account: measured 2026-09-21 from a datacentre address, a 3-page run returned 135 rows, all priced, and a daily canary runs from a bare GitHub runner. What Rakuten refuses is a client whose claimed identity contradicts itself, so do not add a bare user agent. The paid products buy specific things: residential proxies for volume (avoiding the 503 throttle), the Scraping Browser API for a chosen exit country without local browsers, a complete fingerprint for a consistent identity, and the Scraper API for one HTTP request per page.

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

Good to know

  • Capped by the site at 150 pages of 45 per query; slice large queries with filters.
  • ranking.rakuten.co.jp and merchant storefront pages are not implemented.
  • in_stock is true on every listing row because search excludes sold-out items.

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

Rakuten Ichiba scraper FAQ

Do I need a proxy for Rakuten?

No. Listings and item pages were served to a plain datacentre address in the README's tests. Proxies help with volume if you hit the 503 throttle; raising --delay is the first fix.

How many results can I get per query?

Rakuten serves at most 6,750 results per query — 150 pages of 45 — however many it matched. The sidecar records the site's total and the cap; narrow with filters to reach more.

Why is original_price empty on listings?

The listing payload publishes no was-price. Item pages carry one only when Rakuten marks it verified, and product mode reads it from there.

Does --locale en translate products?

No. ?lang=en changes the navigation chrome; product names, shop names and tags are merchant-authored Japanese and come back unchanged.

Which URLs are supported?

Keyword searches, genre listings and item pages. Merchant storefront pages are refused with the reason, and ranking pages are not implemented.

Is scraping Rakuten legal?

It reads public pages, uses a delay between pages and never logs in or touches checkout. Follow the site's terms and the law where you operate.