Scrape ASOS product data from Python or the command line: search results with the product name, brand, current and was-price, discount, colourway, ASOS's own flags (marked down, outlet, selling fast, new in) and images, as JSON or CSV. The code is free and open source (MIT). It runs on the QuanticData Data API, so there are no proxies to rotate and no headless browser to keep alive: sign in once and run a command.
pip install git+https://github.com/quantumproxies/asos-scraper
asos-scraper login
asos-scraper search "white sneakers" --max-results 48 -o white_sneakers.csvlogin opens the QuanticData sign-in page in your browser. New accounts get $2 of free usage every month, no card required: create one.
| Command | Input | Returns | Per run |
|---|---|---|---|
asos-scraper search |
keyword | Name, brand, price, was-price, colour, image, 28 fields per row (fields and price) | up to 300 |
Searches run on the ASOS US store, so prices are in USD. product_id is the id in the /prd/ product URL, other_colour_ids lists the same style in other colours, and lowest_price_30d is the lowest price of the last 30 days when ASOS states one.
A real row from asos-scraper search "white sneakers" --max-results 3 (2026-10-23):
{
"rrp": null,
"url": "https://www.asos.com/new-balance/new-balance-204l-suede-sneakers-in-off-white/prd/210982370#colourWayId-210982372",
"name": "New Balance 204L suede sneakers in off white",
"rank": 1,
"brand": "New Balance",
"image": "https://images.asos-media.com/products/new-balance-204l-suede-sneakers-in-off-white/210982370-1-cream",
"price": 90,
"colour": "CREAM",
"images": [
"https://images.asos-media.com/products/new-balance-204l-suede-sneakers-in-off-white/210982370-1-cream",
"https://images.asos-media.com/products/new-balance-204l-suede-sneakers-in-off-white/210982370-2"
],
"is_new": false,
"currency": "USD",
"is_outlet": false,
"video_url": null,
"price_text": "$90.00",
"product_id": "210982370",
"discount_pct": 25,
"is_promotion": false,
"is_sponsored": false,
"product_code": "157492130",
"colour_way_id": "210982372",
"is_marked_down": true,
"original_price": 119.99,
"is_selling_fast": true,
"lowest_price_30d": 90,
"other_colour_ids": [],
"is_restocking_soon": false,
"has_multiple_prices": false,
"has_variant_colours": false
}from quanticdata_asos_scraper import AsosScraper
asos = AsosScraper() # saved login, or QUANTICDATA_API_KEY
sneakers = asos.search("white sneakers", max_results=48)
for p in sneakers:
print(p["product_id"], p["brand"], p["price"], p["original_price"], p["discount_pct"], p["name"])
sneakers.to_csv("white_sneakers.csv")
dresses = asos.search("dress", max_results=300)
marked_down = [p for p in dresses if p["is_marked_down"]]
print(f"{len(marked_down)} of {len(dresses)} dresses are marked down")Each call returns a Run: iterate it for the rows (plain dicts), take len(), or save it with to_csv(), to_json(), to_jsonl() or to_dataframe() (pandas). Errors are specific: InsufficientCredit, RateLimited, InvalidInput, JobFailed, AuthError.
- Markdown tracking: Check a query every day and log which products are marked down, by how much, and which are selling fast. See
examples/markdown_tracker.py. - Brand mix of a category: Search a category and see how many products each brand has, its median price and its share of marked-down items. See
examples/brand_mix.py. - Assortment export: Run a list of queries and get one CSV with every product, colourway, price and flags. See
examples/search_to_csv.py.
Results print as a table; -o file.csv, -o file.json or -o file.jsonl writes a file. List inputs take a b c, a,b,c, @file.txt (one per line) or - (stdin). --no-wait starts a long run in the background and prints its id; asos-scraper run <id> -o out.csv collects it later.
Product search on ASOS — name, brand, price, was-price, colour, image.
asos-scraper search QUERY [options]
| Option | Type | Default | Description |
|---|---|---|---|
QUERY |
string | What to search, e.g. "dress". | |
--max-results |
integer | 24 |
How many products to deliver at most (1–300). You pay only for delivered products. |
asos-scraper search: 28 fields
| Field | Type | Description |
|---|---|---|
rank |
integer | 1-based position in ASOS's ordering for this response. |
product_id |
string | ASOS product id — the id that keys the /prd/ page. |
product_code |
string or null | ASOS internal product code (does not key the URL). |
name |
string | Product name. |
brand |
string or null | Brand name. |
colour |
string or null | Colourway as ASOS states it — its own casing is inconsistent ("PINK", "Chocolate"). |
colour_way_id |
string or null | ASOS colourway id (the #colourWayId fragment on the URL). |
price |
number or null | Current price (USD). |
price_text |
string or null | Current price as ASOS formats it ("$52.00"). |
original_price |
number or null | Struck-through was-price (USD); null when not reduced. |
rrp |
number or null | Recommended retail price (USD) when ASOS states one. |
currency |
string | Currency of the prices: USD, from the ASOS US store. |
discount_pct |
integer or null | Percent off the was-price; null unless both prices are stated. |
is_marked_down |
boolean | ASOS's own markdown flag. |
is_outlet |
boolean | Outlet pricing. |
is_selling_fast |
boolean | ASOS's low-stock badge. |
is_new |
boolean | ASOS's "New in" flag. |
is_sponsored |
boolean | Paid placement (ASOS keeps these out of the product list; false on every organic row). |
url |
string or null | Product URL. |
image |
string or null | Primary product image. |
images |
string[] | Gallery image URLs (main image first). |
video_url |
string or null | Catwalk video URL when the product has one. |
lowest_price_30d |
number or null | Lowest price in the last 30 days when ASOS states it. |
has_variant_colours |
boolean | True when the product page offers other colours. |
has_multiple_prices |
boolean | True when sizes or variants are priced differently. |
is_restocking_soon |
boolean | True when ASOS marks the product as restocking soon. |
is_promotion |
boolean | True when the product is in a promotion. |
other_colour_ids |
string[] | Product ids of the same style in other colours. |
asos-scraper loginsigns you in with OAuth 2.1 and PKCE in the browser. The token is stored in~/.config/quanticdata/credentials.json(readable only by you) and refreshed automatically. One login serves every QuanticData tool on the machine.- No browser on the machine (SSH, Docker, Colab): run
asos-scraper login --no-browser, open the link anywhere, then paste back the address the browser ends on. - Scripts and CI: set
QUANTICDATA_API_KEYto a key from the dashboard, or store one withasos-scraper login --api-key. asos-scraper logoutrevokes the token. The connection is listed under API keys in the dashboard as "API · QuanticData CLI"; deleting that key disconnects every machine that uses it.
The code is free and MIT-licensed. Runs are billed to your QuanticData account per delivered row, at the price shown on each collector page linked above; $2 of usage is free every month and failed runs are never billed. Plans with higher limits: pricing.
The same data over plain HTTP:
curl -X POST https://api.quanticdata.io/v1/scraper/collectors/asos_search/run \
-H "Authorization: Bearer $QUANTICDATA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input": {"query": "white sneakers", "max_results": 3}}'- API reference with Python, Node, PHP and curl examples.
- MCP server to give Claude, Cursor or any MCP client the same tools.
- n8n node for no-code workflows.
Is this ASOS scraper free?
The code is free and MIT-licensed. Scraping runs on your QuanticData account: $2 of usage is free every month with no card, then you pay per delivered row at the price shown on each collector page. Failed runs are never billed.
Do I need proxies or a headless browser?
No. You send a keyword and get rows back; the requests run on QuanticData's side.
Which ASOS store and currency?
The ASOS US store. Prices come back in USD, and every row carries the currency code next to the price.
How many products can one run return?
Up to 300 products per run; ask for fewer with --max-results and you pay only for what is delivered.
Can I export to CSV or Excel?
Add -o results.csv (or .json, .jsonl). Lists such as the image gallery and the other colour ids are joined with '; ', so the CSV opens cleanly in Excel or Google Sheets.
Can I run it on a schedule?
Yes. Set QUANTICDATA_API_KEY in the environment and call the CLI or examples/markdown_tracker.py from cron, GitHub Actions or any scheduler.
- Zalando Product Scraper: Zalando product scraper for Python and the command line.
- Nike Scraper: Nike scraper for Python and the command line.
MIT. Built and maintained by QuanticData.