How to Scrape JD.com Products for a Catalog Audit
A spreadsheet of JD SKU IDs is hard to review on its own. Adding product names, brands, categories, and shop identifiers makes it possible to check what each SKU represents and spot records that need attention.
The JD.com Product Scraper runs on Apify and accepts SKU IDs or direct product URLs. I maintain the Actor. Its current implementation is useful for catalog data: price is intentionally null and specs is an empty object. If you need live JD prices, this Actor does not currently fill that requirement.

Bring a list of products you already know
The input is a list of SKU IDs such as 100008348542, product URLs such as https://item.jd.com/100008348542.html, or a mixture of both. The documentation says duplicate SKUs across those inputs are deduplicated.
There is no keyword-search or category-discovery input. Start with a list from your existing catalog or products you have identified in JD. A category name in the output describes a collected product; it does not mean the Actor browses the category for you.
Keep your own internal product ID beside each JD SKU before the run. That gives you a dependable join key when the results return. Product names alone are poor identifiers because sellers can change them and similar variants can share much of their wording.
Fetch two SKUs first
Open the Actor on Apify, sign in, and switch Input to JSON:
{
"skuIds": ["100008348542", "100015253059"],
"startUrls": []
}
These are historical examples from the Actor documentation. Replace them with accessible products relevant to your catalog. If you prefer URLs, put objects containing url in startUrls and clear skuIds to avoid collecting a prefilled example accidentally.
There is no maxItems field in this input. Control the initial scope with a short SKU list and review the run charge limit in Apify. Supplying neither IDs nor URLs gives the Actor no products to fetch, even though the schema does not mark either individual field as required.
Click Start, then open the dataset and inspect the log. Match each returned skuId against your input list. If a SKU is missing, keep it in an exception list rather than dropping it from the catalog audit.
Pricing as of September 6, 2026: the configured product event is $0.002 per saved result, plus an Actor-start event of $0.00005 per GB of allocated memory, with at least one event. Two saved products correspond to $0.004 in product event fees before the start charge. Check current pricing before a larger run.
Read the fields you can actually use
Here is an abbreviated historical record. It shows the empty fields as well as the populated ones:
{
"skuId": "100008348542",
"name": "Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待",
"brandId": "14026",
"brandName": "Apple",
"venderId": "1000000127",
"shopId": "1000000127",
"shopName": "Apple产品京东自营旗舰店",
"categoryNames": [
"手机通讯",
"手机",
"手机"
],
"price": null,
"specs": {},
"scrapedAt": "2026-05-16T12:00:00.000Z"
}
Use name for a concise product label. The separate title field can include additional page-title wording. Preserve the source name in Chinese; if your team needs an English translation, add it in another column.
The vendor field is spelled venderId in the output. Keep that exact spelling in code or explicitly map it to your preferred column name. Do not silently assume it is the same identifier as shopId just because the historical example gives both the same value.
The existing screenshot shows an earlier dataset:

The documented reason for the missing prices and specifications is that they are loaded separately from the page data this Actor collects. A successful run can therefore return a useful name, brand, and shop while leaving price and specs empty. Retrying that row does not establish that those fields will become available.
Join the results to your catalog
Export CSV for review. Retain skuId, url, name, brandId, brandName, venderId, shopId, shopName, and scrapedAt. Use JSON when you want the complete category, breadcrumb, and image arrays.
Import identifiers as text, including long numeric-looking SKUs. This avoids spreadsheet formatting changing the values you need for matching.
Join your original SKU list to the output by skuId, keeping every row from the original list. Add a review column with one of three statuses:
- Matched: a returned record describes the product you expected.
- Needs review: the brand, product name, variant, or shop differs from your catalog.
- Not returned: the run did not produce a record for that SKU.
For mismatches, open the product URL and inspect the model and variant. The historical phone example includes storage capacity and color in its name. Matching only the brand and model family could connect your internal record to the wrong version.
Category paths help you group the audit, but they are JD's taxonomy. Keep the source path intact and maintain a separate mapping to your internal categories. A shared category label across marketplaces is not proof that two products match.
Use repeat runs to review changes
After checking the first export, save the input as an Apify task. Keep a dated copy of each result set so you can compare product names, brand labels, shop information, and category assignments over time.
Match repeat records by SKU and flag changed fields for review. A different title can reflect an editorial change; it does not automatically mean that the physical product changed. A missing row can reflect an inaccessible page or failed request, not necessarily a discontinued item.
For missing results, check that the input is a direct item.jd.com product URL or a valid SKU, then inspect the run log. For empty images or shop names, check what the page exposes. Preserve blanks rather than carrying forward old data as though it had been freshly verified.
The JD.com Node.js example is available for integrating this lookup into a catalog pipeline. Keep the input SKU list and returned dataset together so failed lookups remain visible.
Frequently asked questions
Does this Actor return JD prices?
No. The current documentation says price is intentionally null and specs is an empty object. Use this Actor for the product, brand, category, shop, and image data it collects.
Can I discover JD products by keyword?
The current input accepts SKU IDs and direct product URLs. It has no keyword-search or category-discovery setting.
How do I limit a test run?
Supply a short list of SKUs or product URLs and review the run charge limit in Apify. There is no maxItems input in the current schema.
