Shein Search Products Scraper: Ratings, Reviews & Sentiment avatar

Shein Search Products Scraper: Ratings, Reviews & Sentiment

Under maintenance

Pricing

Pay per usage

Go to Apify Store
Shein Search Products Scraper: Ratings, Reviews & Sentiment

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

Scrapier

Maintained by Community

Actor stats

0

Bookmarked

17

Total users

1

Monthly active users

13 days ago

Last modified

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 via countryCode
  • โ†•๏ธ 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 raw filter passthrough
  • โญ 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 TypeExtracted FieldsPrimary Use Case
Productgoods_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 productPrice and catalog tracking, sourcing, discount monitoring
ReviewreviewId, productId, reviewerName, rating, reviewText, reviewerCountry, sizePurchased, colorPurchased, overallFit, verifiedPurchase, reviewDate, photos, sentiment, complaintTagsSentiment 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?

  1. Open Shein Search Scraper on Apify and click Run.
  2. Enter one or more keywords in query โ€” the only required field.
  3. Set countryCode for the storefront, orderBy for sort order, and minPrice/maxPrice/categoryId for any filters.
  4. Leave includeReviews on (default) to also collect customer reviews, or switch it off for product data only.
  5. 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:

ParameterRequiredTypeDescriptionExample Value
queryYesarrayProduct types to search (jacket, dress, shoes...). Add multiple items for separate searches. Default: ["jacket"]["jacket", "dress"]
countryCodeNostringSHEIN regional site (e.g. US, UK, DE). Default: "us". Enum: see below"uk"
orderByNostringHow to sort the search results. Default: "recommend". Enum: recommend, MostPopular, NewArrivals, TopRated, PriceLowtoHigh, PriceHightoLow"TopRated"
maxItemsNointegerMaximum products to scrape per search query (1โ€“1000). Default: 300100
pageNointegerStart page for pagination (1 = first page). Minimum: 1. Default: 11
perPageNostringNumber of products per page (20โ€“120). Default: "120". Enum: "20", "40", "60", "80", "100", "120""60"
filterNostringExtra filter options. Leave empty for no filter. Default: """"
categoryIdNostringFilter by category. Leave empty for all categories. Default: """"
minPriceNostringMinimum price in local currency (e.g. 10). Default: """10"
maxPriceNostringMaximum price in local currency (e.g. 100). Default: """100"
includeReviewsNobooleanWhen ON, visits each product's page to collect its customer reviews as child rows (type=review, isChild=true) linked to the parent product. Default: truetrue
maxProductsForReviewsNointegerCaps 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: 1510
maxReviewsPerProductNointegerCaps how many review rows are collected per product, regardless of how many the page shows. Minimum: 1. Maximum: 50. Default: 55
enableAiSentimentNobooleanOFF 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: falsefalse
aiModelNostringOnly 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"
aiApiKeyNostring (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)""
proxyConfigurationNoobjectApify 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 discountPercent and ratingAverage across a keyword set to shortlist products worth listing, using productUrl to jump straight to the live page.
  • ๐Ÿค– AI engineers and LLM developers: feed the structured product and review JSON directly into an agent or RAG pipeline as grounding context โ€” no HTML parsing needed on your end.
  • ๐Ÿ“Š Market researchers: track reviewCount and ratingAverage distribution across a category to gauge coverage and popularity shifts over time.
  • ๐Ÿงต Product / QA teams: aggregate complaintTags and overallFit notes 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 ApifyClient
client = 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.

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

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.