# jc35 Machine Tools Scraper 机床商务网 – China CNC Suppliers (`rastriq/jc35-machine-tools-scraper`) Actor

Scrape jc35.com (机床商务网), the Chinese CNC & machine-tool B2B portal: products with reference price, brand, model, supplier company, city, photos and specs. HTTP only, no browser. 机床商务网数据采集。

- **URL**: https://apify.com/rastriq/jc35-machine-tools-scraper.md
- **Developed by:** [Rastriq — Structured data from the world](https://apify.com/rastriq) (community)
- **Categories:** E-commerce, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.13 / 1,000 listing results

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

## jc35.com Scraper (机床商务网) — Chinese CNC & machine-tool products and suppliers

Extract the supplier product catalogue of **jc35.com (机床商务网)**, a Chinese B2B portal for CNC and metal-cutting machine tools, metal-forming machines, lasers and tooling. Get **product titles, reference prices (or price-on-request), brands, models, supplier company names, cities, shop links, photos** and — optionally — **technical parameters, origin, MOQ and posted/updated dates**, in one clean JSON / CSV / Excel dataset.

> 🚀 **Try it free** — click **Start** with the defaults to get 10 products from *立式加工中心 (vertical machining centres)* in a few seconds. No account, no browser, no API key.

### 🇨🇳 中文说明

**机床商务网（jc35.com）产品数据采集工具**：无需浏览器、无需登录，按类目或店铺批量抓取机床商务网上的数控机床、金属切削机床、成形机床、激光设备及刀具产品信息。

- **可采集字段：** 产品名称、类目路径、品牌、型号、参考价（含“面议”标记）、供应商公司名称、所在省份/城市、店铺链接、产品图片；开启“产品详情”后另含技术参数、产地、起订量、发布与更新时间。
- **选择类目：** 可通过下拉菜单按类目/子类目选择（支持中英文搜索；选择父类目即下载其全部子类目）。
- **使用方法：** 在下拉菜单中选择类目，或粘贴类目链接（例如 `https://www.jc35.com/chanpin-4202.html`）或店铺链接（`https://www.jc35.com/st9056/`），也可输入类目关键词（如 加工中心、磨床、数控车床），设置最大条数后点击 **Start**。
- **导出格式：** JSON、CSV、Excel 或通过 API 获取，字段结构与 Rastriq 其他中国工业设备采集器统一。
- **适用人群：** 机床进出口贸易商、经销商、采购与市场研究团队。
- **合规说明：** 遵守网站 robots.txt；仅采集公开的企业与产品信息，不采集联系人姓名、手机号码等个人信息。
- **计费：** 按结果计费：列表数据每 1,000 条 $1.50，含详情每 1,000 条 $3.50（每条只计费一次），每次运行另收 $0.005；更高等级的 Apify 套餐自动享受折扣。平台算力已包含；如自备代理（例如住宅代理），代理流量费用由您的代理服务商收取，不含在本工具价格内。

### Who is it for?

- **Machine-tool importers, distributors and dealers benchmarking Chinese manufacturers, brands and reference prices.**
- **Sourcing & procurement teams** building supplier long-lists (company, city, province, shop URL).
- **Market-intelligence and data teams** tracking brand presence, price disclosure and catalogue changes by category.
- **AI / RAG builders** who need a clean, structured Chinese industrial product corpus.

### What you get

| Mode | Requests per item | What you get |
|---|---|---|
| **Listing only** (default) | ~0.01–0.04 (30–100 products per request) | title, category path, price / price-on-request, supplier name + shop URL, city (+ province), image, brand (when shown), model (from title), member years |
| **With details** (`includeDetails`) | ~1.05 | everything above **plus** exact brand & model, origin (产地), supplier type, technical parameters (`specs`), all photos, posted/updated timestamps, MOQ, full category breadcrumb |

#### Output fields

| Field | Type | Description |
|---|---|---|
| `source` | string | `jc35.com` |
| `sourceSection` | string | `new_catalog` |
| `listingId` | string | Product ID on the portal |
| `url` | string | Product page URL |
| `title` | string | Product title (Chinese) |
| `category`, `categoryPath` | string, string\[] | Category and breadcrumb |
| `brand`, `model` | string | null | Brand / model (see `qualityFlags` for how they were derived) |
| `condition` | `new` | `used` | null | When the product page states it |
| `priceCny` | number | null | Numeric reference price in CNY (万 converted) |
| `priceText`, `priceType` | string | Original text (`面议`, `¥ 175000`) and `reference` / `on_request` |
| `location` | object | `{province, city, raw}` |
| `seller` | object | `{name, type: company \| dealer, shopUrl}` — **company data only** |
| `images` | string\[] | Full-size image URLs |
| `specs` | object | Technical parameters, key → value (Chinese as on the site) |
| `postedAt`, `updatedAt` | ISO 8601 | China time (+08:00) — with details |
| `qualityFlags` | string\[] | Data-quality markers (never used to drop items) |
| `scrapedAt` | ISO 8601 | UTC |
| `ext_categoryEn` | string | null | English name of the product's category (leaf), taken from the category tree — e.g. `Vertical machining centers` |
| `ext_*` | various | Site-specific extras: `ext_siteName`, `ext_classId`, `ext_shopId`, `ext_memberYears`, `ext_origin`, `ext_sellerNature`, `ext_views`, `ext_moq`, `ext_moqUnit` … |

`year` and `hours` exist for schema compatibility with Rastriq's used-machinery actors and are always `null` here (new-equipment catalogue).

**Quality flags**: `price_on_request`, `price_missing`, `price_placeholder` (listed price ≤ ¥10), `brand_missing`, `model_missing`, `model_from_title` / `model_from_specs`, `city_missing`, `location_from_origin`, `image_missing`, `listing_only`, `detail_failed`, `specs_multi_model` (parameter table has one column per model; values joined with `|`).

### How to use

1. Pick one or more entries in the **📂 Categories (类目)** dropdown — the portal's real category tree (15 top-level groups, 93 categories, 804 subcategories). Type to filter in English or Chinese. Picking a **parent** (entries ending in `(all)`) downloads all its subcategories; the default is a light, popular category.
2. And/or paste **category or shop URLs** — e.g. `https://www.jc35.com/chanpin-4202.html` or `https://www.jc35.com/st9056/` (merged and de-duplicated with the dropdown selection; clear the dropdown if you only want the URLs).
3. Set **Max items**, optionally enable **Include product details**, and press **Start**.

Neither? Give a **keyword** (e.g. `加工中心`, `磨床`, `数控车床`): it is matched against the portal's category names (Chinese or English) and the matching categories are scraped. With no keyword either, the default category is used. The `categories` input also accepts plain category IDs through the API (e.g. `4202`), including IDs that are not in the dropdown.

#### Example input

```json
{
  "categories": [
    "4202"
  ],
  "categoryUrls": [
    {
      "url": "https://www.jc35.com/chanpin-4202.html"
    }
  ],
  "maxItems": 100,
  "includeDetails": true
}
```

#### Example output (with details)

```json
{
  "source": "jc35.com",
  "sourceSection": "new_catalog",
  "listingId": "2706010",
  "url": "https://www.jc35.com/chanpin/2706010.html",
  "title": "VD1161 立式加工中心",
  "category": "立式加工中心",
  "categoryPath": [
    "金属切削机床",
    "加工中心",
    "立式加工中心"
  ],
  "brand": "台孚精机/TEFU",
  "model": "VD1161",
  "year": null,
  "hours": null,
  "condition": null,
  "priceCny": null,
  "priceText": "面议",
  "priceType": "on_request",
  "location": {
    "province": "江苏",
    "city": "无锡市",
    "raw": "无锡市"
  },
  "seller": {
    "name": "江苏鼎之盛机电设备有限公司",
    "type": "dealer",
    "shopUrl": "https://www.jc35.com/st9511/"
  },
  "images": [
    "https://img58.jc35.com/ba4668c97023c588a3de3ad61e8960a732d98f8f122131f2d96140263767484fccb591521f18c83a.png"
  ],
  "specs": {
    "产地": "国产",
    "导轨类型": "硬轨",
    "定位精度": "X轴:0.006mm,Y轴:0.006mm,Z轴:0.010mm",
    "工作台T型槽": "18-5",
    "工作台尺寸": "1300*610mm",
    "工作台数量": "单工作台",
    "工作台最大承重": "1000kg",
    "换刀方式": "机械手换刀",
    "加工材质": "硬金属,软金属,合金,钢结构",
    "加工用途": "铣,钻,镗",
    "数控系统": "发那科/FANUC,凯恩帝/KND",
    "外形尺寸（长×宽×高）": "3450*3000*3100mm",
    "销售区域": "华东",
    "重复定位精度": "X轴:0.004mm,Y轴:0.004mm,Z轴:0.006mm",
    "重量": "6700kg",
    "主轴转速": "6000r/min",
    "主轴锥孔": "BT40",
    "最大行程": "X轴:1100mm,Y轴:610mm,Z轴:650mm"
  },
  "postedAt": "2026-05-08T16:24:16+08:00",
  "updatedAt": "2026-10-12T16:16:58+08:00",
  "qualityFlags": [
    "price_on_request"
  ],
  "scrapedAt": "2026-10-20T22:55:33Z",
  "ext_siteName": "机床商务网",
  "ext_classId": "4202",
  "ext_categoryEn": "Vertical machining centers",
  "ext_shopId": "9511",
  "ext_memberYears": 1,
  "ext_origin": "江苏无锡市",
  "ext_sellerNature": "经销商",
  "ext_views": 440,
  "ext_moq": null,
  "ext_moqUnit": null,
  "ext_summary": null,
  "ext_shopProductUrl": "https://www.jc35.com/st9511/product_2706010.html"
}
```

### Input parameters

| Parameter | Description |
|---|---|
| `categories` | Dropdown of the portal's category tree (L1/L2/L3, English + Chinese). A parent downloads all its subcategories. Unknown IDs are treated as plain category IDs. |
| `categoryUrls` | jc35.com category pages or supplier shop URLs (merged with `categories`). |
| `keyword` | Without categories/URLs: matched against category names (Chinese or English). With them: keeps products whose title contains it. |
| `maxItems` | Default 100, `0` = unlimited. Strictly enforced across all selected categories and URLs: each gets a fair share first (at least 10 items), then the rest is filled in order. |
| `includeDetails` | Open each product page (1 extra request per item). |
| `expandSubcategories` | Crawl a parent category's sub-categories to get past the 100-page cap. |
| `maxPagesPerCategory` | Cap pages per category/shop (0 = all). |
| `maxConcurrency` / `requestDelayMs` | Politeness controls (defaults 3 / 500 ms). |
| `proxyUrl` | Optional HTTP proxy (secret). Not required. |
| `debugMode` | One log line per request. |

### Cost

Pay-per-event pricing — you pay only for items that land in your dataset, never for retries or failed pages. Higher Apify plans get automatic volume discounts:

| Event (per 1,000 results) | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| **Listing result** (Include details off) | $1.50 | $1.35 | $1.275 | $1.125 | $0.975 | $0.90 |
| **Detailed result** (Include details on) | $3.50 | $3.15 | $2.975 | $2.625 | $2.275 | $2.10 |

Plus **$0.005 per run** (Actor start). Each item is charged **either** as a listing result **or** as a detailed result — never both; if a detail page cannot be fetched, that item is charged at the listing price.

*Example:* 1,000 items with details on the Free plan ≈ **$3.50**; 10,000 listing-only items ≈ **$15.00**.

Platform compute is included in the price. **Proxy:** not needed by default. If you add your own proxy (for example a residential proxy) in *Proxy URL*, that traffic is billed by your proxy provider and is **not** included in the Actor price. Use *Max items* or the run's *Maximum cost per run* to cap your spend.

Speed: a 100-item listing-only run takes a few seconds; 100 items with details take about 45–60 seconds at the default politeness settings.

### Limits & good to know

- **100 pages per category.** The portal exposes at most 100 listing pages per category. For deeper coverage use sub-category URLs, **Expand sub-categories** or supplier shop URLs (`/stN/`).
- **No free-text search.** The portal's search endpoints are disallowed by `robots.txt`; keywords are matched against category names or product titles instead.
- **Prices** are reference prices (参考价). Most machine-tool listings are `面议` (price on request): only about 10–15 % carry a numeric reference price. Placeholder prices such as ¥1 are kept and flagged `price_placeholder`.
- **Brand / city coverage** in listing-only mode depends on the supplier (roughly 30–95 %); **Include product details** raises both.
- Text fields are in Chinese as published. Timestamps from the site are China local time (+08:00).
- **Privacy:** only company data (name, city, shop URL) is extracted. Contact persons, phone numbers and other personal contact details are never collected.

### FAQ

**Do I need a proxy?** No. The actor works from Apify's standard servers; latency to China varies, so it retries with exponential back-off (up to 4 attempts) and detects block/captcha pages.

**Can I get only new or changed products?** Use `updatedAt` (with details) to filter downstream; each run is a full snapshot of the requested categories.

**How do I find a category ID?** Use the **Categories** dropdown (type to search), or open the category on the site and paste its URL directly.

**Is scraping this site allowed?** The actor only collects publicly visible catalogue data and follows the site's `robots.txt`. You are responsible for using the data in line with applicable law and the site's terms.

### Related Rastriq actors

Same output schema across China's industrial portals: [zyzhan.com (制药网)](https://apify.com/rastriq/zyzhan-pharma-machinery-scraper), [chem17.com (化工仪器网)](https://apify.com/rastriq/chem17-lab-instruments-scraper), [hbzhan.com (环保在线)](https://apify.com/rastriq/hbzhan-environmental-equipment-scraper), [ybzhan.cn (仪表网)](https://apify.com/rastriq/ybzhan-instruments-scraper), plus jdzj.com (机电之家), lmjx.net (路面机械网), d1cm.com (第一工程机械网), 21-sun.com (铁臂商城) and tiebaobei.com (铁甲二手机).

***

Built and maintained by **Rastriq** — scraping and data infrastructure for industrial and automotive markets. Issues or feature requests: open an issue on the actor page.

# Actor input Schema

## `categories` (type: `array`):

Pick whole branches or single subcategories from the portal's category tree (type to filter, in English or Chinese). <b>A parent entry — the ones ending in <code>(all)</code> — downloads all its subcategories</b>; a leaf entry downloads just that category. The default is <i>Vertical machining centers · 立式加工中心</i> (light and popular). You can also paste category or shop URLs in the next field, instead of or in addition to these categories (both are merged and de-duplicated); clear this list if you only want the URLs.

## `categoryUrls` (type: `array`):

Category pages such as <code>https://www.jc35.com/chanpin-4202.html</code> or a supplier shop such as <code>https://www.jc35.com/st9056/</code>. Only jc35.com URLs are accepted (other portals have their own Rastriq actors). Optional: use instead of, or in addition to, the <b>Categories</b> dropdown above (everything is merged and de-duplicated). Leave both empty to use the default category (or the keyword below).<br><br>Note: each category exposes at most 100 pages (about 3,000 items). Use sub-category URLs or <b>Expand sub-categories</b> to go deeper.

## `keyword` (type: `string`):

The site's free-text search is disallowed by its robots.txt, so the keyword works in two ways: <b>(1)</b> without URLs it is matched against jc35.com <i>category names</i>, Chinese or English (e.g. <code>加工中心</code>, <code>磨床</code>, <code>数控车床</code>) and those categories (with all their subcategories) are scraped; <b>(2)</b> with categories or URLs selected it keeps only products whose title contains the keyword (case-insensitive).

## `maxItems` (type: `integer`):

Maximum number of products to output. Use a small number for your first test. Set to <code>0</code> for no limit.

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

Also open every product page (<b>1 extra request per item</b>, slower) to add: full brand & model, origin, technical parameters (<code>specs</code>), all photos, posted/updated timestamps, minimum order quantity and the exact category path. Off = listing data only (fast: up to 100 products per request).

## `expandSubcategories` (type: `boolean`):

For a parent category (e.g. <code>加工中心</code> with 57k products) crawl each of its sub-categories instead, to get past the 100-page-per-category cap.

## `maxPagesPerCategory` (type: `integer`):

Stop after this many listing pages per category/shop. <code>0</code> = all available pages.

## `maxConcurrency` (type: `integer`):

Parallel requests. Higher is faster but puts more load on the source site. Keep it low.

## `requestDelayMs` (type: `integer`):

Base delay before every request, with ±50% random jitter.

## `proxyUrl` (type: `string`):

Optional HTTP proxy, e.g. <code>http://user:pass@gate.decodo.com:7000</code>. The portals are hosted in China and can be slow or intermittent from some regions; a proxy is not normally required. <b>Proxy traffic is billed by your own proxy provider</b> and is not included in this Actor's price.

## `debugMode` (type: `boolean`):

Verbose logging: one line per HTTP request (URL, status, size, time).

## Actor input object example

```json
{
  "categories": [
    "4202"
  ],
  "maxItems": 10,
  "includeDetails": false,
  "expandSubcategories": false,
  "maxPagesPerCategory": 0,
  "maxConcurrency": 3,
  "requestDelayMs": 500,
  "debugMode": false
}
```

# Actor output Schema

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

Dataset with all scraped products in the normalized Rastriq schema.

# 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 = {
    "categories": [
        "4202"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("rastriq/jc35-machine-tools-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 = {
    "categories": ["4202"],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("rastriq/jc35-machine-tools-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 '{
  "categories": [
    "4202"
  ],
  "maxItems": 10
}' |
apify call rastriq/jc35-machine-tools-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rastriq/jc35-machine-tools-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/X0XYzAQtX59oJry6N/builds/AE7dFgiigsM58Gimf/openapi.json
