Shein Search Products Scraper: Ratings, Reviews & Sentiment
Under maintenancePricing
Pay per usage
Shein Search Products Scraper: Ratings, Reviews & Sentiment
Under maintenance๐๏ธ Search & scrape Shein product data from 38 countries. ๐ Keywords, filters, price range & sort options. ๐ฆ Output: titles, prices, images, ratings & more.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
17
Total users
1
Monthly active users
13 days ago
Last modified
Categories
Share
Shein Search Scraper โ Products, Reviews & AI Sentiment Data
Search Shein by keyword across 38 regional storefronts and get back structured product data โ plus, for a configurable slice of those products, their customer reviews: star rating, review text, reviewer country and size, verified-purchase flag, and photos. An optional AI pass can classify each review's sentiment and complaint tags. Every row lands in the dataset as typed JSON โ ready to pass to an LLM, load into a spreadsheet, or feed a monitoring pipeline. No Shein account, API key, or proxy setup required to get product data; reviews and AI sentiment are opt-in extras on top.
๐ What is Shein Search Scraper?
Shein Search Scraper queries Shein's product search (/pdsearch/) for one or more keywords and returns every matching product as a JSON row โ price, images, rating, discount, category, and a working product URL. No Shein login is required; the Actor searches the same public storefront any visitor sees. What sets it apart from a plain listings scraper is the second layer: for the products you choose, it opens each product page in the same warmed browser session and pulls its customer reviews, then can optionally run those reviews through an AI model to tag sentiment and complaints.
- ๐ Multi-keyword search โ pass an array of queries and get separate, labeled result sections in one run
- ๐ 38 regional storefronts โ
us,uk,de,fr,jp,br, and 32 more viacountryCode - โ๏ธ Six sort orders โ recommended, most popular, new arrivals, top rated, price lowโhigh, price highโlow
- ๐ฐ Price and category filters โ
minPrice,maxPrice,categoryId, and a rawfilterpassthrough - โญ Customer review extraction โ rating, review text, size, country, verified-purchase flag, photos, per product
- ๐ค Optional AI sentiment and complaint-tag classification of review text, across nine model choices from six providers
๐ What data can you get with Shein Search Scraper?
The Actor writes two row types into one dataset โ product rows and review rows โ distinguished by the type field and linked by productId.
| Result Type | Extracted Fields | Primary Use Case |
|---|---|---|
| Product | goods_id, goods_name, goods_img, goods_url_name, productUrl, salePriceAmount/salePriceUsdAmount, retailPriceAmount/retailPriceUsdAmount, discountPercent, isOnSale, ratingAverage, reviewCount, categoryName, categoryId, percentOverallFit, plus every other field Shein's own listing payload returns for that product | Price and catalog tracking, sourcing, discount monitoring |
| Review | reviewId, productId, reviewerName, rating, reviewText, reviewerCountry, sizePurchased, colorPurchased, overallFit, verifiedPurchase, reviewDate, photos, sentiment, complaintTags | Sentiment analysis, quality/complaint monitoring, sizing research |
โญ Customer reviews, ratings & AI sentiment
This is the layer most Shein scrapers stop short of. For up to maxProductsForReviews products per query, the Actor navigates the same already-cleared browser session straight to the product's detail page and pulls up to maxReviewsPerProduct reviews โ reviewer country, size purchased, color purchased, an "Overall Fit" note when the reviewer left one, verified-purchase status, review date, and photo URLs. Turn on enableAiSentiment and each review's text is additionally classified as positive/neutral/negative with up to three short complaintTags (e.g. "sizing", "quality", "shipping"). A review row looks like this:
{"type": "review","isChild": true,"reviewId": "422472062-r0","productId": "422472062","reviewerName": "j***z","rating": null,"reviewText": "This dress is stunning on!! The material is stretchy and it's true to size.","reviewerCountry": null,"sizePurchased": "S","colorPurchased": "Black","overallFit": "True to Size","verifiedPurchase": null,"reviewDate": "9 Oct,2025","photos": [],"sentiment": null,"complaintTags": null}
rating, reviewerCountry, and verifiedPurchase are null in the sample above โ Shein's public review card does not expose a machine-readable signal for those on every review, so they are included whenever present and left null otherwise, never guessed.
๐๏ธ Product listings with flattened pricing & ratings
Shein's raw product payload nests prices as objects ({amount, amountWithSymbol, usdAmount, usdAmountWithSymbol}) and buries rating/review-count under internal keys. The Actor flattens salePrice/retailPrice into scalar *Amount/*UsdAmount columns, computes discountPercent and isOnSale from them, promotes comment_rank_average/comment_num to ratingAverage/reviewCount, and builds the missing product deep-link (productUrl) from the product's goods_id. Nothing from Shein's original payload is removed โ these are additive columns on top of it.
๐ ๏ธ Why not build a Shein scraper yourself?
Shein has no public product-search or review API for third parties, so a DIY scraper means solving three problems from scratch: Shein's search results only render through client-side navigation from the homepage โ a direct /pdsearch/ page load gets redirected to a /risk/ device-check challenge; the embedded JSON payload key path (gbRawData โ results.bffProductsInfo.products) has moved before and needs a fallback DOM scraper when it does; and Shein blocks bare datacenter IPs outright, so scraping at any volume requires residential proxies with session pinning across pagination. Shein Search Scraper already handles all three โ a Camoufox (patched Firefox) browser with a Playwright-stealth fallback, an embedded-JSON extractor with a recursive tree-walk and DOM fallback, and Apify residential proxy defaults with a pinned session ID per query.
๐งญ How to scrape Shein search results with Shein Search Scraper?
- Open Shein Search Scraper on Apify and click Run.
- Enter one or more keywords in
queryโ the only required field. - Set
countryCodefor the storefront,orderByfor sort order, andminPrice/maxPrice/categoryIdfor any filters. - Leave
includeReviewson (default) to also collect customer reviews, or switch it off for product data only. - Start the run and open the Output tab โ download results as JSON, CSV, or Excel, or stream them via the API.
{"query": ["jacket", "summer dress"],"countryCode": "us","orderBy": "TopRated","maxItems": 100}
๐ How to run multiple queries in one job
query accepts an array โ each entry runs as its own search and is tagged with a section/section_index on every row it produces, so a single run can cover many keywords without separate jobs. There is no documented concurrency setting for running queries in parallel within one run; queries are processed one after another.
โฌ๏ธ Input
Only query is required โ everything else has a working default. Full parameter list, exact from the input schema:
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
query | Yes | array | Product types to search (jacket, dress, shoes...). Add multiple items for separate searches. Default: ["jacket"] | ["jacket", "dress"] |
countryCode | No | string | SHEIN regional site (e.g. US, UK, DE). Default: "us". Enum: see below | "uk" |
orderBy | No | string | How to sort the search results. Default: "recommend". Enum: recommend, MostPopular, NewArrivals, TopRated, PriceLowtoHigh, PriceHightoLow | "TopRated" |
maxItems | No | integer | Maximum products to scrape per search query (1โ1000). Default: 300 | 100 |
page | No | integer | Start page for pagination (1 = first page). Minimum: 1. Default: 1 | 1 |
perPage | No | string | Number of products per page (20โ120). Default: "120". Enum: "20", "40", "60", "80", "100", "120" | "60" |
filter | No | string | Extra filter options. Leave empty for no filter. Default: "" | "" |
categoryId | No | string | Filter by category. Leave empty for all categories. Default: "" | "" |
minPrice | No | string | Minimum price in local currency (e.g. 10). Default: "" | "10" |
maxPrice | No | string | Maximum price in local currency (e.g. 100). Default: "" | "100" |
includeReviews | No | boolean | When ON, visits each product's page to collect its customer reviews as child rows (type=review, isChild=true) linked to the parent product. Default: true | true |
maxProductsForReviews | No | integer | Caps how many products per query get a review fetch โ each one is an extra page load, so this bounds run time/cost. 0 = fetch reviews for no products (same as turning includeReviews off). Minimum: 0. Maximum: 200. Default: 15 | 10 |
maxReviewsPerProduct | No | integer | Caps how many review rows are collected per product, regardless of how many the page shows. Minimum: 1. Maximum: 50. Default: 5 | 5 |
enableAiSentiment | No | boolean | OFF by default. When ON, each collected review's text is classified for sentiment (positive/neutral/negative) and complaint tags using the AI model below. Requires an API key. Default: false | false |
aiModel | No | string | Only used when 'Enable AI Sentiment Analysis' is ON. Provider auto-detected from the name. Default: "claude-haiku-4-5". Enum: see below | "claude-haiku-4-5" |
aiApiKey | No | string (secret) | Only used when 'Enable AI Sentiment Analysis' is ON. API key for the selected provider (falls back to an ANTHROPIC_API_KEY/OPENAI_API_KEY/etc. environment variable if left empty) | "" |
proxyConfiguration | No | object | Apify Proxy (residential recommended). Shein blocks bare datacenter IPs โ residential is the only reliable mode | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
โ ๏ธ Common pitfall: filter, categoryId, minPrice, and maxPrice are passed straight through to Shein's own query parameters (attribute_ids, cat_id, price_min, price_max) with no validation on the Actor's side โ an invalid category ID or a price format Shein doesn't recognize won't error, it will just silently return fewer or zero results. minPrice/maxPrice are also in the local currency of the selected countryCode, not USD.
โฌ๏ธ Output
Every row is pushed to the dataset live, as it's collected โ you don't wait for the run to finish to see data. Export as JSON, CSV, Excel, or any format the Apify dataset export supports. Product and review rows share one default dataset (filter on type to split them), and review rows are additionally mirrored into a separate, uncharged per-run dataset named reviews-<runId> for convenience.
๐ฆ Scraped results
[{"type": "product","isChild": false,"section_index": 1,"section": "dress","query": "dress","country": "US","sort_order": "recommend","goods_id": "422472062","goods_name": "Summer Dress Blue Spaghetti Strap Mini Dress","goods_img": "https://img.ltwebstatic.com/images3_pi/2024/01/01/example.webp","goods_url_name": "Summer-Dress-Blue-Spaghetti-Strap-Mini-Dress","productUrl": "https://us.shein.com/Summer-Dress-Blue-Spaghetti-Strap-Mini-Dress-p-422472062.html","salePriceAmount": 12.49,"salePriceUsdAmount": 12.49,"retailPriceAmount": 19.99,"retailPriceUsdAmount": 19.99,"discountPercent": 37.5,"isOnSale": true,"ratingAverage": 4.6,"reviewCount": 212,"categoryName": "Dresses","categoryId": "1727","percentOverallFit": null,"scrapedAt": "2026-07-30T10:15:02Z"},{"type": "product","isChild": false,"section_index": 1,"section": "dress","query": "dress","country": "US","sort_order": "recommend","goods_id": "418839110","goods_name": "Floral Print Halter Neck Sundress","goods_img": "https://img.ltwebstatic.com/images3_pi/2024/02/10/example2.webp","productUrl": "https://us.shein.com/Floral-Print-Halter-Neck-Sundress-p-418839110.html","salePriceUsdAmount": 15.0,"retailPriceUsdAmount": 22.0,"discountPercent": 31.8,"isOnSale": true,"ratingAverage": 4.4,"reviewCount": 87,"scrapedAt": "2026-07-30T10:15:05Z"},{"type": "review","isChild": true,"reviewId": "422472062-r0","productId": "422472062","reviewerName": "j***z","rating": null,"reviewText": "This dress is stunning on!! The material is stretchy and it's true to size!","reviewerCountry": null,"sizePurchased": "S","colorPurchased": "Black","overallFit": "True to Size","verifiedPurchase": null,"reviewDate": "9 Oct,2025","photos": [],"sentiment": null,"complaintTags": null,"section_index": 1,"section": "dress","query": "dress","country": "US","scrapedAt": "2026-07-30T10:15:20Z"}]
Product rows carry every field Shein's own listing payload returns (goods_id, goods_name, goods_img, goods_url_name, and others โ the exact set varies by product) plus the Actor's own additive fields shown above. Review rows are always the fixed shape shown: reviewId, productId, reviewerName, rating, reviewText, reviewerCountry, sizePurchased, colorPurchased, overallFit, verifiedPurchase, reviewDate, photos, sentiment, complaintTags, scrapedAt, plus section_index/section/query/country.
๐ผ How can I use the data extracted with Shein Search Scraper?
- ๐ Sourcing and dropshipping teams: filter by
discountPercentandratingAverageacross a keyword set to shortlist products worth listing, usingproductUrlto jump straight to the live page. - ๐ค AI engineers and LLM developers: feed the structured
productandreviewJSON directly into an agent or RAG pipeline as grounding context โ no HTML parsing needed on your end. - ๐ Market researchers: track
reviewCountandratingAveragedistribution across a category to gauge coverage and popularity shifts over time. - ๐งต Product / QA teams: aggregate
complaintTagsandoverallFitnotes across a product's reviews to catch sizing or quality issues before they show up in returns.
๐ How do you monitor product ratings and review sentiment over time?
Monitoring here means re-running the same query/countryCode combination on a schedule and diffing the results against the previous run. The fields worth tracking between runs are ratingAverage and reviewCount (is a product's reputation rising or falling, and how fast are reviews accumulating), discountPercent (is a product going on/off sale), and โ when enableAiSentiment is on โ the distribution of sentiment values and complaintTags across a product's newest reviews (is negative sentiment or a specific complaint tag like "sizing" trending up). A practical loop: schedule a run across your keyword set, store each run's dataset, and alert when a product's ratingAverage drops or a complaintTags value spikes in frequency versus the prior run. Set this up with an Apify Schedule on the Actor, and pull each run's results via the Apify API or a webhook.
๐ Integrate Shein Search Scraper and automate your workflow
Shein Search Scraper works with any language or tool that can send an HTTP request or use the Apify SDKs.
๐ REST API with Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("your-username/shein-search-products-scraper-ratings-reviews-and-sentiment").call(run_input={"query": ["jacket"],"countryCode": "us","maxItems": 100,"includeReviews": True,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["type"], item.get("goods_name") or item.get("reviewText"))
โฐ Scheduled monitoring and delivery
The Actor has no built-in webhook or scheduling feature of its own โ set these up on the Apify platform instead: attach an Apify Schedule to run it automatically (daily, hourly, or on any cron expression), and add an Apify webhook on run completion to push results to your own endpoint the moment a run finishes, rather than polling.
โ๏ธ Is it legal to scrape Shein search results?
Yes โ Shein Search Scraper collects only publicly accessible product and review data, the same information any visitor sees browsing Shein's search results and product pages without logging in. This is business/catalog data (product listings, prices, reviews already published to any visitor), not private personal data, so GDPR does not attach to the product side, and reviewer names in the review sample above already come masked by Shein itself on the public page (e.g. j***z). The relevant framework is Shein's own Terms of Service and database-rights law in your jurisdiction, not data-protection law. Scraping for one-off research or monitoring carries a different risk profile than bulk scraping for AI training or resale โ consult your legal team for commercial use cases involving bulk data storage.
โ Frequently asked questions
Which Shein storefronts can I search?
Any of the 38 regional storefronts exposed by the countryCode parameter โ from us and uk to jp, br, ae, and more. Each run searches one storefront; run it again with a different countryCode to compare regions.
How do I control sort order and price/category filters?
orderBy sorts results (recommend, MostPopular, NewArrivals, TopRated, PriceLowtoHigh, PriceHightoLow). minPrice/maxPrice filter by local-currency price range, and categoryId/filter pass through Shein's own category and attribute filter values.
How does Shein Search Scraper handle Shein's anti-bot measures?
It drives a Camoufox (patched Firefox) browser by default, with a Playwright Chromium + stealth fallback if Camoufox fails to launch. Searches are triggered through the homepage's own search box (matching how a real visitor searches) rather than a direct results-page load, because direct loads get redirected to a /risk/ device-check challenge. If a challenge still appears mid-run, the Actor waits for it to clear and, failing that, rotates to a fresh residential proxy session up to twice per query before giving up on that query.
Does Shein Search Scraper extract review sentiment and complaint tags?
Yes, when enableAiSentiment is turned on and a usable API key is supplied. Each review's sentiment (positive/neutral/negative) and up to three complaintTags are added to its review row. With the feature off, or if no valid key is found, review rows are still collected in full โ sentiment and complaintTags just stay null.
How many products does Shein Search Scraper return per query?
Up to maxItems (1โ1000, default 300) per query โ but that's a ceiling, not a guarantee. The Actor stops earlier if Shein reports fewer total results for that search, or if two consecutive pages return no new products (commonly a sign of exhausted results or a blocking challenge that couldn't be cleared).
Can I run multiple search queries in one job?
Yes โ query accepts an array; each entry is searched in turn and tagged with section/section_index on every row so results stay grouped by keyword in the same dataset.
How do I monitor product ratings and review sentiment over time?
Schedule repeated runs of the same query set with an Apify Schedule, and diff ratingAverage, reviewCount, discountPercent, sentiment, and complaintTags against the previous run's dataset to catch meaningful changes.
Does Shein Search Scraper work with Claude, ChatGPT, and AI agent frameworks?
It's callable as a standard HTTP/API endpoint via apify_client (or any HTTP client) from any agent framework โ an agent can trigger a run, poll or wait for it, and pass the resulting JSON to the model as grounded context. There is no dedicated MCP server documented for this Actor.
Do I need a Shein account or my own proxies?
No Shein account or login is required โ only public pages are visited. Proxies are handled automatically: proxyConfiguration defaults to Apify's residential proxy group, which the Actor requires because Shein blocks bare datacenter IPs; you can supply a custom proxy instead, and the Actor will fall back to residential automatically if the custom proxy fails.
๐ฌ Your feedback
Found a bug, a field that's come back empty, or a Shein page layout the extractor doesn't handle yet? Open an issue from the Issues tab on this Actor's Apify Console page โ reports like these are how the review and sentiment extraction gets tightened up over time.