Install any skill in seconds. Free to start, no credit card required.
Get Started Free →당근마켓을 구·시·전국 단위로 훑는다. 당근 웹 검색은 동 하나로만 되기 때문에, 지역코드를 순회해야 넓게 찾을 수 있다.
.claude/skills/bam-bam-2-daangn-search/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 78% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -3% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 57% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 26% | 0% |
당근 웹(www.daangn.com)의 중고거래 검색은 선택된 행정동 하나의 매물만 보여준다. "전국 검색" 기능이 없다. 넓게 찾으려면 지역코드를 바꿔가며 순회해야 한다.
https://www.daangn.com/kr/buy-sell/?in=x-<지역ID>&search=<검색어>&only_on_sale=truein 파라미터의 이름 부분은 무시되고 숫자 ID만 유효하다. x-448처럼 아무 이름이나 써도 된다only_on_sale=true 를 붙이면 거래완료 매물이 빠진다. 안 붙이면 결과 대부분이 이미 팔린 것시도 순서로 연속 배치돼 있다. 서울은 구 단위로 아래와 같다.
| 구 | ID | 구 | ID | |---|---|---|---| | 종로 | 3~19 | 양천 | 239~260 | | 중구 | 20~35 | 강서 | 261~280 | | 용산 | 36~52 | 구로 | 281~296 | | 성동 | 53~70 | 금천 | 297~306 | | 광진 | 71~86 | 영등포 | 307~325 | | 동대문 | 87~110 | 동작 | 326~340 | | 중랑 | 111~127 | 관악 | 341~361 | | 성북 | 128~144 | 서초 | 362~380 | | 강북 | 145~157 | 강남 | 381~403 | | 도봉 | 158~172 | 송파 | 404~431 | | 노원 | 173~185 | 강동 | 432~450 | | 은평 | 186~206 | | | | 서대문 | 207~220 | 마포 | 221~238 |
서울 밖: 부산 451~, 대구 ~680~830, 인천 ~831~960, 광주 ~961~, 대전 ~1051~, 울산 ~1151~, 세종·경기 ~1251~1800, 강원 ~1900, 충북 ~2100, 충남 ~2400, 전북 ~2700, 전남 ~3000.
경계는 정확하지 않다. 확인이 필요하면 아래로 지역명을 읽어 검증한다.
jsconst m = html.match(/data-gtm="search_filter">([^<]+)</); // "서울시 강동구 둔촌동"
jsfunction parseL(html){ const re=/<a data-gtm="search_article"[^>]*href="(\/kr\/buy-sell\/[^"]+)"[\s\S]*?<\/a>/g; const res=[]; let m; while((m=re.exec(html))){ const seg=m[0]; const txt=seg.replace(/<img[^>]*>/g,'').replace(/<svg[\s\S]*?<\/svg>/g,'') .replace(/<[^>]+>/g,'\u0001').split('\u0001').map(s=>s.trim()).filter(Boolean); res.push({href:'https://www.daangn.com'+m[1], t:txt.join(' | ')}); // "제목 | 가격 | 동네 | 시간" } return res; }
상세 페이지는 fetch 후 매너온도 다음 20줄 정도를 읽으면 본문·채팅수·관심수가 나온다.
CloudFront가 앞단에 있어 너무 빠르면 403이 뜬다. 한 번 막히면 1~2분 쉬어야 풀린다.
page.goto()(브라우저)는 동당 2.4초로 fetch보다 3~4배 느리다. fetch를 쓴다page가 null이 되는 일이 있다. fetch 방식이면 영향 없다당근 검색은 토큰 기반이라 한 단어로는 다 못 잡는다. 2~3개를 돌린다.
콤보(워시콤보·AI콤보 잡힘) + 세탁건조기 + 워시타워콤보 같은 일반어는 영화 팝콘 쿠폰 같은 노이즈가 압도적이다. 수집 후 /세탁|건조/ 등으로 거른다Map(href → 제목)에 모아 자동 중복 제거한다. 같은 판매자가 여러 동네에 중복 게시하는 일이 잦다제목 문자열에서 가격·세대를 뽑아 정렬하면 시세 분포가 바로 보인다.
jsconst price = t => { const m=t.match(/([\d,]+)원/); return m?+m[1].replace(/,/g,''):null; };
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 23,674 | 17,511 | -26% | 1 | 1 | 0% | 3,396 | 3,102 | -9% | 0 | 0 | — |
case-02 | fail→fail | 15,276 | 28,602 | +87% | 1 | 1 | 0% | 2,401 | 3,168 | +32% | 0 | 0 | — |
case-03 | fail→fail | 23,989 | 27,940 | +16% | 1 | 1 | 0% | 3,599 | 3,068 | -15% | 0 | 0 | — |
case-04 | fail→pass | 16,303 | 21,635 | +33% | 1 | 1 | 0% | 2,687 | 4,794 | +78% | 0 | 0 | — |
case-05 | fail→pass | 14,829 | 4,805 | -68% | 1 | 1 | 0% | 2,240 | 2,177 | -3% | 0 | 0 | — |
case-06 | fail→pass | 19,227 | 17,005 | -12% | 1 | 1 | 0% | 2,774 | 4,350 | +57% | 0 | 0 | — |
case-07 | fail→pass | 19,015 | 32,900 | +73% | 1 | 1 | 0% | 3,554 | 4,907 | +38% | 0 | 0 | — |
case-08 | fail→pass | 20,188 | 13,581 | -33% | 1 | 1 | 0% | 3,221 | 4,067 | +26% | 0 | 0 | — |
case-09 | fail→pass | 19,161 | 6,322 | -67% | 1 | 1 | 0% | 3,022 | 2,626 | -13% | 0 | 0 | — |
case-10 | fail→pass | 15,074 | 19,707 | +31% | 1 | 1 | 0% | 2,402 | 4,427 | +84% | 0 | 0 | — |
case-11 | fail→fail | 17,281 | 30,280 | +75% | 1 | 1 | 0% | 2,748 | 4,705 | +71% | 0 | 0 | — |
case-12 | pass→pass | 16,869 | 14,334 | -15% | 1 | 1 | 0% | 2,495 | 3,786 | +52% | 0 | 0 | — |
case-13 | fail→pass | 41,067 | 16,386 | -60% | 1 | 1 | 0% | 3,688 | 4,441 | +20% | 0 | 0 | — |
case-14 | pass→pass | 10,542 | 7,756 | -26% | 1 | 1 | 0% | 2,001 | 2,964 | +48% | 0 | 0 | — |
case-15 | fail→pass | 15,706 | 13,984 | -11% | 1 | 1 | 0% | 2,651 | 3,678 | +39% | 0 | 0 | — |
case-16 | fail→pass | 15,963 | 16,052 | +1% | 1 | 1 | 0% | 2,606 | 4,759 | +83% | 0 | 0 | — |
case-17 | fail→pass | 20,985 | 5,379 | -74% | 1 | 1 | 0% | 3,287 | 2,567 | -22% | 0 | 0 | — |
case-18 | pass→pass | 17,822 | 20,566 | +15% | 1 | 1 | 0% | 2,618 | 4,360 | +67% | 0 | 0 | — |
case-19 | fail→pass | 29,343 | 7,988 | -73% | 1 | 1 | 0% | 3,199 | 3,168 | -1% | 0 | 0 | — |
case-20 | pass→pass | 17,534 | 19,634 | +12% | 1 | 1 | 0% | 2,489 | 4,287 | +72% | 0 | 0 | — |
case-21 | pass→pass | 20,985 | 21,943 | +5% | 1 | 1 | 0% | 2,785 | 4,732 | +70% | 0 | 0 | — |
case-22 | pass→pass | 21,150 | 20,208 | -4% | 1 | 1 | 0% | 3,106 | 4,629 | +49% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +55 percentage points is the difference between those two pass rates over the 19 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.