Korean Scraper
by @mupengi-bot
Korean website specialized scraper with anti-bot protection (Naver, Coupang, Daum, Instagram)
clawhub install korean-scraper๐ About This Skill
name: korean-scraper description: Korean website specialized scraper with anti-bot protection (Naver, Coupang, Daum, Instagram) version: 1.0.0 author: ๋ฌดํญ์ด ๐ง
korean-scraper
ํ๊ตญ ์น์ฌ์ดํธ ์ ๋ฌธ ์คํฌ๋ํผ โ Playwright ๊ธฐ๋ฐ์ผ๋ก ๋ค์ด๋ฒ, ์ฟ ํก, ๋ค์ ๋ฑ ํ๊ตญ ์ฃผ์ ์ฌ์ดํธ์์ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํฉ๋๋ค. Anti-bot ๋ณดํธ ์ฐํ ๊ธฐ๋ฅ ํฌํจ.
When to Use
Installation
cd skills/korean-scraper
npm install
npx playwright install chromium
Quick Start
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
# ๊ฒ์ ๊ฒฐ๊ณผ ์์ง
node scripts/naver-blog.js search "๋ง์ง ์ถ์ฒ" --limit 10ํน์ ๋ธ๋ก๊ทธ ๋ณธ๋ฌธ ์ถ์ถ
node scripts/naver-blog.js extract "https://blog.naver.com/..."
๋ค์ด๋ฒ ์นดํ
# ์ธ๊ธฐ๊ธ ์์ง
node scripts/naver-cafe.js popular "์นดํURL" --limit 20์ต์ ๊ธ ์์ง
node scripts/naver-cafe.js recent "์นดํURL" --limit 20
์ฟ ํก ์ํ
# ์ํ ์ ๋ณด ์ถ์ถ
node scripts/coupang.js product "์ํURL"๊ฒ์ ๊ฒฐ๊ณผ ์์ง
node scripts/coupang.js search "๋ฌด์ ์ด์ดํฐ" --limit 20
๋ค์ด๋ฒ ๋ด์ค
# ๊ฒ์ ๊ฒฐ๊ณผ ์์ง
node scripts/naver-news.js search "AI" --limit 10๊ธฐ์ฌ ๋ณธ๋ฌธ ์ถ์ถ
node scripts/naver-news.js extract "https://n.news.naver.com/..."
๋ค์ ๋ด์ค
# ๊ฒ์ ๊ฒฐ๊ณผ ์์ง
node scripts/daum-news.js search "๊ฒฝ์ " --limit 10๊ธฐ์ฌ ๋ณธ๋ฌธ ์ถ์ถ
node scripts/daum-news.js extract "https://v.daum.net/..."
Output Format
๋ชจ๋ ์คํฌ๋ฆฝํธ๋ ๊ตฌ์กฐํ๋ JSON์ ๋ฐํํฉ๋๋ค:
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ ๊ฒ์
{
"status": "success",
"query": "๋ง์ง ์ถ์ฒ",
"count": 10,
"results": [
{
"title": "์์ธ ๊ฐ๋จ ๋ง์ง ์ถ์ฒ BEST 5",
"url": "https://blog.naver.com/...",
"blogger": "๋ง์งํํ๊ฐ",
"date": "2026-02-15",
"snippet": "๊ฐ๋จ์ญ ๊ทผ์ฒ ์จ์ ๋ง์ง๋ค์..."
}
]
}
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ ๋ณธ๋ฌธ
{
"status": "success",
"url": "https://blog.naver.com/...",
"title": "์์ธ ๊ฐ๋จ ๋ง์ง ์ถ์ฒ BEST 5",
"author": "๋ง์งํํ๊ฐ",
"date": "2026-02-15",
"content": "# ์์ธ ๊ฐ๋จ ๋ง์ง ์ถ์ฒ BEST 5\n\n1. ...",
"images": ["https://..."],
"tags": ["๋ง์ง", "๊ฐ๋จ", "์์ธ"]
}
์ฟ ํก ์ํ
{
"status": "success",
"url": "https://www.coupang.com/...",
"productName": "์ ํ ์์ดํ ํ๋ก 2์ธ๋",
"price": 299000,
"originalPrice": 359000,
"discount": "17%",
"rating": 4.8,
"reviewCount": 1523,
"rocketDelivery": true,
"seller": "์ฟ ํก",
"images": ["https://..."]
}
๋ค์ด๋ฒ ์นดํ
{
"status": "success",
"cafeUrl": "https://cafe.naver.com/...",
"type": "popular",
"count": 20,
"posts": [
{
"title": "์ ์
ํ์ ์ธ์ฌ๋๋ฆฝ๋๋ค",
"url": "https://cafe.naver.com/.../12345",
"author": "๋๋ค์",
"date": "2026-02-17",
"views": 523,
"comments": 12
}
]
}
๋ด์ค ๊ธฐ์ฌ
{
"status": "success",
"url": "https://n.news.naver.com/...",
"title": "AI ์์ฅ ๊ท๋ชจ ๊ธ์ฑ์ฅ ์ ๋ง",
"media": "์กฐ์ ์ผ๋ณด",
"author": "ํ๊ธธ๋ ๊ธฐ์",
"date": "2026-02-17 09:30",
"content": "# AI ์์ฅ ๊ท๋ชจ ๊ธ์ฑ์ฅ ์ ๋ง\n\n...",
"category": "IT/๊ณผํ",
"images": ["https://..."]
}
Anti-Bot Features
Rate Limiting
๋ชจ๋ ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ดํธ๋ฅผ ๋ณดํธํฉ๋๋ค:
--fast ํ๋๊ทธ๋ก ๋๋ ์ด ์ถ์ ๊ฐ๋ฅ (์ฃผ์)Error Handling
| ์ํฉ | ๋์ | |------|------| | 404 | JSON์ผ๋ก ์๋ฌ ๋ฐํ, ๊ณ์ ์งํ | | 403/์ฐจ๋จ | ์ฌ์๋ (์ต๋ 3ํ) | | ํ์์์ | ๋๊ธฐ ์๊ฐ ์ฐ์ฅ ํ ์ฌ์๋ | | ๋ก๊ทธ์ธ ํ์ | ๊ฒฝ๊ณ ๋ฉ์์ง + ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ง ๋ฐํ |
Environment Variables
# Headless ๋ชจ๋ ๋๊ธฐ (๋๋ฒ๊น
์ฉ)
HEADLESS=false node scripts/naver-blog.js ...์คํฌ๋ฆฐ์ท ์ ์ฅ
SCREENSHOT=true node scripts/coupang.js ...๋๊ธฐ ์๊ฐ ์กฐ์ (ms)
WAIT_TIME=10000 node scripts/naver-cafe.js ...User-Agent ์ปค์คํ
USER_AGENT="..." node scripts/naver-news.js ...
Integration Examples
OpenClaw Agent ํตํฉ
// ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ ๊ฒ์
const result = await exec({
command: 'node scripts/naver-blog.js search "AI ํธ๋ ๋" --limit 5',
workdir: '/path/to/skills/korean-scraper'
});
const data = JSON.parse(result.stdout);
Batch Processing
# ์ฌ๋ฌ URL ์ผ๊ด ์ฒ๋ฆฌ
cat urls.txt | while read url; do
node scripts/naver-blog.js extract "$url" >> results.jsonl
done
Limitations
Compliance & Ethics
Troubleshooting
๋ฌธ์ : 403 Forbidden
ํด๊ฒฐ์ฑ : 1. User-Agent ๋ณ๊ฒฝ ์๋ 2. ๋๊ธฐ ์๊ฐ ๋๋ฆฌ๊ธฐ (WAIT_TIME=15000)
3. Headless ๋ชจ๋ ๋๊ธฐ (HEADLESS=false)๋ฌธ์ : ๋น ๊ฒฐ๊ณผ ๋ฐํ
ํด๊ฒฐ์ฑ : 1. URL ํ์ ํ์ธ 2. ์ฌ์ดํธ ๊ตฌ์กฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ (์ ๋ ํฐ ์ ๋ฐ์ดํธ ํ์) 3. ๋ก๊ทธ์ธ ํ์ ์ฌ๋ถ ํ์ธ๋ฌธ์ : Timeout
ํด๊ฒฐ์ฑ : 1.WAIT_TIME ๋๋ฆฌ๊ธฐ
2. ์ธํฐ๋ท ์ฐ๊ฒฐ ํ์ธ
3. ์ฌ์ดํธ ์ ๊ทผ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ (VPN ํ์ ๋ฑ)Maintenance
ํ๊ตญ ์ฌ์ดํธ๋ค์ UI๋ฅผ ์์ฃผ ๋ณ๊ฒฝํ๋ฏ๋ก, ์ ๋ ํฐ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ์ ์์ต๋๋ค.
์
๋ ํฐ ์์น: scripts/ ๋ด ๊ฐ ํ์ผ ์๋จ SELECTORS ๊ฐ์ฒด
const SELECTORS = {
blogTitle: '.se-title-text',
blogContent: '.se-main-container',
// ...
};
Future Improvements
References
โก When to Use
๐ก Examples
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
# ๊ฒ์ ๊ฒฐ๊ณผ ์์ง
node scripts/naver-blog.js search "๋ง์ง ์ถ์ฒ" --limit 10ํน์ ๋ธ๋ก๊ทธ ๋ณธ๋ฌธ ์ถ์ถ
node scripts/naver-blog.js extract "https://blog.naver.com/..."
๋ค์ด๋ฒ ์นดํ
# ์ธ๊ธฐ๊ธ ์์ง
node scripts/naver-cafe.js popular "์นดํURL" --limit 20์ต์ ๊ธ ์์ง
node scripts/naver-cafe.js recent "์นดํURL" --limit 20
์ฟ ํก ์ํ
# ์ํ ์ ๋ณด ์ถ์ถ
node scripts/coupang.js product "์ํURL"๊ฒ์ ๊ฒฐ๊ณผ ์์ง
node scripts/coupang.js search "๋ฌด์ ์ด์ดํฐ" --limit 20
๋ค์ด๋ฒ ๋ด์ค
# ๊ฒ์ ๊ฒฐ๊ณผ ์์ง
node scripts/naver-news.js search "AI" --limit 10๊ธฐ์ฌ ๋ณธ๋ฌธ ์ถ์ถ
node scripts/naver-news.js extract "https://n.news.naver.com/..."
๋ค์ ๋ด์ค
# ๊ฒ์ ๊ฒฐ๊ณผ ์์ง
node scripts/daum-news.js search "๊ฒฝ์ " --limit 10๊ธฐ์ฌ ๋ณธ๋ฌธ ์ถ์ถ
node scripts/daum-news.js extract "https://v.daum.net/..."
๐ Tips & Best Practices
๋ฌธ์ : 403 Forbidden
ํด๊ฒฐ์ฑ : 1. User-Agent ๋ณ๊ฒฝ ์๋ 2. ๋๊ธฐ ์๊ฐ ๋๋ฆฌ๊ธฐ (WAIT_TIME=15000)
3. Headless ๋ชจ๋ ๋๊ธฐ (HEADLESS=false)๋ฌธ์ : ๋น ๊ฒฐ๊ณผ ๋ฐํ
ํด๊ฒฐ์ฑ : 1. URL ํ์ ํ์ธ 2. ์ฌ์ดํธ ๊ตฌ์กฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ (์ ๋ ํฐ ์ ๋ฐ์ดํธ ํ์) 3. ๋ก๊ทธ์ธ ํ์ ์ฌ๋ถ ํ์ธ๋ฌธ์ : Timeout
ํด๊ฒฐ์ฑ : 1.WAIT_TIME ๋๋ฆฌ๊ธฐ
2. ์ธํฐ๋ท ์ฐ๊ฒฐ ํ์ธ
3. ์ฌ์ดํธ ์ ๊ทผ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ (VPN ํ์ ๋ฑ)