JD.com 京东 Scraper - Shop Products & Buyer Reviews
Pricing
Pay per event
JD.com 京东 Scraper - Shop Products & Buyer Reviews
Collect JD.com (京东) data without a JD account: list every product of a shop (item ID, title, link, shop name) and get the buyer reviews of any item with star score, text, purchased variant, photos, follow-up review and shop reply. No login or cookies needed. Export to JSON, CSV or Excel.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Silkline
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
10 hours ago
Last modified
Categories
Share
JD Scraper reads public data from JD.com (京东), one of China's largest online retailers: it searches products by keyword, lists every product of a shop and collects the buyer reviews of any item, and returns clean, flat JSON records. For reviews you get the star score, text, review photos, the purchased variant, the follow-up review the buyer added later and the shop's public reply. It is built for sellers, brand teams, analysts and developers who need China e-commerce data without a JD account. No JD account, API keys, proxies or cookies are needed.
Pricing is pay-per-event: $0.005 per product (shop and search modes) and $0.005 per review, $0.05 per item in descriptionImages mode, plus a $0.036 start fee, charged once per run and once more for each further shop or item. 100 products of a shop or a keyword search cost about $0.54, 100 reviews about $0.54.
What is JD.com?
JD.com (京东) is a large Chinese e-commerce company. It sells its own stock in JD self-operated shops (京东自营) and hosts third-party shops. Every product has an item ID (also called SKU), and every shop has a shop ID. Shoppers leave reviews with a star score, text, photos and sometimes a follow-up review weeks later.
What data can you get?
The Actor has four modes, chosen with mode:
shop(default) lists the products of shops (typeisproduct):itemId,url,title,shopIdandshopName. A shop listing carries only these fields.searchsearches products by keyword (typeisproduct) with price, shop, image and category IDs, in JD's own result order.reviewsreturns the buyer reviews of items (typeisreview), newest first.descriptionImagesreturns, for each item, the images of its long description page and its spec list (typeisdescription).
Product fields (mode: shop)
| Field | What it is |
|---|---|
itemId | JD item ID (SKU); use it as input of reviews mode |
url | Link to the item page on item.jd.com |
title | Item title (Chinese) |
shopId | Shop ID you entered |
shopName | Shop name |
Search product fields (mode: search)
| Field | What it is |
|---|---|
itemId, url, title | JD item ID, item page link and title (Chinese) |
price | Listed price in CNY |
imageUrl | Link to the main product image |
shopId, shopName | The selling shop |
categoryIds | JD category IDs, broadest level first |
isSelfOperated | True for JD self-operated (京东自营) items |
reviewCountText | Review count as JD shows it, for example 200+ |
installmentText, promoTag | Instalment and promotion labels, when shown |
listedAt | When the item went on sale, ISO 8601 UTC, when JD gives it |
searchKeyword, position | The keyword that found it and its position in that keyword's results |
Review fields (mode: reviews)
| Field | What it is |
|---|---|
reviewId, productId, url | IDs of the review and of the reviewed item, and the item page link |
text | Review text. JD fills 此用户未及时填写评价内容 when the buyer wrote nothing |
score | Star score from 1 to 5 |
reviewedAt | When the review was written, ISO 8601 UTC |
skuColor, skuSize | The purchased variant (for example colour and storage size) |
purchaseCount | How many of this item the reviewer has bought, as JD shows it |
imageCount, imageUrls | Review photos |
likeCount | Likes the review got |
followUpText, followUpAt, followUpImageUrls | The follow-up review the buyer added later (null when there is none) |
shopReply | The shop's public reply (null when there is none) |
reviewerNickname, reviewerAvatar | Reviewer name as JD shows it (JD masks part of most names) and avatar link |
reviewerIsPlus | True for JD PLUS members |
Description fields (mode: descriptionImages)
| Field | What it is |
|---|---|
productId, url | The item ID and the item page link |
detailImages, imageCount | Links of the images in the item's long description (the product detail page), and how many |
specs | The item's spec list as {name, value} pairs, for example model number and certification |
How to use JD Scraper
- Open the Actor on Apify and click Try for free (or Start).
- Choose a Mode: products of shops (
shop), a keyword search (search), buyer reviews of items (reviews) or description images and specs of items (descriptionImages). - For
search, enter words in Keywords. Forshop, enter shop IDs or shop links in Shops. The number in a link such ashttps://mall.jd.com/index-1000000127.htmlis the shop ID. ForreviewsanddescriptionImages, enter item IDs or item links such ashttps://item.jd.com/100012043978.htmlin Items; the number in the link is the item ID. - Set Max results to the total number of records you want for the run.
- Click Start, then open the Products, Reviews or Description images view in the dataset and export as JSON, CSV or Excel, or fetch it through the API.
The Actor also runs with an empty input: {} lists the products of Apple's JD flagship shop, a quick way to see the output format.
A common workflow is to list a shop's products first, then use the itemId of interesting products in reviews mode.
Input
| Field | Type | Required | What it does | Default |
|---|---|---|---|---|
mode | string | Optional | shop (products of shops), search (products by keyword), reviews (buyer reviews of items) or descriptionImages (description images and specs of items) | prefilled with shop; when left out, reviews if items is given, search if keywords is given, otherwise shop. Giving more than one of items, shops and keywords without mode is an error. |
shops | array of strings | Optional | Used in shop mode. Shop IDs or shop links containing mall.jd.com/index-<digits> or shopId=<digits>. Products are listed shop by shop until maxResults is reached. | Falls back to shop 1000000127 when empty |
keywords | array of strings | Optional | Used in search mode. Search words as typed on JD.com. Each keyword returns products in JD's order, 48 per page. | Falls back to 手机 when empty |
items | array of strings | Needed for reviews and descriptionImages modes | Item IDs or item links such as https://item.jd.com/100012043978.html. Reviews are collected item by item, newest first, until maxResults is reached. In descriptionImages mode each item gives one record. | none |
maxResults | integer | Optional | Maximum number of records (products, reviews or items) to return in total for this run, from 1 to 5000. The run stops as soon as it is reached. You are charged per record returned. | 20 |
Example: the products of a shop
{"mode": "shop", "shops": ["1000000127"], "maxResults": 100}
Example: search products by keyword
{"mode": "search", "keywords": ["蓝牙耳机"], "maxResults": 100}
Example: the newest reviews of an item
{"mode": "reviews", "items": ["https://item.jd.com/100008348542.html"], "maxResults": 50}
Example: description images and specs of items
{"mode": "descriptionImages", "items": ["100414360368", "https://item.jd.com/100012043978.html"]}
Output example
{"type": "review","reviewId": "20183617010","productId": "100008348542","url": "https://item.jd.com/100008348542.html","text": "此用户未及时填写评价内容","score": 1,"reviewedAt": "2023-11-26T03:55:26Z","skuColor": "黑色","skuSize": "128GB","purchaseCount": 0,"imageCount": 0,"imageUrls": [],"likeCount": 6,"followUpText": "垃圾,翻新机已经去手机店检查了","followUpAt": "2023-11-26T03:55:26Z","followUpImageUrls": [],"shopReply": "尊敬的客户~您好!给您带来的困扰非常抱歉。……","reviewerNickname": "3***k","reviewerAvatar": "https://storage.360buyimg.com/default.image/6a645f6465665f696d675f393836323131373632333134353935323236_sma.jpg","reviewerIsPlus": false}
{"type": "description","productId": "100414360368","url": "https://item.jd.com/100414360368.html","detailImages": ["https://img10.360buyimg.com/imgzone/jfs/t1/520682/3/5080/274509/6aa1a67eFd095580d/00832eefced7691e.jpg.dpg", "…"],"imageCount": 5,"specs": [{"name": "国补备案型号", "value": "MJF14CH/B"}, {"name": "认证型号", "value": "A3583"}]}
{"type": "product","itemId": "100433292168","url": "https://item.jd.com/100433292168.html","title": "小米(MI)REDMI K100 骁龙8至尊版 10000mAh大电池 小米红米5G学生游戏手机 白色 12GB+256GB 官方标配","price": 3299.0,"imageUrl": "https://img10.360buyimg.com/n1/jfs/t1/557174/33/2332/58607/6ae08748F4ccc35ba/00833203201d5062.jpg","shopId": "1000004123","shopName": "小米京东自营旗舰店","categoryIds": ["9987", "653", "655"],"isSelfOperated": true,"reviewCountText": null,"installmentText": "6期免息","promoTag": "赠品","listedAt": "2026-10-27T11:03:09Z","searchKeyword": "手机","position": 1}
{"type": "product","itemId": "100414360368","url": "https://item.jd.com/100414360368.html","title": "Apple Watch Series 12","shopId": "1000000127","shopName": "Apple产品京东自营旗舰店"}
How much does it cost?
The Actor uses pay-per-event pricing. These are the charge events:
| Event | Price (USD) | When it is charged |
|---|---|---|
run-start | $0.036 | Once per run, charged when the first request to the data source succeeds, even if that request returns nothing. It is not charged when the data source fails from the start, or when your spending limit cannot cover it. Each further shop, keyword or item the run actually reaches pays one more start fee. That fee is charged before its first request and is kept even if it then fails or returns nothing. A later shop, keyword or item is only reached when the earlier ones did not fill maxResults. |
result | $0.005 | For each product returned (shop and search modes). |
review | $0.005 | For each review returned (reviews mode). The price is $0.005 at every membership level; Store discounts do not apply to reviews. |
detail | $0.05 | For each item returned (descriptionImages mode) |
Worked examples:
- 10 items in
descriptionImagesmode cost 10 × $0.036 (the run's start fee and one more for each further item) + 10 × $0.05 = $0.86. - 100 products from one shop cost $0.036 + 100 × $0.005 = $0.536. Two shops that together fill 100 products cost $0.072 + 100 × $0.005 = $0.572.
- 100 products of a keyword search (two pages) cost $0.036 + 100 × $0.005 = $0.536; each further keyword adds $0.036.
- 100 reviews of one item cost $0.036 + 100 × $0.005 = $0.536. An item with fewer than 100 reviews costs less, because only the reviews returned are charged.
You never pay for more than maxResults records, and you are never charged for records that were not delivered. The run stops by itself if your spending limit is reached.
On the free Apify plan, every run returns a sample dataset: a real result of this Actor's prefilled input, captured on the date shown in the run status, so you can see exactly what the output looks like. Your own input is not used and nothing is charged. To run your own queries, use any paid Apify plan.
Use cases
- Product feedback and quality monitoring: read what buyers of your own or a competitor's item complain about, with
score, photos and the follow-up reviews that show problems after weeks of use. - Catalogue tracking: list a brand's JD flagship shop regularly and spot new item IDs.
- Customer service benchmarking: compare how shops answer reviews through
shopReply. - Market research for cross-border sellers: see what Chinese buyers say about a product category before you source or list it.
- AI and data projects: clean review text with variant, score and time for sentiment models and search.
Integrations and API
You can start runs from your own code through the Apify API, schedule them on the Apify platform (for example a weekly review check), and send results to other tools with Apify integrations and webhooks. Results are stored in a dataset you can download as JSON, CSV or Excel.
Python example using the apify-client package:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("clover_folktale/jd-scraper").call(run_input={"mode": "reviews","items": ["100008348542"],"maxResults": 100,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
Tips and limits
- Reliability. The Actor retries transient errors on its own and stops cleanly instead of failing half-way. It never charges for records it did not deliver.
- Speed. A shop page holds 24 products and a reviews page 10 reviews, so large runs make many requests; expect roughly 2-5 seconds per page.
- Run size.
maxResultsis the total for the whole run (1 to 5000, default 20). With several shops or items, records are collected one after the other until the total is reached. - Shop listings. A shop listing carries the item ID, title and link only. A shop that JD does not know, or that has no products, is skipped as nothing found. A shop page with fewer than 24 products ends the listing.
- Search. A page holds 48 products. The next page is read only while the page before it brought at least 8 products new to the run, so a keyword with few results ends early and the number of products can be below
maxResults. JD may return promoted items among the results. JD gives no sort or price filter here; results come in its default order. - Reviews. Reviews come newest first, 10 per page. JD fills 此用户未及时填写评价内容 into
textwhen the buyer wrote nothing. JD masks part of most reviewer names. An item without reviews, or an ID JD does not know, is skipped as nothing found, and the run then stops, so put items you are unsure about last. - Free plan. Every run on the free Apify plan returns a stored sample dataset (a real result of the prefilled input); your own input is not used and nothing is charged. Use any paid Apify plan to run your own queries.
- Description images. One request per item. An item ID JD does not know is asked a few times and then skipped as nothing found; nothing is charged for it. The image links are returned as JD serves them (many end in
.dpg). - Privacy. Only public data is returned: what anyone sees on JD.com, such as shop names and the reviews with their masked reviewer names. No buyer contact data, no private shop data.
Known limits
- Search has no sort or price filter and cannot go past what JD returns for a keyword.
- Stock and sales are not included; shop mode returns ID, title and link only, search mode adds price and shop.
FAQ
Do I need a JD account, cookies or an API key?
No. You only need an Apify account to run the Actor.
Is this the official JD API?
No. This Actor is not affiliated with JD.com. It is an independent tool that collects public data and returns it as structured JSON.
Is it legal to scrape JD.com?
The Actor only returns public data that anyone can see on JD.com. It does not return private buyer data or messages. You are responsible for how you use the data and for following the laws and rules that apply to you.
How fresh is the data?
The data is collected live during each run.
Where do I find an item ID or a shop ID?
In the links: https://item.jd.com/100012043978.html is item 100012043978, and https://mall.jd.com/index-1000000127.html is shop 1000000127. shop mode returns the item IDs of a shop.
Can I search JD.com by keyword?
Yes, use search mode with keywords.
How many results can I get?
You can set maxResults up to 5000 per run. A shop with fewer products, or an item with fewer reviews, returns what exists.
Can I schedule runs and export the data?
Yes. You can schedule runs on Apify, start them through the API, and export the dataset as JSON, CSV or Excel.
Something is missing. How do I ask for it?
Missing a field or a mode? Open an issue from the Actor page and it will be looked at.