Taobao Product Feed Scraper avatar

Taobao Product Feed Scraper

Pricing

Pay per event

Go to Apify Store
Taobao Product Feed Scraper

Taobao Product Feed Scraper

A Taobao product discovery feed: title, price in CNY, image, product URL, seller and shop IDs, from Taobao's own recommendation module. No account, no Chinese IP, no browser. $1.95 per 1,000 products, flat on every plan. Feed, not keyword search.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Reads the product feed behind the 猜你喜欢 ("guess you like") strip on the taobao.com homepage and hands it back as rows. Product ID, title, price in CNY, image, clean product URL, seller ID, shop ID and two levels of category ID.

No login. No cookies to paste. No API key. No browser, so nothing to babysit. It talks to Taobao's own mobile JSON gateway over plain HTTP through rotating datacenter addresses.

Read this before you buy: there is no keyword box. This is a discovery firehose, not a search engine. See What this does not do.


What you get

One run with maxItems: 800 returned 800 distinct products from 49 calls in 78 seconds. Coverage below is measured on exactly that run, not estimated:

FieldCoverageExample
productId100%1050937490916
title100%`三顿半
price100%299
currency100%CNY (always)
productUrl100%https://item.taobao.com/item.htm?id=1050937490916
imageUrl100%https://img.alicdn.com/bao/uploaded/...jpg
sellerId100%3519432762
shopId100%66539736
categoryId100%50002256 (leaf category)
rootCategoryId100%50026316 (level-1 category)
similarItemsUrl100%Taobao's "find similar" page for the item
trackedUrl100%the feed's original link, with its scm / pvid attribution intact
skuId82%6279287258491 — Taobao only puts a SKU on some cards
promotionBadgeImageUrl33%the promo ribbon image Taobao draws on the tile
feedPage, feedPosition, scrapedAt100%where in the feed the row came from

Spread, re-measured on 2026-08-09 across 1,021 distinct products (two 600-product runs): 745 distinct shops, 371 distinct leaf categories, 77 level-1 categories, prices from ¥0.01 to ¥99,999 with a median of ¥19.9 — 95% of rows under ¥200 and 99% under ¥1,000. The ¥99,999 row is a single real phone listing; the next highest was ¥5,000. Products are deduplicated by productId within a run — 0 duplicates in either 600-row run.


What this does not do

Being blunt about this is cheaper for both of us than a refund.

  • No keyword search. There is no query parameter and there is no way to add one. Taobao's search API (mtop.taobao.wsearch.appsearch) answers RGV587_ERROR::SM and redirects to login.taobao.com/member/login.jhtml?...&from=sm. That is an authentication demand, not a captcha, and it was re-tested from a home address, two datacenter addresses, a rented static-ISP address and a mainland-China address, at four API versions, over GET and POST, on four Alibaba hosts and under three different referers. Every combination fails identically. If you need keyword search, this is not the actor.
  • No product detail. Same wall: mtop.taobao.detail.getdetail, getdesc and mtop.taobao.rate.detaillist.get are all behind it. So there is no description, no stock, no shipping, no attributes, no variants and no reviews here. The feed is card-level data only.
  • No sales volume. The raw card has a month_sale field. It was an empty string on 480 out of 480 rows and on every row since, so this actor does not emit it. A "monthly sales" column built out of that field would be fiction.
  • No list price / discount. The card also carries an originUmpPrice:1320^1500 pair that reads like a was/now price. On 139 of 480 rows neither number matched the price actually charged, and on 352 of 480 the two numbers were identical. Publishing it as a discount would be making one up.
  • No control over which products appear. Taobao decides. You can narrow the results by price after the fact, and that is all.
  • Not a stable catalogue. The same product IDs do not come back run after run. This is a live merchandising feed.

Limits, measured

Depth. The response advertises pageTotal: 12 and itemTotal: 300. Both are cosmetic and both are wrong — pageNum keeps working past 200 and single runs have pulled 1,580 distinct products. pageSize is ignored outright: the server returns exactly 20 cards whatever you ask for (tested at 20, 40, 50, 100 and 200). So depth comes from the feed reshuffling between calls, not from paging.

Yield. About 13 new products per call, averaged over 120 calls. It decays as a run accumulates IDs: roughly 16/call over the first twenty calls, about 8/call by the hundredth. Real runs — 5 products in 1 call, 400 in 23 calls (46 s), 800 in 49 calls (78 s), 1,000 in 61 calls, 1,580 in 120 calls. Asking for a lot more than ~1,500 in one run means a long tail of calls for very few new rows, so the actor stops on its own after 12 consecutive calls that return nothing new and tells you why. It also stops cleanly before the run timeout rather than being killed mid-walk.

Rate limit. This is the real constraint, and it is a call count per exit address, not a rate. About 50 calls per address, then Taobao answers FAIL_SYS_USER_VALIDATE with an x5secdata cookie and stays that way for that address. Measured first block at call #52, #52, #54 and #55 on four independent addresses. There is no burst limit at all — 25 back-to-back calls with zero delay were 25/25 successful. The actor rotates its exit address every 40 calls, which recovers instantly and means a normal run never sees a block. Roughly 1 in 5 fresh datacenter addresses arrives already flagged; the actor throws those away on sight and takes another rather than reporting a failure.

Transient errors. Roughly 1 call in a few hundred comes back with Alibaba's own TppErrorCode-[SOLUTION_EXECUTE_TIMEOUT] (their internal 999 ms RPC timeout). The actor retries in place instead of rotating, because the address is fine.

Proxies. Plain Apify datacenter addresses are enough. No Chinese IP, no residential bandwidth, no ISP pool. A 120-call run over datacenter addresses had zero blocks. If you want to use your own proxy servers, there is a field for it under Advanced, but nothing about this endpoint requires it. Not all addresses answer at the same speed — one 1,000-product run drew an address that took ~10 s per call where the first took ~1.6 s — so the actor watches its own latency and swaps a slow address out.

Stability. The feed this actor reads is one Taobao publishes for its own home-page modules, and Alibaba can retire or renumber it at any time, without notice — there is nothing anyone can do about that. If it happens, this actor writes an uncharged FEED_UNAVAILABLE row saying exactly what Taobao answered, and fails loudly. It will not quietly return zero rows and bill you for the run.


Input

FieldTypeNotes
maxItemsinteger 1–5000How many distinct products to return. You are charged once per product. Leave it empty and the run returns one free sample row instead of scraping.
minPriceCnyintegerOptional. Drop anything under this many yuan.
maxPriceCnyintegerOptional. Drop anything over this many yuan.
maxRequestsintegerOptional ceiling on calls to Taobao. Left empty, the actor sizes it from maxItems.
proxyConfigurationobjectOptional. Your own proxy servers, if you would rather use them.
{
"maxItems": 500
}

Price filtering runs locally, after Taobao has answered, because the feed has no price parameter. Rows dropped by a filter are not charged — but they do cost requests, so a narrow window makes a run slower and may not fill the order. A real run asking for 30 products between ¥150 and ¥900 made 20 calls, returned 19 products and threw away 361 that fell outside the window; you were charged for 19. If a window matches almost nothing, the run stops early and says so rather than grinding.


Output

{
"productId": "949545269284",
"title": "butterfly香水小样泰国小众沉香木与安息香泥中水牛月桂叶",
"price": 27,
"currency": "CNY",
"productUrl": "https://item.taobao.com/item.htm?id=949545269284",
"imageUrl": "https://img.alicdn.com/bao/uploaded/i4/.../O1CN...-item_pic.png",
"skuId": "6279287258491",
"sellerId": "3519432762",
"shopId": "385530380",
"categoryId": "50010815",
"rootCategoryId": "50050359",
"promotionBadgeImageUrl": null,
"similarItemsUrl": "https://www.taobao.com/market/lu/findgoods_router.php?id=949545269284",
"trackedUrl": "https://item.taobao.com/item.htm?id=949545269284&scm=...&pvid=...",
"feedPage": 3,
"feedPosition": 11,
"scrapedAt": "2026-08-09T17:20:41.006Z"
}

Titles are Chinese, because Taobao is a Chinese marketplace. Prices are yuan.


What it is good for

  • Trend and assortment sampling. A few thousand rows a day is a rolling read of what Taobao is actively merchandising, with category IDs attached.
  • Price benchmarking by category. rootCategoryId plus price over a few runs gives a real distribution instead of a guess.
  • Seller and shop discovery. 625 distinct shops in one 800-row run, each with sellerId and shopId you can key on.
  • Product-image and title corpora for training, search or classification work.
  • Seeding another pipeline. productId is the id every other Taobao tool expects.

It is not for "find me every red dress under ¥50". Taobao puts keyword search behind a logged-in account, and this actor does not use one.


FAQ

Can I search Taobao by keyword with this? No. It has no keyword input. Taobao's keyword search API requires a logged-in account, and this actor does not use one.

Can I scrape a specific Taobao product by ID or URL? No. Taobao's product-detail API is behind the same login wall as search. This actor only returns what the homepage feed hands out.

Do I need a Taobao account, cookies, or a Chinese IP address? None of the three. Plain datacenter addresses work.

Are the titles in English? No, Chinese. The feed returns what Taobao stores. Run them through a translator if you need English.

How many products can I get in one run? 1,580 distinct products in one 120-call run is the highest measured. Up to about 800 the yield is close to linear (800 rows in 49 calls, 78 seconds). Past ~1,500 you are paying for a lot of calls to find a few new items.

How much does it cost? $1.95 per 1,000 products, plus a $0.001 start fee. It is a flat rate: the same $1.95 on the free plan as on any paid one, with no volume tiers, no minimum spend and no add-on fees. A 1,000-product discovery run costs $1.951 whether it takes one minute or five.

Its sibling Taobao Category Products Scraper returns product rows at the same $1.95 per 1,000, on a $0.002 start fee instead of $0.001. Pick this one when you want a broad discovery feed across the whole catalogue; pick that one when you know which category you want and would rather page through it deterministically.

Will I get the same products if I run it twice? Some overlap, not the same set. The feed reshuffles constantly and Taobao decides what is in it.

Does it include sales volume, reviews, or stock? No. See What this does not do. The feed does not carry them, and the APIs that do are behind a login wall.

What happens if a run gets blocked? It writes an uncharged BLOCKED row with the exact response Taobao gave and how many products it had returned before that point. You are charged for products, never for failures.

What am I charged for? One event per product row. Sample rows, diagnostic rows, filtered-out rows and failed runs are all free.


Charging

Pay per event: $1.95 per 1,000 products ($0.00195 each), plus a $0.001 actor start fee. One product event per product row written to the dataset. Nothing else is charged:

  • an empty input returns one labelled sample row and charges nothing,
  • rows dropped by minPriceCny / maxPriceCny charge nothing,
  • BLOCKED, NO_RESULTS, FEED_UNAVAILABLE and RUN_FAILED diagnostic rows charge nothing.