← back to Dw Yolo Loop

.coll-audit.py

82 lines

import json, sys
from playwright.sync_api import sync_playwright

BASE = "https://www.designerwallcoverings.com/collections/"
HANDLES = [
    "alligator-skin-wallpaper-collection",
    "andrew-martin-wallcoverings",
    "animal-print-wallpaper",
    "art-nouveau-wallpaper",
    "blue-wallcoverings",
    "chinoiserie-collection",
    "cole-and-son-collections",
    "designers-guild-wallpaper",
    "grasscloth-wallpaper-collection",
    "green-wallcoverings",
    "kelly-wearstler-wallpapers-1",
    "kids-wallpaper",
    "metallic-wallpaper-collection",
    "mulberry-wallcoverings",
    "red-wallcovering-collection",
]

TILE_SEL = (
    ".boost-pfs-filter-product-item, [class*='product-item'], .product-card, "
    ".grid__item .card, li.grid__item, [data-product-id], .product-grid-item, .grid-product"
)

def count_tiles(page):
    try:
        n = page.locator(TILE_SEL).count()
    except Exception:
        n = 0
    if n == 0:
        try:
            n = page.locator("a[href*='/products/']").count()
        except Exception:
            n = 0
    return n

results = []
with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    ctx = browser.new_context(viewport={"width":1440,"height":900},
        user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124 Safari/537.36")
    for h in HANDLES:
        url = BASE + h
        rec = {"handle": h, "url": url}
        page = ctx.new_page()
        try:
            page.goto(url, wait_until="domcontentloaded", timeout=45000)
            try:
                page.wait_for_load_state("networkidle", timeout=15000)
            except Exception:
                pass
            page.wait_for_timeout(1500)
            before = count_tiles(page)
            rec["tiles_before"] = before
            html = page.content()
            rec["has_boost"] = ("boost-pfs" in html) or ("boostCommerce" in html) or ("boost_pfs" in html)
            rec["has_loadmore_btn"] = page.locator(
                "button:has-text('Load More'), a:has-text('Load More'), .boost-pfs-filter-load-more, [class*='load-more'], .load-more").count()
            rec["has_pagination"] = page.locator(
                "nav.pagination, ul.pagination, .boost-pfs-filter-bottom-pagination, [class*='pagination'], a[href*='?page='], a[href*='&page=']").count()
            page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
            page.wait_for_timeout(2000)
            page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
            page.wait_for_timeout(2000)
            rec["tiles_after"] = count_tiles(page)
            shot = "/tmp/coll-audit/" + h + ".png"
            page.screenshot(path=shot, full_page=False)
            rec["screenshot"] = shot
            rec["title"] = page.title()
        except Exception as e:
            rec["error"] = str(e)[:200]
        results.append(rec)
        print(json.dumps(rec)); sys.stdout.flush()
        page.close()
    browser.close()

open("/tmp/coll-audit/results.json","w").write(json.dumps(results, indent=2))
print("DONE")