# Taobao & Tmall Product Scraper - Prices, Shops, Ratings (`neverempty/taobao-product-scraper`) Actor

Taobao and Tmall products by keyword or product ID: Chinese title, price in CNY, shop name and ID, shop ratings, Tmall or Taobao shop, seller location, images, category and link. Reads Taobao's public pages with no login and no cookies. Export as JSON, CSV or Excel. Unofficial.

- **URL**: https://apify.com/neverempty/taobao-product-scraper.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 product returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Taobao & Tmall Product Scraper

Get Taobao and Tmall products by keyword or by product ID: the Chinese title as the shop wrote it, the price in Chinese yuan (CNY), the shop name, ID and ratings, images, category, seller location and the product link. No login, no cookies, no browser: each run reads the public product pages Taobao publishes for search engines.

### What you get

- **Search by keyword** - up to 20 products per search term, up to 10 search terms per run. Sort by Taobao default or by sales (best sellers first).
- **Look up products by ID or link** - paste item.taobao.com or detail.tmall.com links (or just the ID) and get the product page values. Up to 100 products per run.
- **Price in CNY, stated on every row** - the search list price, or the product page price when the product page is read. When the two show different prices, both are returned and the row says so.
- **Shop details** - shop name and ID, Tmall or Taobao shop, shop scores for description, service and logistics, credit level, opening date and number of products.
- **Product details** - image links, category IDs, seller location, free-shipping flag, selling points and the review keywords Taobao shows in the search list.
- **Honest rows** - a search with no results, a product ID that no longer exists, or a page that could not be read comes back as a free row that says why. Nothing is guessed.

### Input

| Field | What it does |
|---|---|
| Search terms | What you would type into the Taobao search box, for example 手机壳 or 蓝牙耳机. |
| Products (ID or URL) | Taobao or Tmall product IDs or links. |
| Sort order | Taobao default, or Sales (best sellers first; same order on repeated runs). |
| Max products per search | 1 to 20. |
| Open each product page | Also read each search result's product page for shop ratings, shop type, seller location and the product page price. |

Example input:

```json
{
    "searchQueries": ["手机壳", "蓝牙耳机"],
    "products": ["https://item.taobao.com/item.htm?id=551686074084"],
    "sort": "sales",
    "maxResultsPerSearch": 20,
    "includeDetails": false
}
```

### Output

One row per product. Example (shortened):

```json
{
    "status": "ok",
    "charged": true,
    "itemId": "551686074084",
    "title": "绿联Type-C快充线 6A大电流适用华为安卓100W手机充电线",
    "price": 16,
    "currency": "CNY",
    "priceSource": "product-page",
    "shopId": "...",
    "shopName": "绿联数码旗舰店",
    "shopType": "tmall",
    "shopRating": { "description": 4.8, "service": 4.8, "logistics": 4.9 },
    "imageUrls": ["https://img.alicdn.com/..."],
    "url": "https://detail.tmall.com/item.htm?id=551686074084",
    "checkedAt": "2026-10-25T08:00:00.000Z"
}
```

Export the dataset as JSON, CSV, Excel or HTML, or read it through the Apify API.

### Pricing

You pay a small fee when a run starts and then per product row with a price. Free rows (no results, product not found, not readable, budget reached) are never charged. Set a maximum total charge on the run and the Actor stops before going over it.

### FAQ

#### How do I scrape Taobao product prices?

Put your search terms (Chinese works best) in Search terms, or paste product links in Products, and start the run. Each row has the price in CNY, the shop and the product link.

#### Can I get Tmall products too?

Yes. Tmall products appear in Taobao search, and detail.tmall.com links work in Products. The shopType field says tmall or taobao when the product page is read.

#### Do I need a Taobao account or cookies?

No. The Actor reads only public pages and sends no login or cookies.

#### Why is the price on the search list different from the product page?

Taobao shows promotions differently on the two pages. With Open each product page on, price is the product page price and searchListPrice keeps the list price; priceNote says when they differ.

### Limitations

- Each search term returns at most 20 products: Taobao's public search page shows 20 and cannot be paged. Use more specific search terms to reach other products.
- Sales counts and variants (color, size with their own price and stock) are not on the public pages this Actor reads, so salesCount and skus are always null, with a note saying so.
- originalPrice (price before discount) is filled only when the product page shows a separate, higher price. Taobao's public pages usually show one price, so it is often null.
- Short share links (tb.cn) are not supported; open them in a browser and copy the full link.
- If Taobao shows a check or sign-in page, the Actor stops and says so. It does not solve or bypass check pages. In our tests this happened after about 100 pages in one run (for example 5 searches with Open each product page on); rows returned before that are kept and charged, the rest are not. Searches without product pages use 1 page each.
- Prices are what Taobao shows to a visitor without an account and can differ from what a signed-in buyer sees after coupons.
- This Actor is not affiliated with Taobao, Tmall or Alibaba.

### Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

- **Missing a field, or need another filter?** Tell us in the **Issues** tab. If the data is there, we add it.
- **Found a bug or a wrong value?** Post the run ID in the **Issues** tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.

# Actor input Schema

## `searchQueries` (type: `array`):

What you would type into the Taobao search box, for example 手机壳, 蓝牙耳机 or 连衣裙. Chinese terms match best; English terms also work. Each search returns up to 20 products (Taobao's public search page shows 20 and cannot be paged). Up to 10 search terms per run. Leave Search terms and Products both empty to run the example search 手机壳.

## `products` (type: `array`):

Optional. Taobao or Tmall product IDs or links, for example 551686074084, https://item.taobao.com/item.htm?id=551686074084 or https://detail.tmall.com/item.htm?id=551686074084. Each one returns the product page values: price, shop ratings, Tmall or Taobao shop, seller location. Short share links (tb.cn) are not supported; open them in a browser and copy the full link. Up to 100 per run.

## `sort` (type: `string`):

Order of the search results. Taobao default can change from one request to the next; Sales gives the same order on repeated runs.

## `maxResultsPerSearch` (type: `integer`):

How many products to return for each search term, from 1 to 20. You are charged only for the products returned.

## `includeDetails` (type: `boolean`):

When on, each search result's product page is also read, adding shop ratings (description, service, logistics), shop type (Tmall or Taobao), shop credit level, seller location and the product page price. Slower: about three extra seconds per product. Products given by ID or URL always use the product page.

## Actor input object example

```json
{
  "searchQueries": [
    "手机壳"
  ],
  "sort": "default",
  "maxResultsPerSearch": 20,
  "includeDetails": false
}
```

# Actor output Schema

## `results` (type: `string`):

One row per Taobao or Tmall product: item ID, Chinese title, price in CNY, shop name, ID and ratings, images, category, location and link. A search with no products, a product that no longer exists, a check page, or a run that hit its maximum charge comes back as a free row that says why.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "手机壳"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/taobao-product-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "searchQueries": ["手机壳"] }

# Run the Actor and wait for it to finish
run = client.actor("neverempty/taobao-product-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "手机壳"
  ]
}' |
apify call neverempty/taobao-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neverempty/taobao-product-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/VSbthaiHtAkhno2OE/builds/YmhIjIaLjdBDmVR0e/openapi.json
