Pottery Barn Product Scraper
Pricing
from $3.00 / 1,000 results
Pottery Barn Product Scraper
Scrape PotteryBarn.com (Williams-Sonoma) - US furniture & home decor. Browse by category or keyword via the product sitemap, or fetch products by direct URL; parses prices, images, availability, SKUs and category paths from server-rendered state.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Crawler Bros
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Scrape PotteryBarn.com — Williams-Sonoma's US furniture & home-decor e-commerce. Product discovery is sitemap-driven: live product URLs come from the public product sitemap (16k+ URLs), so the actor never relies on JS-rendered category grids or site search. Product details (prices, images, availability, SKUs, category breadcrumbs) are parsed from the server-rendered window.__INITIAL_STATE__ payload of each product page. Direct product URLs are also accepted.
Why sitemap-driven?
Akamai returns 403 "Restricted Access" to headless browsers from datacenter IPs (verified on cloud), and the category/search result grids are JS-rendered (absent from the plain HTML). The product sitemap — netstorage/sitemaps/product-sitemap-1.xml.gz — is publicly served and lists ~16,487 live product URLs, sidestepping both problems. Stale/dead deep links that redirect to the homepage are never used.
What this actor does
- Three modes:
byCategory(default),byKeyword,byProductUrls - 13 shop categories as a dropdown (furniture, bedding, rugs, lighting, outdoor, …)
- curl_cffi (chrome131 impersonation) everywhere — product pages return 200 with the full embedded product state
- Filters: price range (selling price), title/category keyword, in-stock-only
- Auto-escalation: lazy-engages Apify AUTO datacenter proxy + backoff on 403/429/5xx
- Bounded discovery:
byCategory/byKeywordwalk the sitemap in order (fetch budget =max(1500, maxItems×50)pages, walked 8 URLs concurrently) and keep records matching the category path / keyword, stopping atmaxItems - Empty fields are omitted; every record carries
sourceUrl,scrapedAt,recordType
Output per product
productId(group id),title,sku(leader SKU)description(SEO materials copy from<meta name="description">)price(low selling),priceMax(high selling),regularPrice,retailPrice,wasPrice(when retail > selling)brand(Pottery Barn),categoryPath[],categoryUrl,superCategoryId(canonical shop-category slug)availability,skuCountimages[](pbimgs CDN URLs),imageUrlproductUrl,recordType,scrapedAt
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode | select | byCategory | byCategory / byKeyword / byProductUrls |
category | select | furniture | Shop category (13 options) |
searchQuery | string | vanity | Keyword (mode=byKeyword) |
productUrls | array | – | Product URLs (mode=byProductUrls) |
priceMin / priceMax | int | – | Selling-price range (USD) |
containsKeyword | string | – | Title/category substring filter |
inStockOnly | bool | false | Only available products |
maxItems | int | 20 | Hard cap (1–500) |
Example: furniture under $500, in stock
{"mode": "byCategory","category": "furniture","priceMax": 500,"inStockOnly": true,"maxItems": 10}
Example: keyword match
{"mode": "byKeyword","searchQuery": "vanity","maxItems": 10}
Example: direct URLs
{"mode": "byProductUrls","productUrls": ["https://www.potterybarn.com/products/sausalito-dressing-vanity/"]}
Image URLs
Product images are served from assets.pbimgs.com — verified HTTP 200 image/jpeg from a clean shell (no Referer/cookies), so they are shipped as-is.
Anti-bot notes
- Plain
curlgets 403;curl_cffi(chrome131) + parsingwindow.__INITIAL_STATE__works (verified locally, 200). - Headless browsers are hard-blocked by Akamai from datacenter IPs (403 Restricted Access, verified on cloud) → discovery is sitemap-driven instead of browser-driven.
- Ratings require the JS review widget (Bazaarvoice), which is not rendered server-side and is disabled for Pottery Barn desktop in some regions —
rating/reviewCountare not shipped in v1 (documented, not sentinel).
Data source
potterybarn.com product pages (window.__INITIAL_STATE__.product.productDetails) + public product sitemap. No login required.
Limitations
byCategory/byKeywordwalk the sitemap with a bounded fetch budget (budget =max(1500, maxItems×50)); all 13 dropdown categories are reachable at the defaultmaxItems=20— for keywords that match extremely deep in the sitemap (past ~1500 URLs), raisemaxItemsto widen the budget. Category membership is matched on the canonicalsuperCategoryIdslug (with breadcrumb-label aliases as fallback).- The
categoryenum contains only the 13 categories that actually appear assuperCategoryIdon product pages. Pottery Barn's "New", "Sale", "Registry", "PB Apartment" and "Small-Space Furniture" sections are curated landing pages, not product categories — products there carry their real category ID (e.g.furniture), so they are not offered asbyCategoryoptions; usebyKeyword(e.g.sale,outlet) or direct product URLs to reach those products. - If every candidate page within the budget is filtered out, the actor soft-fails with a status message instead of silently dropping. Invalid product URLs in
byProductUrlsproduce typedrecordType: "error"records; duplicate URLs in the input are deduplicated to single records.