{"id":"ecommerce-listing","name":"ecommerce-listing","summary":"任意のeコマースのカテゴリページ、検索結果ページ、またはキーワード検索からフィルター付きの商品リストを抽出できます。","body":"# E-commerce — Product Listing\n\n> Category/search URL or keyword + filters → paginated product list (URL, name, price, image, rating per item)\n\n## Language\n\nAll process output to user (progress updates, process notifications) follows the user's language.\n\n## Objective\n\nExtract a structured list of products from any e-commerce category, search results, or keyword search page, with support for price/brand/rating filters and multi-page pagination.\n\n## Prerequisites\n\n- Target browser is open and connected\n- No login required for public listing pages\n\n## Pre-execution Checks\n\n### 1. Tool Readiness\n\nIf browser-act has been confirmed available in the current session → skip this step.\n\nInvoke `browser-act` via Skill tool to load usage. If installation or configuration issues arise, follow its guidance to resolve then retry.\n\n## Capability Components\n\n> This Skill's operational boundary = what the user can manually do in their browser. It only reads data already displayed to the user on the page. JS code is encapsulated in Python files under the `scripts/` directory, invoked via `eval \"$(python scripts/xxx.py {params})\"`. Use the bash tool for execution.\n\n### DOM: Extract product list from current page\n\nNavigate to the listing/search page first, then extract:\n\n```bash\neval \"$(python scripts/extract-listing.py --max-results 20)\"\n```\n\nParameters:\n- `--max-results`: max items to return per page, default 20\n\nOutput example:\n```json\n{\n  \"count\": 20,\n  \"items\": [\n    {\n      \"url\": \"https://www.amazon.com/dp/B09WNK39JN\",\n      \"name\": \"Amazon Echo Pop\",\n      \"price\": 39.99,\n      \"currency\": \"USD\",\n      \"image\": \"https://m.media-amazon.com/images/I/...jpg\",\n      \"rating\": 4.7,\n      \"review_count\": 103789,\n      \"asin\": \"B09WNK39JN\"\n    }\n  ]\n}\n```\n\n### DOM: Get next page URL\n\nAfter extracting a page, get the URL to navigate to for the next page:\n\n```bash\neval \"$(python scripts/extract-listing-next-page.py)\"\n```\n\nOutput example:\n```json\n{\"next_url\": \"https://www.amazon.com/s?k=headphones&page=2\", \"has_next\": true, \"method\": \"amazon\"}\n```\n\nWhen `has_next` is false, pagination is complete.\n\n### Composite: Keyword search with filters → product list\n\n**Step 1 — Build search URL with filters:**\n\nConstruct the URL based on target site and desired filters using the patterns below, then navigate:\n\n**Amazon** (`amazon.com`):\n```\nhttps://www.amazon.com/s?k={keyword_urlencoded}&s={sort}&rh={filter_params}\n```\n- Sort (`s`): `price-asc-rank` | `price-desc-rank` | `review-rank` | `date-desc-rank` (omit for relevance)\n- Price filter: append `p_36:{min_cents}-{max_cents}` to `rh` (dollars × 100, e.g. $50–$200 → `p_36:5000-20000`)\n- Rating filter: append `avg_customer_review:four-and-above` | `three-and-above` | `two-and-above` to `rh`\n- In-stock: append `p_n_availability:1248801011` to `rh`\n- Multiple `rh` values: comma-separate (e.g. `rh=p_36:5000-20000,avg_customer_review:four-and-above`)\n\n**eBay** (`ebay.com`):\n```\nhttps://www.ebay.com/sch/i.html?_nkw={keyword_urlencoded}&_udlo={min_price}&_udhi={max_price}&_sop={sort_num}\n```\n- Sort: `12`=BestMatch | `15`=PriceLow | `16`=PriceHigh | `24`=NewlyListed\n\n**Walmart** (`walmart.com`):\n```\nhttps://www.walmart.com/search?q={keyword_urlencoded}&min_price={min}&max_price={max}&sort={sort}\n```\n- Sort: `best_match` | `price_low` | `price_high` | `rating_high`\n\n**Google Shopping** (cross-site, no `--site`):\n```\nhttps://www.google.com/search?tbm=shop&q={keyword_urlencoded}&tbs=p_ord:{sort}\n```\n- Sort: `rv`=relevance | `pd`=price ascending | `prd`=price descending\n\n**Any site with `--site`** (generic):\n```\nhttps://{site}/search?q={keyword_urlencoded}\n```\n\n**Step 2 — Navigate and extract:**\n1. `navigate {constructed_url}` → `wait stable`\n2. `eval \"$(python scripts/extract-listing.py --max-results {n})\"`\n\n**Step 3 — Paginate (repeat until done):**\n1. `eval \"$(python scripts/extract-listing-next-page.py)\"`\n2. If `has_next` is true: `navigate {next_url}` → `wait stable` → re-run extract-listing.py\n3. If `has_next` is false: stop\n\n## Pagination\n\n**URL Pagination**: `extract-listing-next-page.py` detects `rel=next` link, platform-specific pagination controls, and URL page parameters. Returns `next_url` for navigation.\n\n**DOM Pagination**: For sites with load-more buttons (some Shopify themes):\n1. `state` to find \"Load more\" or \"Show more\" button\n2. `click <index>` → `wait stable` → re-run `extract-listing.py`\n3. Termination: button no longer present, or item count stops increasing\n\n## Success Criteria\n\n`result.count >= 1 AND items[0].url != null`\n\n## Known Limitations\n\n- Amazon: direct navigation may trigger bot detection on fresh sessions — navigate from `https://www.amazon.com` first\n- eBay listing pages may require navigating from `https://www.ebay.com` first\n- Google Shopping results have complex SPA structure and may have reduced accuracy; prefer direct site search when `--site` is specified\n- Filter URL parameters are site-specific; unsupported filter parameters are silently ignored by some sites\n- Shopify themes vary widely; if the generic DOM strategies miss items, check if the page has JSON-LD ItemList or Product array in page source\n\n## Execution Efficiency\n\n- **Batch orchestration**: Loop through pages serially within a single session; add 1–2 second intervals between page navigations\n- **Test before batch execution**: Test with 1 page before running multi-page extraction\n- **Error resumption**: Record page number; on failure, resume from the last successful page\n\n## Experience Notes\n\nPath: `{working-directory}/browser-act-skill-forge-memories/ecommerce-scraper-ecommerce-listing.memory.md`\n\n**Before execution**: If the file exists, read it first — it records unexpected situations encountered during past executions; adjust strategy order accordingly.\n\n**After execution**: If an unexpected situation is encountered (strategy became ineffective, page redesigned, anti-scraping upgraded, better path discovered), append a line:\n`{YYYY-MM-DD}: {what happened} → {conclusion}`","author":"@browser-act","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/browser-act/skills/tree/main/solutions/ecommerce/ecommerce-listing","license":"MIT","category":"coding","lang":"en","tokens":1551,"stars":0,"calls30d":1,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[{"path":"scripts/extract-listing-next-page.py","size":2445,"sha256":"fd193ec7b6edc7c19dc96ff1f6152ba14134d63e43a181b06e165ea20dabf19b"},{"path":"scripts/extract-listing.py","size":7553,"sha256":"60fb8a17c8487579a5fcf99f96ebcc1efc9bb5c8a2cf2427a13baeb6bd3b6c5d"}],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[{"code":"net.endpoints","kind":"exfiltration","excerpt":"m.media-amazon.com, www.amazon.com, www.ebay.com, www.google.com, www.walmart.com","message":"bundled scripts reach 5 external host(s)","severity":"warn"}],"scannedAt":"2026-08-22","hasScripts":true,"networkEndpoints":["m.media-amazon.com","www.amazon.com","www.ebay.com","www.google.com","www.walmart.com"]}}