# lmjx Used Machinery Scraper 路面机械网 – China Excavator Prices (`rastriq/lmjx-used-machinery-scraper`) Actor

Scrape used construction & road machinery from lmjx.net (路面机械网): excavators, loaders, rollers, pavers, cranes with price, brand, model, hours, region and photos. HTTP only. 二手挖掘机数据采集。

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

## Pricing

from $1.50 / 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

## lmjx.net Used Machinery Scraper — Chinese Road & Construction Equipment Listings

Extract **used construction and road machinery listings from lmjx.net** (路面机械网): excavators, loaders, bulldozers, rollers, pavers, cranes, pump trucks, forklifts and more. Get structured data — price in CNY, brand, model, year, operating hours, province/city, seller company and photos — ready to export as JSON, CSV or Excel.

> 🚀 **Try it free** — click **Start** with the defaults to get 10 used excavators in a few seconds. No account on the source site, no browser, no API key.

### 🇨🇳 中文说明

**路面机械网（lmjx.net）二手设备数据采集工具**：无需浏览器、无需登录，批量抓取二手挖掘机、装载机、推土机、压路机、摊铺机、起重机、泵车、叉车等二手工程机械信息。

- **可采集字段：** 标题、品牌、价格（含“面议”标记）、卖方公司、图片；开启“详情”后另含型号、工作小时数、成色（如“9成新”）、省份/城市、更新时间、浏览量与店铺链接。
- **使用方法：** 选择设备类别，可按品牌、省份/城市筛选，或粘贴路面机械网二手列表链接，设置最大条数后点击 **Start**。
- **数据说明：** 原样保留网站数据，打包广告、服务类广告等以标记（`qualityFlags`）提示，不做过滤；标题和描述中的电话、微信、QQ 会被自动屏蔽。
- **适用人群：** 二手工程机械贸易商、出口商、估值与金融租赁机构、行业研究团队。
- **导出格式：** JSON、CSV、Excel 或通过 API 获取，字段结构与 Rastriq 其他中国工业设备采集器统一。
- **合规说明：** 遵守网站 robots.txt；仅采集公开的企业与设备信息，不采集联系人姓名、手机号码、微信/QQ 等个人信息。
- **计费：** 按结果计费：列表数据每 1,000 条 $2.00，含详情每 1,000 条 $4.00（每条只计费一次），每次运行另收 $0.005；更高等级的 Apify 套餐自动享受折扣。平台算力已包含；如自备代理（例如住宅代理），代理流量费用由您的代理服务商收取，不含在本工具价格内。

### 📌 What is lmjx.net Used Machinery Scraper?

lmjx.net runs one of China's largest road-machinery portals, including a used-equipment marketplace with **~97,000 excavator ads and ~70,000 roller ads** alone. There is no public API. This actor reads the marketplace's mobile pages over plain HTTP (no browser, no captcha solving) and returns clean, normalised records.

Use it to:

- 📊 **Benchmark Chinese used-equipment prices** by brand, category and region
- 🔎 **Source machines from China** (Komatsu, Caterpillar, Sany, XCMG, Liugong, Hitachi, Volvo…)
- 🏭 **Map dealers and sellers** (company name, store URL, listing volume)
- 🔄 **Monitor the market** with scheduled runs

### 📋 Data fields

Every record follows the normalised **Rastriq machinery schema** (identical across our Chinese marketplace actors).

| Field | Type | Description |
|---|---|---|
| `source`, `sourceSection` | string | `lmjx.net`, `used` |
| `listingId`, `url` | string | Listing ID and URL |
| `title` | string | Original title (Chinese) |
| `category`, `categoryPath` | string, array | Category as shown on the site; `categoryPath` = site category tree (e.g. `二手工程机械 › 土方机械 › 挖掘机`) |
| `brand`, `model` | string | Brand (Chinese); model (details mode, or parsed from title) |
| `year`, `hours` | integer | Year / operating hours (details mode, or parsed from title) |
| `condition` | string | Always `used` |
| `priceCny`, `priceText`, `priceType` | number, string, string | Price in CNY (万元 converted), original text, `fixed` / `range_min` / `on_request` |
| `location` | object | `{province, city, raw}` (details mode) |
| `seller` | object | `{name, type, shopUrl}` — `type`: company / dealer / individual |
| `images` | array | Absolute https image URLs |
| `specs` | object | Extra attributes (e.g. origin) |
| `updatedAt` | string | ISO 8601 last update (details mode) |
| `qualityFlags` | array | Data-quality flags — see below |
| `ext_categorySlug`, `ext_categoryEn` | string | Site category slug and its English name (e.g. `wajueji`, `Excavators`) |
| `ext_*` | mixed | Site-specific: condition grade (`9成新`), unit, views, description, store opening date |
| `scrapedAt` | string | ISO 8601 UTC |

**Quality flags** (rows are flagged, never dropped): `price_on_request`, `price_suspect_low`, `brand_missing`, `multi_model_ad` (one ad covering many models), `service_ad` (repair/rental/wanted ads), `year_from_title`, `hours_from_title`, `model_from_title`, `location_missing`, `detail_fetch_failed`, `contact_scrubbed`, `no_images`.

### 🚀 How to use

1. Open the actor and keep the defaults (category *Excavators*, 10 listings).
2. Pick one or more **categories** from the dropdown (168 entries: 25 groups and 143 subcategories; a group such as *Earthmoving machinery (all)* downloads all its subcategories), optionally a **brand** and/or a **region** (province or city) from the dropdowns.
3. Tick **Fetch detail pages** if you need region, hours, model, photos and update date.
4. Click **Start** and download the dataset.

#### Input

| Parameter | Default | Description |
|---|---|---|
| `categories` | `["wajueji"]` | Used-equipment categories and subcategories (dropdown with the site's full tree). Merged with `startUrls` |
| `brand` | – | Brand filter (dropdown of 219 site brands; the site slug, e.g. `komatsu`, `sany`, `xcmg`, can also be typed) |
| `province` | – | Region filter: 34 provinces/municipalities and 361 cities as site slugs (`beijing`, `guangdong`, `zhengzhou`…). A province includes its cities |
| `startUrls` | – | Optional listing URLs from `mershou.lmjx.net` / `ershou.lmjx.net`; merged (deduplicated) with the selected categories. Clear the categories to crawl only these URLs |
| `maxItems` | `100` | Hard cap on results (`0` = unlimited) |
| `includeDetails` | `false` | +1 request per listing for region, hours, model, photos, date |
| `includeSellerContact` | `false` | Company contact person's name (company sellers only; never phones/e-mails) |
| `maxConcurrency` / `requestDelayMs` | `3` / `500` | Politeness controls |
| `proxyUrl` | – | Optional proxy, e.g. `http://user:pass@gate.decodo.com:7000` |

```json
{
  "categories": ["wajueji"],
  "brand": "komatsu",
  "province": "beijing",
  "maxItems": 50,
  "includeDetails": false
}
```

#### Output example

```json
{
  "source": "lmjx.net",
  "sourceSection": "used",
  "listingId": "eaqiaaaab",
  "url": "https://mershou.lmjx.net/wajueji/eaqiaaaab.html",
  "title": "小型50、60、65、70、75、80等二手挖掘机低价出售",
  "category": "挖掘机",
  "categoryPath": [
    "二手工程机械",
    "土方机械",
    "挖掘机"
  ],
  "brand": "三一",
  "model": "50\\60\\70\\80\\90等",
  "year": null,
  "hours": 3000,
  "condition": "used",
  "priceCny": 70000.0,
  "priceText": "7万元",
  "priceType": "fixed",
  "location": {
    "province": "陕西",
    "city": "西安",
    "raw": "中国陕西西安"
  },
  "seller": {
    "name": "神立二手挖掘机公司",
    "type": "company",
    "shopUrl": "https://sljj1234.mcn.lmjx.net"
  },
  "images": [
    "https://vip-static.lmjx.net/upload/upfs/202604/27/854w640h1777229416804327.jpg!600x400.jpg"
  ],
  "specs": {},
  "postedAt": null,
  "updatedAt": "2026-10-21T00:00:00Z",
  "qualityFlags": [
    "multi_model_ad",
    "contact_scrubbed"
  ],
  "scrapedAt": "2026-10-20T22:56:54Z",
  "ext_categorySlug": "wajueji",
  "ext_categoryEn": "Excavators",
  "ext_conditionGrade": "9成新",
  "ext_unit": null,
  "ext_views": 113,
  "ext_description": "神立建机（上海）直销中心：我公司长期低价供应进口、合资及国产原装新款二手挖掘机，全国包送，可以货到付款。自购车之日起，提供二年质保、一年二次免费保养。 我公司是上海市二手工程机械协会会员单位，拥有上海市青浦区政府规划的二手挖掘机展览中心，是…",
  "ext_storeSince": "2021-03-16"
}
```

### 💰 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** (Fetch detail pages off) | $2.00 | $1.80 | $1.70 | $1.50 | $1.30 | $1.20 |
| **Detailed result** (Fetch detail pages on) | $4.00 | $3.60 | $3.40 | $3.00 | $2.60 | $2.40 |

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 ≈ **$4.00**; 10,000 listing-only items ≈ **$20.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: List-only runs need ~0.05 HTTP requests per result (20 listings per page), so compute cost is negligible; detail runs need ~1.1 requests per result.

### ⚠️ Known limits

- **Data quality is the site's.** Many ads are dealer batch posts covering several models at once (`multi_model_ad`) or are services rather than machines (`service_ad`). About half of the ads say 面议 (price on request).
- **Year and hours** are present only when the seller wrote them in the title (typical for region pages such as `beijing`) or in the detail page (hours only). They are flagged `*_from_title`.
- Location, hours, model and photos need `includeDetails`.
- The site sits behind a WAF that occasionally answers with a captcha page (~10% of requests when fetching detail pages quickly); the actor retries with backoff and skips what it cannot get. Keep concurrency ≤ 4.
- The actor does not read the desktop host `ershou.lmjx.net` (slider captcha); it uses the equivalent mobile host.
- Only the used marketplace is covered. The new-equipment pages of lmjx.net do not publish prices.

### ❓ FAQ

**Does it collect phone numbers or WeChat IDs?** No. Phone numbers, WeChat/QQ IDs and e-mails are never extracted, and are stripped from titles and descriptions (`contact_scrubbed`). Optionally, a company contact *name* can be included.

**Can I get all 97,000 excavators?** Yes with `maxItems: 0`; at the default pace that is about 4,800 requests (roughly 30-60 minutes list-only). Splitting by brand or province is recommended.

**Are prices in CNY?** Yes; `万元` is converted to yuan. `priceText` keeps the original text.

**Is scraping legal?** The actor reads publicly visible pages and respects the site's robots.txt for the paths used. You are responsible for using the data in line with applicable law and the site's terms.

# Actor input Schema

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

Pick one or more used-equipment categories from the site's own tree (type to filter, English or Chinese). <b>Choosing a parent such as “Earthmoving machinery (all)” downloads all its subcategories</b>; each subcategory is crawled separately, so the per-category page cap never applies. Categories are merged (deduplicated) with the <b>Start URLs</b> below; leave both empty to get the default (Excavators). Excavators alone have ~97,000 listings.

## `brand` (type: `string`):

Restrict to one brand (type to filter, English or Chinese). The list holds the 219 brands the site lists; any other site slug typed by hand (e.g. <code>komatsu</code>) is also accepted. A brand only returns results in the categories where the site carries it. Applies to every selected category.

## `province` (type: `string`):

Restrict to a province, municipality or city (type to filter, English or Chinese). Region pages list per-unit ads with year/hours in the title (best data quality). A province includes all its cities. Applies to every selected category.

## `startUrls` (type: `array`):

Optional listing URLs from <code>mershou.lmjx.net</code> (or <code>ershou.lmjx.net</code>), e.g. <code>https://mershou.lmjx.net/yaluji/xcmg/</code>. Pagination is followed automatically. They are merged with the categories selected above (clear the category selection to crawl only these URLs). Query strings are never used (the site's robots.txt disallows them).

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

Maximum number of results. Use a small value (5-20) for a first test. Set to <code>0</code> for no limit.

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

Adds <b>model, operating hours, condition grade, province/city, all photos, update date, views and store link</b>. Costs +1 request per listing (≈20× slower). Without it you still get title, brand, seller company, price and a thumbnail.

## `includeSellerContact` (type: `boolean`):

Adds the contact person's name shown on the store page, <b>only for company sellers</b> and only together with detail pages. Phone numbers and e-mails are never extracted. Off by default.

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

Parallel requests (1-10). Default 3.

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

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

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

Optional proxy, e.g. <code>http://user:pass@gate.decodo.com:7000</code>. Leave empty to connect directly (works for both sites). <b>Proxy traffic is billed by your own proxy provider</b> and is not included in this Actor's price. Recommended (residential, China or Asia exit) if your runs show repeated HTTP 405 captcha blocks.

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

Log every request URL.

## Actor input object example

```json
{
  "categories": [
    "wajueji"
  ],
  "maxItems": 10,
  "includeDetails": false,
  "includeSellerContact": false,
  "maxConcurrency": 3,
  "requestDelayMs": 500,
  "debugMode": false
}
```

# Actor output Schema

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

Dataset with all scraped listings in the normalised Rastriq machinery 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": [
        "wajueji"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("rastriq/lmjx-used-machinery-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": ["wajueji"],
    "maxItems": 10,
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rastriq/lmjx-used-machinery-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/dGYl9Kpo2nfhKYpVX/builds/BAQqZCyoz0ZVMWb3e/openapi.json
