DEV Community

agenthustler
agenthustler

Posted on

Scraping E-commerce Flash Sales: Finding Deals Before They're Gone

Flash sales last minutes to hours. A scraper detecting them early gives you competitive advantage.

Deal Detection

import requests
from bs4 import BeautifulSoup
import time, hashlib
from datetime import datetime

class FlashSaleScraper:
    def __init__(self):
        self.s = requests.Session()
        self.s.headers["User-Agent"] = "Mozilla/5.0"
        self.seen = set()

    def slickdeals(self, min_score=10):
        soup = BeautifulSoup(self.s.get("https://slickdeals.net/deals/").text, "html.parser")
        deals = []
        for item in soup.select("[data-deal-id]"):
            t = item.select_one(".itemTitle a")
            if not t: continue
            p = item.select_one(".itemPrice")
            sc = item.select_one(".dealScore")
            deal = {"title":t.get_text(strip=True),
                    "url":"https://slickdeals.net"+t.get("href",""),
                    "price":p.get_text(strip=True) if p else "N/A",
                    "score":int(sc.get_text(strip=True).replace("+","")) if sc else 0}
            if deal["score"] >= min_score:
                did = hashlib.md5(deal["url"].encode()).hexdigest()
                if did not in self.seen:
                    self.seen.add(did); deals.append(deal)
        return deals

    def woot(self):
        soup = BeautifulSoup(self.s.get("https://www.woot.com").text, "html.parser")
        return [{"title":h.get_text(strip=True),"source":"woot"} for h in soup.select("article h2")]

    def score(self, d):
        s = 0
        if d.get("score",0) > 20: s += 20
        elif d.get("score",0) > 10: s += 10
        d["deal_score"] = s
        return d

    def best(self, min_s=25):
        deals = [self.score(d) for d in self.slickdeals()]
        time.sleep(2)
        deals.extend(self.woot())
        return sorted([d for d in deals if d.get("deal_score",0)>=min_s],
                      key=lambda x:x.get("deal_score",0), reverse=True)

    def monitor(self, mins=5, rounds=12):
        for _ in range(rounds):
            for d in self.best()[:5]:
                print(f"[{d.get('deal_score',0)}] {d['title'][:50]}")
            time.sleep(mins*60)

FlashSaleScraper().monitor()
Enter fullscreen mode Exit fullscreen mode

Anti-Bot

ScraperAPI handles CAPTCHAs. ThorData residential proxies. ScrapeOps tracks blocks.

Reseller Angle

Find products below market value for arbitrage. Automate to find deals while others browse manually.

Top comments (0)