Skip to main content

Reusable Scrapy spider templates plus a CLI runner.

Project description

Common Scrapy Retailer Spiders

An open, well-maintained collection of Scrapy spiders for harvesting structured product data from major retailers. Spiders are purpose-built per retailer with bootstrap/API/HTML fallback logic where needed.

Installation

pip install common-scrapy

CLI usage

pip install common-scrapy adds a common-scrapy console script so you can work with the packaged spider without cloning the repo.

Proxy configuration

This project reads PROXY from a local .env file (recommended) via python-dotenv.

  • Create ./.env (it’s gitignored) with:
    PROXY=http://user:pass@host:1234
    
  • Or you can still pass it inline for one-off runs:
    PROXY=http://user:pass@host:1234 common-scrapy crawl kohls_listing -a category=women
    

All spiders honor PROXY via project-wide middleware.

List available spiders

common-scrapy list

Run a crawl

common-scrapy crawl <identifier> [--category <category>] [additional Scrapy args]

--category is required for listing spiders. If omitted, the CLI prints available categories for that spider.

Examples:

  • common-scrapy crawl target_search --category 5xtc0 -a max_pages=2 -O target.jsonl
  • common-scrapy crawl kohls_listing --category women -a max_pages=1 -O kohls_listing.jsonl
  • common-scrapy crawl sephora_listing --category makeup -a max_pages=1 -O sephora_listing.jsonl

All extra args are forwarded to scrapy crawl unchanged (feeds, settings overrides, etc.).

Available spiders

Standalone spiders (via scrapy crawl <spider>)

These live under common/spiders/*_listing_spider.py and are purpose-built per retailer.

Spider Name Status Method Description Number of items output Spider Categories Sample output
amazon_search Active html Amazon keyword search spider. 22 (ok) - {"asin":"B0GHQRV71M","title":"16\" FHD IPS Laptop Computer - 16GB RAM 512GB SSD, Pentium N100(Beat to i3-1115G4, 4 Cores Up to 3.4GHz), B...
amazon_listing Active html Amazon category listing spider (category shortcuts). 22 (ok) electronics, fashion, beauty, home-kitchen, toys-games, sports-outdoors, grocery, books {"asin":"B0DKDTBBF7","title":"2 Packs Electric Candle Lighters, Windproof Flameless USB Rechargeable Plasma Arc Long Lighter for Grill Fi...
walmart_search Active api + html Walmart keyword search spider. 12 (ok) - {"item_id":"13542163431","title":"ASUS Vivobook Go 15.6” Laptop, Intel i3-N305, 8GB, 256GB, Windows 11 Home in S mode, Cool Silver, E1504...
walmart_listing Active api + html Walmart category listing spider (direct API+HTML flow). 45 (ok) electronics, home, clothing, beauty, toys, sports-and-outdoors, grocery {"item_id":"375041225","title":"Restaurado Apple iPhone 12 Restaurado - Desbloqueado para Cualquier Operador - 64GB Negro (Reacondicionad...
ebay_search Flaky bootstrap + html eBay keyword search via __NEXT_DATA__ + fallback. 0 (ok) - n/a
ebay_listing Flaky bootstrap + html eBay category listing via __NEXT_DATA__ + fallback. 4 (ok) laptops, cell-phones, headphones, watches, video-games {"item_id":null,"title":"Apple MacBook Air 13.3'' (256GB SSD, Apple M1, 8GB RAM) Laptop - Space Gray - MGN63LL/A (2020)","url":"https://w...
homedepot_search Active bootstrap + html Home Depot keyword search via Apollo state. 24 (ok) - {"item_id":"336787835","sku":"1014334650","brand":"Lukyamzn","title":"14 in. Dual-Core Celeron N4000 Laptop 6 GB RAM 128 GB SSD IPS Displ...
homedepot_listing Flaky bootstrap + html Home Depot category listing via Apollo state. 0 (ok) screwdrivers, drills, paint, light-bulbs, lumber n/a
macys_listing Active api Macy’s listing via xapi endpoint (with fallback routing). 60 (ok) laptops, shoes, dresses, fragrance, bedding {"item_id":"17595303","title":"5Core AC Power Cord 6Ft 3 Prong US Male to Female Extension Adapter 18AWG 10A 7A 125V","brand":"5 Core","u...
ulta_search Flaky api Ulta keyword search via GraphQL. 0 (timeout2) - {}
ulta_listing Active api + html Ulta category listing (GraphQL default, HTML fallback mode). 0 (ok) shampoo, conditioner, cleanser, mascara, moisturizer n/a
kohls_listing Experimental api Kohl’s listing via /web/catalog/... API. 0 (ok) women, men, sale n/a
sephora_listing Experimental api Sephora listing via /api/v2/catalog/categories/<slug>/seo. 60 (ok) makeup, skincare, gifts, fragrance {"item_id":"P517483","title":"Pocket Blush Buildable Hydrating Cream Blush","url":"https://www.sephora.com/product/pocket-blush-P517483?s...
stockx_listing Experimental bootstrap + html StockX listing via __NEXT_DATA__ bootstrap. 41 (ok) sneakers, apparel, electronics, trading-cards, collectibles {"item_id":"brands","title":"Brands","url":"https://stockx.com/brands","price":null,"currency":null}
fashionnova_listing Active api + html Fashion Nova listing via Shopify Storefront GraphQL with HTML fallback. 48 (ok) women, new, dresses, jeans, sale {"item_id":"175898317","title":"Classic High Waist Skinny Jeans - Dark Denim","url":"https://www.fashionnova.com/products/dark-blue-class...
anthropologie_listing Experimental api + html Anthropologie listing spider (API + HTML fallback). 0 (ok) women, dresses, sale n/a
lululemon_listing Active bootstrap lululemon listing spider via Next.js __NEXT_DATA__. 40 (ok) women-shorts, women-leggings, men-shorts, bags {"category":"women-shorts","product_id":"prod11860112","name":"Shake It Out High-Rise Running Short 2.5\"","brand":"lululemon","price":["...
jcpenney_listing Active api JCPenney listing spider via search API bootstrap endpoint. 48 (ok) womens_tops, mens_shirts {"item_id":"ppr5008584232","title":"St. John's Bay Womens Boat Neck Elbow Sleeve T-Shirt","brand":"st. john's bay","url":"https://www.jcp...
dillards_listing Experimental bootstrap Dillard's listing spider via window.__INITIAL_STATE__. 0 (ok) women, men, shoes, handbags, beauty, juniors, home n/a
poshmark_listing Experimental bootstrap Poshmark listing spider via window.__INITIAL_STATE__ category grid data. 48 (ok) women, men, kids, home, electronics, pets {"category":"women","item_id":"6989d90ac4e7b4d4de556bac","title":"🔥Stunning Farm Rio NWT Size Large Tropical Midi Dress with Sleeves – V...
bloomingdales_listing Experimental html + nuxt-state Bloomingdale's listing spider via direct HTML/state extraction (resilient parser). 8 (ok) women, men, shoes, beauty, home {"item_id":"5973765","title":"Tumbled Woven Verne Pants","url":"https://www.bloomingdales.com/shop/product/cinq-a-sept-tumbled-woven-vern...
qvc_listing Experimental html QVC listing spider via direct category HTML parsing. 102 (ok) beauty, fashion, home, kitchen {"item_id":"A711188","title":"lwya by kim gravel balm bae center core lip balm quad","url":"https://www.qvc.com/lwya-by-kim-gravel-balm-b...
saksfifthavenue_listing Experimental html Saks Fifth Avenue listing spider via direct category HTML cards. 24 (ok) women, men, shoes, beauty, handbags {"item_id":"0400026449047","title":"Prada Washed Re Nylon Rain Jacket","url":"https://www.saksfifthavenue.com/product/prada-washed-re-nyl...
target_search Active api Target RedSky search API spider. 24 (ok) - {"product_id":"90600286","name":"Women&#39;s Waffle Short Robe - Auden&#8482; Light Gray M/L: Front Tie, Long Sleeve","price":"$35.00","u...
target_listing Active (alias) api Deprecated alias of target_search. 0 (ok) - n/a
nordstrom_listing Experimental bootstrap + html Nordstrom listing parser; often blocked/changed. 0 (timeout2) women, men, kids, beauty, home, designer, sale {}
nordstromrack_listing Experimental playwright + html Nordstrom Rack listing spider via rendered category pages. 0 (skipped2) dresses, women, men, shoes {}
bestbuy_search Flaky bootstrap + html Best Buy search via Playwright + Apollo cache extract. 4 (skipped2) - {"item_id":"6613879","title":"HP - 14\" Laptop - Intel Processor N150 2025 - 4GB Memory - 128GB UFS - Willow Green","url":"https://www.bestbuy.com/product/hp-14-laptop-intel-pro...
bestbuy_listing Flaky bootstrap + html Best Buy listing via Playwright + Apollo cache extract. 10 (skipped2) laptops, tvs, headphones, monitors, cell-phones {"item_id":"6572184","title":"Samsung - Galaxy Book4 15.6\" FHD Laptop - Intel Core 7- 16GB Memory - 512GB SSD - Silver","url":"https://www.bestbuy.com/product/samsung-galaxy-bo...
costco_search Active bootstrap + html Costco keyword search with state extraction + fallback. 0 (skipped2) - {}
costco_listing Active bootstrap + html Costco category listing with state extraction + fallback. 24 (ok) coffee, water, snacks, vitamins, laundry, paper-products {"item_id":"100501081","title":null,"url":"https://www.costco.com/starbucks-pike-place-medium-roast-k-cup-72-count.product.100501081.html","price":null,"currency":null,"brand":n...
kroger_search Active bootstrap + html Kroger keyword search with state extraction + fallback. 0 (skipped2) - {}
kroger_listing Flaky bootstrap + html Kroger category listing with search fallback path. 24 (skipped2) cereal, milk, eggs, bread, coffee, snacks {"item_id":"general-mills-cinnamon-toast-crunch-giant-size-cereal","title":null,"url":"https://www.kroger.com/p/general-mills-cinnamon-toast-crunch-giant-size-cereal/00016000126...
bathandbodyworks_listing Experimental api + bootstrap + html Bath & Body Works multi-mode listing spider. 0 (ok) body-care, home-fragrance, hand-soaps {}
sallybeauty_listing Experimental api + bootstrap + html Sally Beauty multi-mode listing spider. 1 (ok) hair-color, hair-care, nails {"item_id":null,"title":"What's the issue? We’re dedicated to keeping SallyBeauty.com safe from bots and other malicious software. Sometimes a technical issue with your internet...
maccosmetics_listing Experimental api + bootstrap + html MAC Cosmetics multi-mode listing spider. 66 (ok) face, lips, eyes {"item_id":"13854","title":"4.8/5 ( 452 ) Lustreglass Sheer-Shine Lipstick Sheer Coverage, Glossy/High-Shine Finish, Infused With Raspberry Seed/Organic Extra Virgin Olive Oils ...
elfcosmetics_listing Experimental api + bootstrap + html e.l.f. Cosmetics multi-mode listing spider. 0 (ok) face, eyes, lips {}
ae_listing Experimental html American Eagle listing spider via category-page product cards. 30 (ok) women-tops, women-jeans, men-tops {"item_id":"1457_2980_808","title":null,"url":"https://www.ae.com/us/en/p/women/hoodies-sweatshirts/crew-neck-sweatshirts/ae-big-hug-v-neck-sweatshirt/1457_2980_808","price":nul...

Number of items output reflects recent local smoke runs (typically max_pages=1) and can vary by location, anti-bot behavior, and site changes.

Many listing spiders accept -a category=<name> shortcuts (in addition to -a category_url=<url>), including Amazon, Walmart, eBay, Home Depot, Best Buy, Costco, and Kroger.

Sample output

Below are trimmed examples from recent local test runs (JSONL output, 1 item shown).

amazon_search

{
  "asin": "B08NF2W2V2",
  "title": "INZCOU",
  "price": 36.98,
  "url": "https://www.amazon.com/s?k=sneakers",
  "image_url": "https://m.media-amazon.com/images/I/71Akg8OEbXL._AC_UL320_.jpg"
}

Run example: common-scrapy crawl amazon_search -a q=sneakers -a max_pages=1 -O amazon_search.jsonl

amazon_listing (category)

Supported built-in categories: electronics, fashion, beauty, home-kitchen, toys-games, sports-outdoors, grocery, books.

Notes:

  • Uses Amazon search query URLs (/s?k=...) for category shortcuts.
  • If a page returns no cards, spider logs a warning with URL/title to help diagnose layout/response changes.
{
  "asin": "B00008BFZH",
  "title": "Snap Circuits Jr. SC-100 Electronics Exploration Kit, Over 100 Projects, Full Color Project Manual, 28 Parts, STEM Educational Toy for Kids 8 +",
  "url": "https://www.amazon.com/Snap-Circuits-SC-100-Electronics-Exploration/dp/B00008BFZH/ref=sr_1_1?...",
  "image_url": "https://m.media-amazon.com/images/I/91THy3rMlCL._AC_UY218_.jpg",
  "price": 29.98,
  "rating": 4.8,
  "reviews_count": 28851,
  "is_prime": false,
  "is_sponsored": false
}

Run example: common-scrapy crawl amazon_listing -a category=electronics -a max_pages=1 -O amazon_cat.jsonl

walmart_listing (category)

{
  "item_id": null,
  "title": "Restored Dell Latitude 3190 | 11.6\" Touchscreen Laptop PC | Intel Core Pentium Silver N5030 (1.1 GHz) | 8GB RAM | 128GB SSD | Windows 11 Pro $178.00",
  "price": 178.0,
  "url": "https://www.walmart.com/sp/track?...",
  "image_url": "https://i5.walmartimages.com/seo/...jpeg?odnHeight=576&odnWidth=576&odnBg=FFFFFF"
}

Run example: common-scrapy crawl walmart_listing -a category=electronics -a max_pages=1 -O walmart.jsonl

walmart_search (keyword)

{
  "item_id": "13542163431",
  "title": "ASUS Vivobook Go 15.6” Laptop, Intel i3-N305, 8GB, 256GB, Windows 11 Home in S mode, Cool Silver, E1504GA-WS35",
  "url": "https://www.walmart.com/sp/track?.../ip/.../13542163431",
  "image_url": "https://i5.walmartimages.com/seo/...jpeg?odnHeight=288&odnWidth=288&odnBg=FFFFFF",
  "price": 269.0,
  "rating": null,
  "reviews_count": null,
  "is_sponsored": false,
  "source": "walmart_html"
}

Run example: common-scrapy crawl walmart_search -a q=laptop -a max_pages=1 -O walmart_search.jsonl

Notes:

  • Uses the same HTML parser as walmart_listing.
  • Walmart frequently serves a "Robot or human?" challenge depending on IP/proxy reputation; when blocked, no items are emitted and the spider logs a warning.
  • Browser inspection on https://www.walmart.com/search?q=laptop confirmed product cards + price blocks are present in rendered HTML in this runtime.
  • NordVPN US city checks (max_pages=1, q=laptop) returned stable output across Ashburn (us11646), Dallas (us9147), and Los Angeles (us5381) with 13 items each.

ebay_search (keyword; bootstrap/model-state)

{
  "item_id": "166543210987",
  "title": "Apple iPhone 14 Pro Max 256GB - Space Black (Unlocked)",
  "url": "https://www.ebay.com/itm/166543210987",
  "price": 899.99,
  "currency": "USD",
  "seller": "top_seller_store",
  "condition": "Used"
}

Run example: common-scrapy crawl ebay_search -a q='iphone 14 pro' -a max_pages=1 -O ebay_search.jsonl

ebay_listing (category; bootstrap/model-state)

{
  "item_id": null,
  "title": "Apple MacBook Air 13.3'' (256GB SSD, Apple M1, 8GB RAM) Laptop - Space Gray - MGN63LL/A (2020)",
  "url": "https://www.ebay.com/p/9055828714",
  "price": null,
  "currency": null,
  "image_url": "https://i.ebayimg.com/images/g/vtYAAOSwA3tnk8aQ/s-l400.webp",
  "source": "ebay_jsonld_fallback",
  "mode": "category",
  "category_url": "https://www.ebay.com/b/Laptops-Netbooks/175672/bn_1648276",
  "page": 1,
  "source_url": "https://www.ebay.com/b/Laptops-Netbooks/175672/bn_1648276?_ipg=60&_pgn=1"
}

Run example: common-scrapy crawl ebay_listing -a category='laptops' -a max_pages=1 -O ebay_listing.jsonl

Notes:

  • Proxy-rendered category HTML may omit __NEXT_DATA__ and serve unquoted type=application/ld+json blocks.
  • Spider now parses ItemList/Product JSON-LD fallback in that HTML mode.

homedepot_search (keyword; Apollo bootstrap)

{
  "item_id": "204663533",
  "sku": "1000024249",
  "brand": "Husky",
  "title": "Screwdriver Set (2-Piece)",
  "model": "246340020",
  "url": "https://www.homedepot.com/p/Husky-Screwdriver-Set-2-Piece-246340020/204663533",
  "image_url": "https://images.thdstatic.com/productImages/08052130-f21b-4366-93a8-9faecad0ba34/svn/husky-screwdriver-sets-246340020-64_300.jpg",
  "price": 6.97,
  "original_price": 6.97,
  "rating": 4.63,
  "reviews_count": 227,
  "source": "homedepot_apollo_bootstrap",
  "mode": "keyword",
  "query": "screwdriver",
  "category_url": null,
  "page": 1
}

Run example: common-scrapy crawl homedepot_search -a q='screwdriver' -a max_pages=1 -O homedepot_search.jsonl

homedepot_listing (category; Apollo bootstrap)

{
  "item_id": "301959988",
  "sku": "1002646248",
  "brand": "Husky",
  "title": "6-in-1 Screwdriver",
  "model": "132660011",
  "url": "https://www.homedepot.com/p/Husky-6-in-1-Screwdriver-132660011/301959988",
  "image_url": "https://images.thdstatic.com/productImages/53cb5fbd-cf6c-40c6-b395-9c42f4b36510/svn/husky-multi-bit-screwdrivers-132660011-64_300.jpg",
  "price": 8.97,
  "original_price": 8.97,
  "rating": 4.7222,
  "reviews_count": 781,
  "source": "homedepot_apollo_bootstrap",
  "mode": "category",
  "query": null,
  "category_url": "https://www.homedepot.com/b/Tools-Hand-Tools/Screwdrivers-Nut-Drivers/Screwdrivers/N-5yc1vZc25y",
  "page": 1
}

Run example: common-scrapy crawl homedepot_listing -a category='screwdrivers' -a max_pages=1 -O homedepot_listing.jsonl

Notes:

  • Category page responses are currently flaky behind anti-bot/proxy variance; retrying or changing US egress may be required.
  • When listing mode is blocked, homedepot_search still returns the same normalized product schema and can be used as a fallback signal.

macys_listing

{
  "item_id": "25092672",
  "title": "Floral Stickers Laptop, 74 Pcs, Stickers for Water Bottles,",
  "brand": "Mr. Pen",
  "price": 6.99,
  "price_text": "$6.99",
  "url": "https://www.macys.com/shop/product/floral-stickers-laptop-74-pcs-stickers-for-water-bottles?ID=25092672",
  "image_url": "7/optimized/34925717_fpx.tif",
  "source": "macys_xapi_discover_v1_page"
}

ulta_listing (category)

{
  "item_id": "2565096",
  "sku_id": "2565096",
  "brand": null,
  "title": "3 sizes Hydrate Shampoo for Dry Hair $12.00 - $90.00 Add to bag",
  "list_price": "$12.00 - $90.00",
  "sale_price": null,
  "url": "https://www.ulta.com/p/hydrate-shampoo-dry-hair-pimprod2017791?sku=2565096",
  "image_url": "https://media.ultainc.com/i/ulta/2565096?w=200&$ProductCardNeutralBGLight$&h=200&fmt=auto",
  "source": "ulta_direct_html",
  "mode": "category_html"
}

Run examples:

  • GraphQL mode (default): common-scrapy crawl ulta_listing -a category='shampoo' -a max_pages=1 -O ulta.jsonl
  • HTML mode: common-scrapy crawl ulta_listing -a category='shampoo' -a mode=html -a max_pages=1 -O ulta_html.jsonl

Notes:

  • mode=html is a fallback parser from rendered product cards and is useful when GraphQL responses are unstable.
  • HTML mode typically returns URL/title/image/price text first; GraphQL mode gives richer normalized fields (brand/rating/reviews/sponsored).

ulta_search (keyword)

{
  "item_id": "xlsImpprod15511061",
  "sku_id": "2580410",
  "brand": "Redken",
  "title": "All Soft Shampoo",
  "url": "https://www.ulta.com/p/all-soft-shampoo-xlsImpprod15511061?sku=2580410",
  "image_url": "https://media.ultainc.com/i/ulta/2580410",
  "list_price": "$11.00 - $56.00",
  "rating": 4.1,
  "reviews_count": 1601,
  "is_sponsored": false,
  "source": "ulta_dxl_graphql"
}

Run examples:

  • GraphQL mode (recommended): common-scrapy crawl ulta_search -a q=shampoo -a mode=graphql -a max_pages=1 -O ulta_search.jsonl
  • HTML fallback mode: common-scrapy crawl ulta_search -a q=shampoo -a mode=html -a max_pages=1 -O ulta_search_html.jsonl

Notes:

  • mode=graphql is the stable path for normalized fields.
  • For reliability, run via US residential egress/VPN (validated from NordVPN US Dallas).

kohls_listing

{
  "item_id": "12345678",
  "title": "Women's ...",
  "url": "https://www.kohls.com/product/prd-...",
  "price": 29.99,
  "regular_price": 39.99,
  "sale_price": 29.99,
  "brand": "SONOMA Goods for Life",
  "source": "kohls_web_catalog_api"
}

Run example: common-scrapy crawl kohls_listing -a category=women -a max_pages=1 -O kohls_listing.jsonl

sephora_listing

{
  "item_id": "P517483",
  "title": "Pocket Blush Buildable Hydrating Cream Blush",
  "url": "https://www.sephora.com/product/pocket-blush-P517483?skuId=2895845",
  "brand": "rhode",
  "rating": 4.0598,
  "reviews_count": 1153,
  "source": "sephora_catalog_api"
}

Run example: common-scrapy crawl sephora_listing -a category=makeup -a max_pages=1 -O sephora_listing.jsonl

stockx_listing

{
  "item_id": "air-jordan-1-retro-high-og-chicago-lost-and-found",
  "title": "Air Jordan 1 Retro High OG Chicago Lost and Found",
  "url": "https://stockx.com/air-jordan-1-retro-high-og-chicago-lost-and-found",
  "price": null,
  "source": "stockx_next_data|stockx_html_links_fallback"
}

Run example: common-scrapy crawl stockx_listing -a category=sneakers -a max_pages=1 -O stockx_listing.jsonl

fashionnova_listing

{
  "item_id": "123456789",
  "title": "Curve Appeal Maxi Dress - Black",
  "url": "https://www.fashionnova.com/products/curve-appeal-maxi-dress-black",
  "price": 39.99,
  "currency": "USD",
  "brand": "Fashion Nova",
  "source": "fashionnova_storefront_graphql"
}

Run examples:

  • common-scrapy crawl fashionnova_listing -a category=women -a max_pages=1 -O fashionnova_listing.jsonl
  • common-scrapy crawl fashionnova_listing -a category=women -a mode=html -a max_pages=1 -O fashionnova_listing_html.jsonl

anthropologie_listing

Run example: common-scrapy crawl anthropologie_listing -a category=women -a max_pages=1 -O anthropologie_listing.jsonl

lululemon_listing

Run example: common-scrapy crawl lululemon_listing -a category=women-shorts -a max_pages=1 -O lululemon_listing.jsonl

jcpenney_listing

Run example: common-scrapy crawl jcpenney_listing -a category=womens_tops -a max_pages=1 -O jcpenney_listing.jsonl

dillards_listing

Run example: common-scrapy crawl dillards_listing -a category=women -a max_pages=1 -O dillards_listing.jsonl

poshmark_listing

{
  "category": "women",
  "item_id": "62bdd4097028ec9dd68ee867",
  "title": "Size Large solid black yoga pants by Canta Bella",
  "brand": "Canta Bella",
  "url": "https://poshmark.com/listing/Size-Large-solid-black-yoga-pants-by-Canta-Bella-62bdd4097028ec9dd68ee867",
  "price": 11.0,
  "currency": "USD",
  "source": "poshmark_bootstrap_initial_state"
}

Run example: common-scrapy crawl poshmark_listing -a category=women -a max_pages=1 -O poshmark_listing.jsonl

Notes:

  • Verified while connected to NordVPN US endpoints (Seattle and Los Angeles).
  • Category pages expose window.__INITIAL_STATE__ with listing records at $_category.gridData.data.

bloomingdales_listing

{
  "item_id": "1234567",
  "title": "AQUA ...",
  "url": "https://www.bloomingdales.com/shop/product/...",
  "price": 198.0,
  "price_text": "$198.00",
  "source": "bloomingdales_direct_html"
}

Run example: common-scrapy crawl bloomingdales_listing -a category=women -a max_pages=1 -O bloomingdales_listing.jsonl

qvc_listing

{
  "item_id": "A711188",
  "title": "lwya by kim gravel balm bae center core lip balm quad",
  "url": "https://www.qvc.com/lwya-by-kim-gravel-balm-bae-center-core-lip-balm-quad.product.A711188.html?sc=PRODFEED",
  "price": 29.98,
  "source": "qvc_direct_html"
}

Run example: common-scrapy crawl qvc_listing -a category=beauty -a max_pages=1 -O qvc_listing.jsonl

saksfifthavenue_listing (category)

{
  "item_id": "0400026449047",
  "title": "Prada Washed Re Nylon Rain Jacket",
  "url": "https://www.saksfifthavenue.com/product/prada-washed-re-nylon-rain-jacket-0400026449047.html?dwvar_0400026449047_color=GREY",
  "price": 6200.0,
  "price_text": "$6,200",
  "source": "saksfifthavenue_direct_html"
}

Run example: common-scrapy crawl saksfifthavenue_listing -a category=women -a max_pages=1 -O saksfifthavenue_listing.jsonl

Notes:

  • Saks is heavily anti-bot protected (DataDome). Direct HTTP requests may return 403 challenge pages from some runtimes/IPs.
  • Treat this spider as best-effort/experimental; verify output quality in your target environment before relying on unattended runs.

target_search

{
  "product_id": "xxxxx",
  "name": "…",
  "price": "$…",
  "url": "https://www.target.com/p/...",
  "image": "https://target.scene7.com/is/image/Target/..."
}

Run example: common-scrapy crawl target_search -a category=5xtc0 -a max_pages=1 -O target.jsonl

target_listing

target_listing is a backwards-compatible alias of target_search.

Sample output:

{
  "product_id": "81127431",
  "name": "Women's Perfectly Cozy Jogger Pants - Stars Above™ Black M",
  "price": "$22.00",
  "url": "https://www.target.com/p/women-s-perfectly-cozy-jogger-pants-stars-above-black/-/A-81127431",
  "image": "https://target.scene7.com/is/image/Target/GUEST_9f95ecf4-59f7-4008-b854-95380a6b6f89"
}

Run example: .venv/bin/scrapy crawl target_listing -a category=5xtc0 -a max_pages=1 -O target_listing.jsonl

Validation notes (2026-02-25):

  • Browser check confirmed product/category content renders for https://www.target.com/c/women/-/N-5xtd3.
  • Verified target_listing output while connected to NordVPN US cities: Dallas, Seattle, and Ashburn.
  • target_listing (category=5xtc0, max_pages=1) consistently returned 24 items across those endpoints.

nordstrom_listing

HTML-first Nordstrom listing spider that extracts products from embedded hydration data (window.__INITIAL_CONFIG__, with __NEXT_DATA__/generic JSON fallback).

Run example: common-scrapy crawl nordstrom_listing -a category=women -a max_pages=1 -O nordstrom_listing.jsonl

Sample output:

{
  "category": "women",
  "product_id": 3865966,
  "name": "Pure Luxe Underwire T-Shirt Bra",
  "brand": "Natori",
  "price": 29.6,
  "url": "https://www.nordstrom.com/s/natori-pure-luxe-underwire-t-shirt-bra/3865966",
  "image": "https://n.nordstrommedia.com/it/0777d4b6-d7ef-4809-84a5-36fe4da01aff.jpeg",
  "rating": 4.5,
  "reviews_count": 1715
}

Validation notes (2026-02-25):

  • Browser check showed live product cards rendering on https://www.nordstrom.com/browse/women.
  • Confirmed while connected to NordVPN US cities: Ashburn, Seattle, and Dallas.
  • nordstrom_listing (category=women, max_pages=1) returned 81 items in this environment.
  • One run hit an initial 502 Bad Gateway but recovered via retry and completed successfully.

nordstromrack_listing

Playwright-rendered listing spider for Nordstrom Rack category pages.

Run example: common-scrapy crawl nordstromrack_listing -a category=dresses -a max_pages=1 -O nordstromrack_listing.jsonl

Sample output:

{
  "category": "dresses",
  "product_id": "8210770",
  "name": "One-Shoulder Front Twist A-Line Gown",
  "url": "https://www.nordstromrack.com/s/marina-one-shoulder-front-twist-a-line-gown/8210770?origin=category-personalizedsort&breadcrumb=Home%2FWomen%2FClothing%2FDresses",
  "image": "https://n.nordstrommedia.com/it/b91a2122-b716-4559-b990-4fc031eed7ca.jpeg?h=368&w=240&dpr=2",
  "source_url": "https://www.nordstromrack.com/shop/women/clothing/dresses?page=1",
  "page": 1,
  "mode": "listing"
}

bestbuy_search / bestbuy_listing

Best Buy pages currently use Apollo hydration (not __NEXT_DATA__ on PLP/search). These spiders use Playwright to render the page, then extract normalized data from ApolloClientSingleton.cache.extract() (with inline bootstrap parsing fallback).

If Best Buy serves a challenge/error variant, output may still be empty; Playwright materially improves reliability versus plain HTTP fetch.

Run examples:

  • common-scrapy crawl bestbuy_search -a q='laptop' -a max_pages=1 -O bestbuy_search.jsonl
  • common-scrapy crawl bestbuy_listing -a category=laptops -a max_pages=1 -O bestbuy_listing.jsonl

Validation notes (2026-02-25):

  • Browser check confirmed live product cards rendered on searchpage.jsp?st=laptop.
  • bestbuy_search (max_pages=1) returned items with source=bestbuy_apollo_bootstrap while connected to NordVPN US Dallas (us9157).
  • Also tested browser accessibility from NordVPN US Seattle (us8242) and US Ashburn (us9510); listing pages still rendered.

bestbuy_search sample output:

{
  "item_id": "10460842",
  "title": "HP - 14\" Laptop - Intel Processor N150 2025 - 4GB Memory - 128GB UFS - Willow Green",
  "url": "https://www.bestbuy.com/product/hp-14-laptop-intel-processor-n150-2025-4gb-memory-128gb-ufs-willow-green/JJGQJQR8CP",
  "brand": null,
  "price": 189.98,
  "currency": "USD",
  "rating": 4.6,
  "reviews_count": 1551,
  "image_url": "https://pisces.bbystatic.com/image2/BestBuy_US/images/products/90a8a03b-c474-416d-bb79-579d46bf34d5.jpg",
  "source": "bestbuy_apollo_bootstrap",
  "mode": "keyword",
  "query": "laptop",
  "page": 1,
  "source_url": "https://www.bestbuy.com/site/searchpage.jsp?st=laptop&intl=nosplash"
}

bestbuy_listing sample output:

{
  "item_id": "6628354",
  "title": "Dell - Plus - Copilot+ PC - 16\" 2K Touchscreen Laptop - AMD Ryzen AI 7 350 2025 - 32GB Memory - 1TB Storage - Ice Blue",
  "url": "https://www.bestbuy.com/product/dell-plus-copilot-pc-16-2k-touchscreen-laptop-amd-ryzen-ai-7-350-2025-32gb-memory-1tb-storage-ice-blue/J3K4L63SVF/sku/6628354",
  "brand": null,
  "price": 799.99,
  "currency": "USD",
  "rating": 4.7,
  "reviews_count": 439,
  "image_url": "https://pisces.bbystatic.com/image2/BestBuy_US/images/products/7afd11ae-3eb7-46d2-ad3e-6690837b2fdd.jpg",
  "source": "bestbuy_apollo_bootstrap",
  "mode": "category",
  "category_url": "https://www.bestbuy.com/site/all-laptops/laptops/abcat0502000.c?id=abcat0502000",
  "page": 1,
  "source_url": "https://www.bestbuy.com/site/all-laptops/laptops/abcat0502000.c?id=abcat0502000&cp=1&intl=nosplash"
}

costco_search / costco_listing

These spiders try bootstrap state extraction first (__NEXT_DATA__ / __APOLLO_STATE__), then fallback to JSON-LD and direct product-link HTML parsing.

Run examples:

  • common-scrapy crawl costco_search -a q='coffee' -a max_pages=1 -O costco_search.jsonl
  • common-scrapy crawl costco_listing -a category='coffee' -a max_pages=1 -O costco_listing.jsonl

costco_search sample output:

{
  "item_id": "100617983",
  "title": null,
  "url": "https://www.costco.com/lavazza-espresso-gran-crema-whole-bean-coffee-medium-22-lbs.product.100617983.html",
  "price": null,
  "currency": null,
  "brand": null,
  "rating": null,
  "reviews_count": null,
  "image_url": null,
  "source": "costco_html_links_fallback",
  "raw": null,
  "mode": "keyword",
  "query": "coffee",
  "page": 1,
  "source_url": "https://www.costco.com/s?keyword=coffee"
}

costco_listing sample output:

{
  "item_id": "100361434",
  "title": null,
  "url": "https://www.costco.com/kirkland-signature-colombian-coffee-dark-roast-3-lbs.product.100361434.html",
  "price": null,
  "currency": null,
  "brand": null,
  "rating": null,
  "reviews_count": null,
  "image_url": null,
  "source": "costco_html_links_fallback",
  "raw": null,
  "mode": "category",
  "category_url": "https://www.costco.com/coffee.html",
  "page": 1,
  "source_url": "https://www.costco.com/coffee.html"
}

Notes:

  • Browser HTML inspection confirms Costco search results render product links for keyword=coffee in this runtime.
  • NordVPN US city variance observed while testing costco_search (max_pages=1): Ashburn (us9512) → 24 items, Los Angeles (us5864) → 24 items, Dallas (us8104) → 0 items. HTML links fallback remains the most reliable extraction path.

kroger_search / kroger_listing

These spiders try bootstrap state extraction first (__NEXT_DATA__ / __APOLLO_STATE__), then fallback to JSON-LD and direct product-link HTML parsing.

kroger_search sample output:

{
  "item_id": "kroger-2-reduced-fat-milk-gallon",
  "title": null,
  "url": "https://www.kroger.com/p/kroger-2-reduced-fat-milk-gallon/0001111041700",
  "price": null,
  "currency": null,
  "brand": null,
  "rating": null,
  "reviews_count": null,
  "image_url": null,
  "source": "kroger_html_links_fallback",
  "raw": null,
  "mode": "keyword",
  "query": "milk",
  "page": 1,
  "source_url": "https://www.kroger.com/search?query=milk&searchType=default_search"
}

kroger_listing sample output:

{
  "item_id": "general-mills-cinnamon-toast-crunch-giant-size-cereal",
  "title": null,
  "url": "https://www.kroger.com/p/general-mills-cinnamon-toast-crunch-giant-size-cereal/0001600012685",
  "price": null,
  "currency": null,
  "brand": null,
  "rating": null,
  "reviews_count": null,
  "image_url": null,
  "source": "kroger_html_links_fallback",
  "mode": "category",
  "category_url": "https://www.kroger.com/pl/cereal/09002"
}

Run examples:

  • common-scrapy crawl kroger_search -a q='milk' -a max_pages=1 -O kroger_search.jsonl
  • common-scrapy crawl kroger_listing -a category='cereal' -a max_pages=1 -O kroger_listing.jsonl

Notes:

  • Browser check on https://www.kroger.com/pl/cereal/09002 showed "No products loaded" in both NordVPN US Ashburn and Dallas sessions.
  • kroger_search still returns keyword results via HTML link fallback (source=kroger_html_links_fallback).
  • kroger_listing may still return 0 items even after search fallback, depending on location/session.

bathandbodyworks_listing

{
  "item_id": "12345678",
  "title": "Body Lotion ...",
  "url": "https://www.bathandbodyworks.com/p/...",
  "price": 16.95,
  "currency": "USD",
  "brand": "Bath & Body Works",
  "source": "bathandbodyworks_internal_api|bathandbodyworks_html"
}

Run examples:

  • common-scrapy crawl bathandbodyworks_listing -a category='body-care' -a mode=api -a max_pages=1 -O bbw_api.jsonl
  • common-scrapy crawl bathandbodyworks_listing -a category='body-care' -a mode=bootstrap -a max_pages=1 -O bbw_bootstrap.jsonl
  • common-scrapy crawl bathandbodyworks_listing -a category='body-care' -a mode=html -a max_pages=1 -O bbw_html.jsonl

sallybeauty_listing

{
  "item_id": null,
  "title": "Gift Cards",
  "url": "https://www.sallybeauty.com/giftCards.html",
  "price": null,
  "currency": null,
  "brand": "Sally Beauty",
  "source": "sallybeauty_html",
  "mode": "category_html",
  "category_url": "https://www.sallybeauty.com/hair-care/"
}

Run examples:

  • common-scrapy crawl sallybeauty_listing -a category='hair-care' -a mode=api -a max_pages=1 -O sally_api.jsonl
  • common-scrapy crawl sallybeauty_listing -a category='hair-care' -a mode=bootstrap -a max_pages=1 -O sally_bootstrap.jsonl
  • common-scrapy crawl sallybeauty_listing -a category='hair-care' -a mode=html -a max_pages=1 -O sally_html.jsonl

maccosmetics_listing

{
  "item_id": "MAC-12345",
  "title": "Foundation ...",
  "url": "https://www.maccosmetics.com/...",
  "price": 42.0,
  "currency": "USD",
  "brand": "MAC Cosmetics",
  "source": "maccosmetics_internal_api_graphql|maccosmetics_html"
}

Run examples:

  • common-scrapy crawl maccosmetics_listing -a category='face' -a mode=api -a max_pages=1 -O mac_api.jsonl
  • common-scrapy crawl maccosmetics_listing -a category='face' -a mode=bootstrap -a max_pages=1 -O mac_bootstrap.jsonl
  • common-scrapy crawl maccosmetics_listing -a category='face' -a mode=html -a max_pages=1 -O mac_html.jsonl

elfcosmetics_listing

{
  "item_id": "ELF-12345",
  "title": "Primer ...",
  "url": "https://www.elfcosmetics.com/products/...",
  "price": 10.0,
  "currency": "USD",
  "brand": "e.l.f. Cosmetics",
  "source": "elfcosmetics_internal_api|elfcosmetics_html"
}

Run examples:

  • common-scrapy crawl elfcosmetics_listing -a category='face' -a mode=api -a max_pages=1 -O elf_api.jsonl
  • common-scrapy crawl elfcosmetics_listing -a category='face' -a mode=bootstrap -a max_pages=1 -O elf_bootstrap.jsonl
  • common-scrapy crawl elfcosmetics_listing -a category='face' -a mode=html -a max_pages=1 -O elf_html.jsonl

ae_listing

{
  "item_id": "1457_2980_808",
  "title": "AE Big Hug V-Neck Sweatshirt",
  "url": "https://www.ae.com/us/en/p/women/hoodies-sweatshirts/crew-neck-sweatshirts/ae-big-hug-v-neck-sweatshirt/1457_2980_808",
  "price": 38.97,
  "original_price": 64.95,
  "currency": "USD",
  "brand": "American Eagle",
  "source": "ae_html",
  "mode": "category_html"
}

Run example:

  • common-scrapy crawl ae_listing -a category='women-tops' -a max_pages=1 -O ae_listing.jsonl

Notes:

  • Verified in browser and direct HTTP while connected to NordVPN US (Dallas + Seattle).
  • In this environment, HTML category pages contain stable product cards/links (/us/en/p/...) suitable for listing extraction.

Contributing

Issues and pull requests that add or improve retailer spiders, pagination logic, or extraction helpers are welcome.

Project layout

  • common/spiders/ – retailer spiders (*_listing_spider.py, *_search_spider.py) and shared helpers.
  • common/settings/ – shared Scrapy configuration; reads environment variables via .env.
  • scrapy.cfg – entry point for the scrapy CLI.

Adding new retailer spiders

  1. Investigate real browser traffic and identify internal API/bootstrap/HTML patterns.
  2. Implement a purpose-built spider under common/spiders/ with normalized output fields.
  3. Add category shortcuts (categories) where applicable.
  4. Validate with max_pages=1 runs and update README examples/output snippets.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

common_scrapy-0.1.1.tar.gz (91.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

common_scrapy-0.1.1-py3-none-any.whl (107.9 kB view details)

Uploaded Python 3

File details

Details for the file common_scrapy-0.1.1.tar.gz.

File metadata

  • Download URL: common_scrapy-0.1.1.tar.gz
  • Upload date:
  • Size: 91.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for common_scrapy-0.1.1.tar.gz
Algorithm Hash digest
SHA256 12c153879a9f2902f441d2462b564cc2a19607379207599226bbafe1299a76ed
MD5 52fc284a6dda5e35b1a58590bea65817
BLAKE2b-256 a7131a9ff7e325f397824cd420b904b167912021a03af53bfd687125dd0ae6be

See more details on using hashes here.

File details

Details for the file common_scrapy-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: common_scrapy-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 107.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for common_scrapy-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 111b1565b40b069d16cdb1b8b7eda71a86ce6d6bbb6c1af2f303967bba99d8cc
MD5 7b23e000283e2ce28e3123d95216448f
BLAKE2b-256 3f415a1c3f8534a5809c6b2ef59f09f194c6da787de050facbb9210546b1333d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page