Scrapes second-hand item search results from Goofish (闲鱼/xianyu, goofish.com) — China's largest second-hand marketplace. Input: keyword, optional sort/filter params. Output: list of items with id, title, price, image, location, want-count per page (30 items/page). Use when user mentions goofish, 闲鱼, xianyu, 二手交易, second-hand marketplace China, 二手商品搜索, search used goods, scrape goofish listings, xianyu search results, collect second-hand prices, monitor used item prices, 闲鱼关键词搜索, 闲鱼数据采集, 批量抓取闲鱼, goofish scraper, goofish data, xianyu data extraction, 二手商品价格监控, used iPhone prices, 二手手机价格. Also applies to: price research on Chinese second-hand market, competitor product monitoring via used goods listings, inventory analysis.
keyword + optional filters → list of 30 second-hand item cards per page (id, title, price, image, location, want-count)
browser-act via Skill tool to load usage. If installation or configuration issues arise, follow its guidance to resolve then retry.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 thescripts/directory, invoked viaeval "$(python scripts/xxx.py {params})".$(...)is bash syntax; it is recommended to use the bash tool for execution.
sign token computed client-side — they cannot be reconstructed directly. Navigate to the search URL to trigger the API automatically.navigate https://www.goofish.com/search?q={keyword}wait stableeval "$(python scripts/extract-search-items.py)"{
"items": [
{
"item_id": "1054668718340", // unique item ID
"category_id": "126862528", // category ID
"item_url": "https://www.goofish.com/item?id=1054668718340&categoryId=126862528",
"title": "美版iPhone 14 国行256G 纯原 原版原漆", // full title text
"image_url": "https://img.alicdn.com/bao/uploaded/...", // thumbnail URL
"price": "1810", // numeric string, CNY, no ¥ sign
"service_tag": "Apple/苹果256GB无任何维修", // condition/attribute tag or recency label, null if absent
"price_desc": "2人想要", // want-count or price-drop info, null if absent
"location": "广东" // seller's location province/city
}
],
"count": 30
}
extract-search-items.py. After calling, wait stable before extracting.eval "$(python scripts/apply-search-filters.py --sort {sort} --publish-days {days} --price-min {min} --price-max {max})"--sort: Sort option — "" default (综合), "reduce" price-drop (新降价), "create" newest (新发布), "price-asc" price low-to-high, "price-desc" price high-to-low. Default: ""--publish-days: Filter by publish date — "" all, "1" within 1 day, "3" within 3 days, "7" within 7 days, "14" within 14 days. Default: ""--price-min: Minimum price (CNY integer string, e.g., "500"). Requires --price-max. Default: ""--price-max: Maximum price (CNY integer string, e.g., "3000"). Requires --price-min. Default: ""{
"ok": true,
"applied": {
"sort": "reduce:desc",
"searchFilter": "publishDays:7;priceRange:500,3000;"
}
}
eval "$(python scripts/goto-page.py {page_number})"page_number: Target page number (integer, 1-based){ "ok": true, "clicked_page": 2 }
wait stable then re-run extract-search-items.py to get the new page's items."" (综合/default), "reduce" (新降价), "create" (新发布/最新), "price-asc" (价格从低到高), "price-desc" (价格从高到低)"" (all), "1", "3", "7", "14"goto-page.py {page}, then wait stable, then re-run extract-search-items.py. Page numbers appear in the pagination bar at the bottom of the search results.goto-page.py returns error: Page N not found — no more pages available, or the target page exceeds the pagination range displayed (typically up to 25 pages / 750 items).result count >= 1 and item_id non-null rate = 100% and price non-null rate >= 80%sign token in search API requests is computed client-side; direct API replay without browser context is not supported — always trigger via page navigation{working-directory}/browser-act-skill-forge-memories/xianyu-scraper-goofish-search-list.memory.md{YYYY-MM-DD}: {what happened} → {conclusion}