# Suning.com Search Scraper (`datacach/suning-search-scraper`) Actor

Searches Suning.com (苏宁易购) by keyword and returns product listings: title, price, discount, reviews, seller and image.

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

## Pricing

from $0.50 / 1,000 products

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

Search **[Suning.com](https://www.suning.com/)** (苏宁易购) — one of China's largest online retailers — by keyword and get back clean, structured product data: title, price, original price, discount, review count, seller, and image. This **Suning.com scraper** runs over plain HTTP (no browser, no login, no CAPTCHA-solving) and is ready to use in seconds on the [Apify platform](https://apify.com), with a REST **API**, scheduling, monitoring, and integrations (Zapier, Make, Google Sheets, and more) included out of the box.

### What is Suning.com Search Scraper?

Suning.com Search Scraper is an easy Apify Actor that **extracts product listings from Suning.com search results** for any keyword you provide, in Chinese or English. Give it one or more search terms, and it returns every matching product's title, pricing, discount, review count, and seller details as ready-to-use **JSON**, **CSV**, or **Excel** data — no scraping code required.

### What can Suning.com Search Scraper do?

- 🔍 **Scrape Suning.com by keyword** — accepts any number of search terms, in Chinese or English (e.g. `耳机`, `bluetooth speaker`).
- ⚡ **Fast HTTP-based extraction** — no headless browser, so runs finish in seconds rather than minutes.
- 🔁 **Concurrent keyword scraping** — every keyword in your list runs in parallel, not one after another.
- 🏬 **Seller and inventory detail** — flags whether each listing is sold by Suning itself ("self-operated") or by a third-party marketplace vendor.
- ⏱️ **Extraction timestamps** — every item is stamped with the exact UTC date and time it was scraped, for tracking price changes over time.
- ⏭️ **Resume across runs without duplicates** — skip products you already collected, either by position (`startIndex`) or by URL (`excludeUrls`), so a follow-up run can fetch the *next* batch instead of starting over.
- 📤 **Multiple export formats** — download results as JSON, CSV, Excel, HTML, or XML straight from the Output tab or via the API.
- ☁️ **Full Apify platform integration** — schedule recurring runs, trigger via the API, connect to Zapier/Make, and monitor runs from the Apify Console.
- 🌐 **Optional proxy support** — Apify Proxy can be enabled for very large runs, though it wasn't needed in live testing.

### What data does Suning.com Search Scraper extract?

| Field | Description |
| --- | --- |
| `keyword` | The search keyword this item was found under. |
| `position` | The product's 1-based rank within that keyword's search results, in the order it was discovered (accounts for `startIndex` — see [Input](#input)). |
| `skuId` | Suning's product SKU identifier. |
| `shopId` | Suning's shop identifier (`0000000000` for Suning's own inventory). |
| `title` | Product title. |
| `url` | Direct link to the product page on `product.suning.com`. |
| `imageUrl` | Product thumbnail image URL. |
| `price` | Current price, if available (see note below). |
| `originalPrice` | Pre-discount list price, if available. |
| `discount` | Discount value as shown by Suning, if available. |
| `reviewCount` | Review count text as shown on the listing (e.g. `"30+评价"`). |
| `vendorName` | Seller/store name. |
| `isSelfOperated` | `true` if sold and shipped by Suning itself, `false` for a third-party marketplace seller. |
| `page` | Zero-indexed search-result page the item was found on. |
| `extraction_datetime` | UTC timestamp when the item was extracted (ISO 8601), e.g. `2026-08-04T09:15:22.123456+00:00`. |
| `extraction_date` | Extraction date in `mm-dd-yyyy` format, e.g. `08-04-2026`. |

**Note on price coverage:** live testing shows Suning's own inventory (`isSelfOperated: true`) reliably returns `price`. Third-party marketplace sellers consistently come back with `price: null`, since Suning's price endpoint does not expose pricing for third-party listings the same way. Title, URL, image, review count, and seller info are unaffected and always populated when present on the page.

### How do I use Suning.com Search Scraper to scrape Suning.com?

1. Open the Actor's **Input** tab in Apify Console.
2. Add one or more **Search keywords** (Chinese or English both work, e.g. `耳机` or `bluetooth speaker`).
3. Optionally adjust **Max products per keyword** (default: 60).
4. Click **Start**.
5. When the run finishes, open the **Output** tab (or the dataset in **Storage**) and export your results as JSON, CSV, Excel, HTML, or XML.

No Suning.com account is needed, and the default configuration works without a proxy.

### Input

The Actor accepts a simple JSON input, configurable via the **Input** tab in Apify Console:

- **Search keywords** (`keywords`, required) — the search terms to look up on Suning.com. Each keyword runs as its own search, and all keywords run **concurrently**. Mix Chinese and English freely, e.g. `耳机`, `bluetooth speaker`.
- **Max products per keyword** (`maxItemsPerKeyword`, default `60`) — how many products to scrape per keyword. Results are fetched in pages of roughly 30, and scraping stops early once the last result page is reached.
- **Start index** (`startIndex`, default `0`) — skip this many products from the start of each keyword's results before saving any. See [Skipping products you already have](#skipping-products-you-already-have) below.
- **Exclude product URLs** (`excludeUrls`, default `[]`) — a list of product URLs to never save again, regardless of their position. See [Skipping products you already have](#skipping-products-you-already-have) below.
- **Proxy configuration** (`proxyConfiguration`, optional, off by default) — enable Apify Proxy for very large runs. Live testing (100 sequential + 500 concurrent requests) showed no rate-limiting on Suning's search endpoint, so it isn't required for typical usage.

Example input:

```json
{
    "keywords": ["耳机", "bluetooth speaker"],
    "maxItemsPerKeyword": 60,
    "startIndex": 0,
    "excludeUrls": [],
    "proxyConfiguration": { "useApifyProxy": false }
}
```

#### Skipping products you already have

Suning's search results reflect what's on the page at the moment you run the Actor, so re-running the same keyword doesn't "continue where you left off" by itself — it searches again from the top. If you've already collected 100 products for a keyword and want the *next* 100 without re-collecting what you already have, two inputs work together for that:

1. **`startIndex`** skips a fixed number of products **by position**. Set it to `100` to save products starting from result #101 onward. Suning's result order is stable between runs of the same keyword, so index 101 today is the same rank as index 101 tomorrow (barring the site itself re-ordering results). Note this does **not** speed up the run — the Actor still has to fetch every page up to that point, it just changes which products get *saved* (and, if you're on pay-per-result pricing, which ones you're billed for). Combined with **Max products per keyword**, the saved range for each keyword is `[startIndex, startIndex + maxItemsPerKeyword)`.
2. **`excludeUrls`** skips specific products **by URL**, no matter where they now rank. This is the more robust option if Suning's result order shifts between runs, or if you're keeping a running list of product URLs you've already collected across several runs and just want the new ones. `excludeUrls` is applied after `startIndex`.

Because prices, discounts, and review counts can change, re-scraping a product you already have isn't necessarily wasted — these inputs are for when you specifically want to avoid duplicates, not a hard guarantee against them (a product can shift rank between runs and still slip past `startIndex`, which is why `excludeUrls` exists as the exact-match fallback).

On the **free plan**, `startIndex` is ignored (always treated as `0`) and `excludeUrls` is capped at 1 URL — see [Free vs Premium](#free-vs-premium).

### Output example

Each scraped product is stored as one item in the Actor's dataset. Example output for two items — one from Suning's own inventory and one from a third-party marketplace seller — built from real Actor fields (illustrative values):

```json
[
    {
        "keyword": "耳机",
        "position": 1,
        "skuId": "12448640418",
        "shopId": "0000000000",
        "title": "华为FreeClip 2 耳夹耳机 丹宁蓝 全新C形桥 舒适稳固 澎湃双擎 智感聆听 开放式无线蓝牙耳机",
        "url": "https://product.suning.com/0000000000/12448640418.html",
        "imageUrl": "https://imgservice3.suning.cn/uimg1/b2c/image/4coqxWUp83povLafhJ6XIQ.jpg_400w_400h_4e",
        "price": 1299.0,
        "originalPrice": 1499.0,
        "discount": "8.7",
        "reviewCount": "30+评价",
        "vendorName": "苏宁自营",
        "isSelfOperated": true,
        "page": 0,
        "extraction_datetime": "2026-08-04T09:15:22.123456+00:00",
        "extraction_date": "08-04-2026"
    },
    {
        "keyword": "耳机",
        "position": 2,
        "skuId": "11802577176",
        "shopId": "0071077022",
        "title": "漫步者(EDIFIER)W3 漫威定制版 真无线蓝牙耳机 迷你入耳式耳机 通用苹果小米手机",
        "url": "https://product.suning.com/0071077022/11802577176.html",
        "imageUrl": "https://imgservice5.suning.cn/uimg1/b2c/image/fxx4dG5nqmtEXXOeG3QbZQ.jpg_400w_400h_4e",
        "price": null,
        "originalPrice": null,
        "discount": "",
        "reviewCount": "30+评价",
        "vendorName": null,
        "isSelfOperated": false,
        "page": 0,
        "extraction_datetime": "2026-08-04T09:15:22.981045+00:00",
        "extraction_date": "08-04-2026"
    }
]
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel from the Output tab or via the API.

### Free vs Premium

Suning.com Search Scraper automatically detects whether you're on an Apify **free** or **paid** account (via `Actor.get_env().user_is_paying`) — you don't configure anything manually, the run adapts on its own:

| | Free plan | Premium / paid plan |
| --- | --- | --- |
| Keywords per run | Capped at **1 keyword** | As many keywords as you add, all run concurrently |
| Products per keyword | Capped at **10 products** | Up to your chosen `maxItemsPerKeyword` value, no extra cap |
| `startIndex` | Ignored (always `0`) | Any value you set |
| `excludeUrls` | Capped at **1 URL** | Any number of URLs |
| Proxy required | No | No (optional, same as free) |

This means anyone can try the Actor for free with a single keyword and a small sample of results, and upgrading an Apify account immediately unlocks full multi-keyword, full-volume runs on the exact same Actor — no separate paid version to switch to.

### Use cases

- 🏷️ **Price monitoring** — track how competitors or your own listings are priced on Suning.com over time by scheduling recurring runs.
- 🕵️ **Competitor research** — see which sellers rank for a keyword, whether they're Suning's own inventory or third-party marketplace vendors, and how many reviews they've accumulated.
- 📦 **Sourcing and wholesale research** — quickly survey product variety and pricing for a category before making sourcing decisions.
- 📊 **Market data for analysts and resellers** — feed structured Suning.com listings into spreadsheets, dashboards, or pricing models without writing a scraper.
- 🔗 **API and workflow automation** — trigger runs from your own app via the Apify API, or connect the dataset to Zapier/Make for downstream automation.

### Suning.com-related Actors

### FAQ

#### Is it legal to scrape Suning.com?

This Actor extracts publicly available product listing pages on Suning.com — the same information any visitor sees without logging in. It does not collect personal data, does not require or store Suning account credentials, and does not interact with checkout, payment, or account pages. Scraping public data does not automatically guarantee compliance with a site's Terms of Service, so evaluate your own use case's requirements before running large-scale extraction jobs. See [Suning.com's Terms of Service](https://www.suning.com/) for reference.

#### Does this scraper need a Suning.com login or a proxy?

No. It runs over plain HTTP without a browser, does not require a Suning.com account, and works without a proxy for typical runs — proxy configuration is available but optional for very large-scale scraping.

#### Why is `price` sometimes `null` in the output?

Suning's own inventory (`isSelfOperated: true`) reliably returns pricing. Third-party marketplace sellers consistently return `price: null`, because Suning's price endpoint doesn't expose pricing for third-party listings the same way it does for self-operated ones. Title, URL, image, reviews, and seller info are unaffected.

#### Does Suning.com Search Scraper have an API?

Yes. Every Apify Actor, including this one, is available through the [Apify API](https://docs.apify.com/api/v2), so you can start runs, poll status, and fetch dataset results programmatically, or schedule recurring runs directly from the Apify Console.

#### Can I scrape the next batch of products without re-collecting ones I already have?

Yes. Use **Start index** (`startIndex`) to skip a fixed number of products by position (e.g. `100` to fetch starting from result #101), or **Exclude product URLs** (`excludeUrls`) to skip specific products by URL regardless of their rank. See [Skipping products you already have](#skipping-products-you-already-have) for details. Note that this changes which products are *saved*, not how fast the run is — the Actor still fetches every page up to that point.

#### What happens if Suning.com changes its page structure?

Suning.com may change its page structure or endpoints at any time, which can require an update to this Actor. Report broken output via the Issues tab so it can be fixed quickly.

### Support

Found a bug or have a feature request? Open an issue in the Actor's **Issues** tab in Apify Console. Need a tailored version of this scraper (extra fields, product-detail pages, or a different target site)? Reach out — custom scraper development is available.

# Actor input Schema

## `keywords` (type: `array`):

The search terms to look up on Suning.com. Each keyword runs as its own search, and keywords run concurrently. Keywords may be in English or Chinese, for example: <code>耳机</code>, <code>bluetooth speaker</code>. Free plan is capped at 1 keyword.

## `maxItemsPerKeyword` (type: `integer`):

The maximum number of products to scrape for each keyword. Results are fetched in pages of about 30, and scraping stops early once the last result page is reached. Higher values mean more requests, longer runs, and higher compute usage — keep this low for a quick first run. Free plan is capped at 10 products per keyword.

## `startIndex` (type: `integer`):

Skip this many products from the start of each keyword's results before saving any. Use it to paginate across runs: if you already have the first 100 products for a keyword, set <b>100</b> here to save products starting from #101 onward, avoiding re-collecting ones you already have. Results are fetched in a stable, deterministic page order, so index N is reproducible between runs of the same keyword. The Actor still has to fetch every page up to that point, so a large value does not make the run faster — it only changes which products get saved. Combined with <b>Max products per keyword</b>, the saved range is \[startIndex, startIndex + maxItemsPerKeyword). Free plan: ignored (always 0).

## `excludeUrls` (type: `array`):

Product URLs you already have. Any product whose URL is listed here is never saved again, regardless of its position in the results — useful if you keep a running list of previously scraped products and only want the new ones. Applied after Start index. Free plan: capped to 1 URL.

## `proxyConfiguration` (type: `object`):

Optional. Live testing (100 sequential + 500 concurrent requests) showed no rate-limiting on Suning.com's search endpoint, so this is off by default. Enable it if you plan very large runs.

## Actor input object example

```json
{
  "keywords": [
    "耳机"
  ],
  "maxItemsPerKeyword": 60,
  "startIndex": 0,
  "excludeUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "keywords": [
        "耳机"
    ],
    "maxItemsPerKeyword": 60,
    "startIndex": 0,
    "excludeUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("datacach/suning-search-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 = {
    "keywords": ["耳机"],
    "maxItemsPerKeyword": 60,
    "startIndex": 0,
    "excludeUrls": [],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("datacach/suning-search-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 '{
  "keywords": [
    "耳机"
  ],
  "maxItemsPerKeyword": 60,
  "startIndex": 0,
  "excludeUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call datacach/suning-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datacach/suning-search-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/WbADz9eILtHpicVi9/builds/eTIRe0tti9QOWFGA8/openapi.json
