
웹 스크래핑을 쉽게 하는 방법
SCRAPPER는 스크래퍼가 아닙니다 — 실제 브라우저 데이터를 캡처하여 모든 자동화 도구에서 사용할 수 있는 세션 옵저버입니다.
BertUI React 프레임워크 기반
GitHub: BunElysiaReact/SCRAPY
도메인 불필요. 클라우드 불필요. 모두 로컬. 모두 당신의 것입니다.

모든 웹 자동화 도구(Puppeteer, Playwright, Selenium, 심지어 curl)는 동일한 과제를 공유합니다:
진짜 문제: 이 모든 도구는 인간을 모방하려고 시도합니다. 하지만 실제 인간이 어떤 모습인지 추측하고 있습니다.
SCRAPPER는 스크래핑하지 않습니다. 성공적인 스크래핑에 필요한 실제 데이터를 제공합니다.
사용자 SCRAPPER
│ │
├── Brave/Chrome/Firefox를 확장 프로그램과 함께 열기 ──────►│
│ │
├── 자동화하려는 사이트에 로그인 ─────────────────────────────►│ 캡처:
│ │ • 쿠키
├── 정상적으로 탐색, 버튼 클릭 ──────────────────────────►│ • 토큰
│ │ • 지문
└── 탐색 완료 ─────────────────────────────────────►│ • API 요청
│ • DOM 구조
사용자 스크립트 ──── GET /api/v1/session/all ────► SCRAPPER API (localhost:8080)
◄── { cookies, tokens, fingerprint } ────────────────────────┘
│
▼
Puppeteer / Playwright / Selenium / Python requests / curl
│
▼
✅ 사용자의 실제 세션으로 인증된 요청

SCRAPPER Extension

Register Extension

위 스크립트는 SCRAPPER를 사용하여 실제 claude.ai 세션을 캡처한 다음 API를 통해 직접 메시지를 보냈습니다 — 로그인 코드, Puppeteer, 브라우저 자동화가 전혀 없습니다.
📦 세션 데이터
├── 🍪 쿠키 (HttpOnly, Secure, 모든 도메인 포함)
├── 💾 localStorage 및 sessionStorage
├── 🔑 인증 토큰 (Bearer, JWT, CSRF, 사용자 정의)
└── 📨 모든 HTTP 헤더
🖥️ 브라우저 지문
├── 📱 사용자 에이전트
├── 🖼️ 화면 해상도 및 색상 깊이
├── 🌍 시간대 및 언어 설정
└── 📨 전체 헤더 세트 (Accept, Accept-Language 등)
📡 네트워크 트래픽
├── 📤 모든 HTTP 요청 (URL, 메서드, 헤더, POST 데이터)
├── 📥 모든 HTTP 응답 (상태, 헤더, 본문)
└── 🔄 WebSocket 프레임
🌳 DOM 상태
├── 📄 DOM 스냅샷
├── 🎯 실시간 선택자 테스트
└── 🗺️ DOM 맵 (모든 태그, 클래스, ID)
캡처가 완료되면 SCRAPPER는 모든 데이터를 http://localhost:8080의 간단한 REST API를 통해 제공합니다.
curl -fsSL https://raw.githubusercontent.com/BunElysiaReact/SCRAPY/main/install.sh | bash
# 1단계 — Brave에서 확장 프로그램 로드:
# brave://extensions → 개발자 모드 켜기 → 압축 해제된 확장 프로그램 로드
# → ~/.scrapper/extension/brave/ 선택
# 2단계 — 확장 프로그램 ID 등록
scrapper-register-ext YOUR_EXTENSION_ID
# 3단계 — SCRAPPER 시작
scrapper-start
# 4단계 — 대시보드 열기
# http://localhost:8080
# 저장소 복제
git clone https://github.com/BunElysiaReact/SCRAPY.git ~/scrapper
cd ~/scrapper
# C 네이티브 호스트 빌드
gcc -O2 -o linux/c_core/native_host/debug_host linux/c_core/native_host/debug_host.c -lpthread
# Rust 선택자 엔진 빌드
cd linux/rust_finder && cargo build --release && cd ../..
# API 서버 시작
cd linux/python_api && python3 api.py
http://localhost:8080 열기 → 대시보드 준비 완료.
irm https://raw.githubusercontent.com/BunElysiaReact/SCRAPY/main/install.ps1 | iex
⚠️ 네이티브 메시징 등록이 올바르게 작동하려면 PowerShell을 관리자 권한으로 실행하세요.
%USERPROFILE%\.scrapper\
├── bin\
│ ├── debug_host.exe ← C 네이티브 메시징 호스트
│ ├── scraper_cli.exe ← CLI 클라이언트
│ ├── rust_finder.exe ← 빠른 HTML 선택자 엔진
│ ├── scrapper-start.bat ← 모든 것 시작
│ └── scrapper-stop.bat ← 모든 것 중지
├── data\ ← 모든 캡처된 세션 데이터
├── logs\ ← 호스트 로그
├── python_api\
│ └── api.py ← REST API 서버
├── extension\
│ ├── brave\ ← Brave / Chrome / Edge에 로드
│ └── firefox\ ← Firefox에 로드
└── ui\scrapperui\ ← 대시보드 소스
brave://extensions 또는 chrome://extensions 열기~/.scrapper/extension/brave/ 선택scrapper-register-ext YOUR_IDBrave/Chrome과 동일 — Edge는 Chromium 기반이므로 extension/brave/ 폴더를 사용하세요.
about:debugging → 이 Firefox 열기~/.scrapper/extension/firefox/manifest.json 선택⚠️ Firefox는 쿠키, 헤더, localStorage는 캡처하지만 CDP 수준의 요청 본문은 캡처하지 않습니다.
from curl_cffi import requests
API = "http://localhost:8080"
domain = "example.com"
cookies_raw = requests.get(f"{API}/api/v1/session/cookies?domain={domain}").json()
fp = requests.get(f"{API}/api/v1/fingerprint?domain={domain}").json()
session = requests.Session(impersonate="chrome120")
for c in cookies_raw:
session.cookies.set(c["name"], c["value"], domain=c.get("domain", domain).lstrip("."))
session.headers.update({"User-Agent": fp.get("userAgent", "")})
response = session.get(f"https://{domain}/api/data")
print(response.json())
import requests
session_data = requests.get('http://localhost:8080/api/v1/session/all').json()
s = requests.Session()
s.cookies.update({c['name']: c['value'] for c in session_data['cookies']})
s.headers.update({'User-Agent': session_data['fingerprint']['userAgent']})
response = s.get('https://api.example.com/data')
source <(curl -s http://localhost:8080/api/v1/export/env)
curl -X POST "https://api.example.com/upload" \
-H "Authorization: Bearer $SCRAPPER_BEARER_TOKEN" \
-b "$SCRAPPER_COOKIES" \
-F "[email protected]"
import requests
from playwright.async_api import async_playwright
session = requests.get('http://localhost:8080/api/v1/session/all').json()
async with async_playwright() as p:
context = await p.chromium.launch_persistent_context(
user_data_dir="./profile",
user_agent=session['fingerprint']['userAgent'],
)
await context.add_cookies(session['cookies'])
page = await context.new_page()
await page.goto('https://example.com')
const session = await fetch('http://localhost:8080/api/v1/session/all').then(r => r.json());
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setCookie(...session.cookies);
await page.setUserAgent(session.fingerprint.userAgent);
await page.goto('https://example.com/dashboard');
SCRAPPER Live Dashboard
http://localhost:8080 열기:
# 최신 세션 데이터 내보내기
curl -s "http://localhost:8080/api/v1/bulk/all?format=jsonl" > session.jsonl
# 스크래퍼에서 사용
python3 my-scraper.py --session session.jsonl
# session_refresh.py — 주간 세션 새로고침 파이프라인
import requests, schedule, time
def refresh_session():
notify_user("브라우저에서 대상 사이트에 로그인해 주세요")
time.sleep(300) # 사용자 탐색을 위한 5분
data = requests.get('http://localhost:8080/api/v1/bulk/all?format=json').json()
with open(f'session_{int(time.time())}.json', 'w') as f:
import json; json.dump(data, f)
schedule.every().monday.at("09:00").do(refresh_session)
while True:
schedule.run_pending()
time.sleep(60)
BertUI의 SCRAPPER — 웹 자동화를 위한 세션 옵저버
🔍 사용자 대신 브라우저를 관찰합니다
⭐ SCRAPPER가 도움이 되셨다면 저장소에 별표를 눌러주세요 — 다른 사람들이 찾는 데 도움이 됩니다!
| 과제 | 어려운 이유 |
|---|
| 인증 | 모든 사이트에 대해 수동으로 로그인을 스크립팅하는 것은 지루하고 깨지기 쉽습니다 |
| 세션 상태 | 쿠키는 만료되고, 토큰은 회전하며, localStorage는 지워집니다 |
| 역공학 | API 패턴을 이해하기 위해 DevTools에서 몇 시간을 보냅니다 |
| 봇 탐지 | TLS 지문, 브라우저 엔트로피, Cloudflare, hCaptcha |
| 설정 복잡성 | 헤드리스 브라우저, 프록시, 스텔스 플러그인과 씨름합니다 |
| SCRAPPER는... | SCRAPPER는... 아닙니다 |
|---|
| 🔍 세션 옵저버 — 실제 브라우저를 관찰합니다 | ❌ Puppeteer/Playwright/Selenium을 대체하지 않습니다 |
| 💾 데이터 캡처 도구 — 실제 세션을 저장합니다 | ❌ 웹사이트를 스크래핑하지 않습니다 |
| 📡 로컬 API 서버 — 캡처된 데이터를 제공합니다 | ❌ 호스팅 서비스나 클라우드 플랫폼이 아닙니다 |
| 🧠 역공학 도우미 — 숨겨진 API를 드러냅니다 | ❌ 마법의 "모든 것을 스크래핑" 버튼이 아닙니다 |
| 🎯 시각적 디버거 — 사이트 구조를 이해합니다 | ❌ 코드 없는 자동화 빌더가 아닙니다 |
| 장점 | 중요한 이유 |
|---|
| 고급 봇 탐지 우회 | curl_cffi를 사용하여 실제 브라우저의 TLS 지문(예: Chrome 120)을 가장 — 자동화로 플래그되지 않음 |
| 97% 성공률 | 시각적 UI가 아닌 내부 API 경로를 대상 — CSS 변경, 버튼 이동, 레이아웃 변경에 영향을 받지 않음 |
| 낮은 리소스 사용량 | ~20MB RAM 대 Puppeteer/Selenium의 500MB 이상. 브라우저 엔진 실행 없음 |
| 보이지 않는 인증 | 기존의 사람이 확인한 세션을 활용 — 로그인 흐름, CAPTCHA 없음 |
| 실제 브라우저와 동기화 | 스크립트의 메시지/작업이 새로고침 시 실제 브라우저 탭에 나타남 |
| 언어 무관 | 세션 API는 Python, Go, Rust, Node, curl 등 HTTP 요청을 할 수 있는 모든 도구와 작동 |
| 단점 | 의미 |
|---|
| 깨지기 쉬운 세션 수명 | 활성 브라우저 세션에 전적으로 의존 — 로그아웃하면 만료됨 |
| 내부 API에 의존 | 사전 통보 없이 변경될 수 있는 문서화되지 않은 엔드포인트 사용 |
| 설치 인프라 필요 | 독립 실행형이 아님 — 네이티브 호스트 + 브라우저 확장 프로그램이 동시에 실행되어야 함 |
| 계정 위험 | 실제 신원 사용. 공격적인 속도 제한을 가하면 실제 계정이 차단될 수 있음 |
| 학습 곡선 | 올바른 API 페이로드를 이해하려면 네트워크 트래픽을 읽어야 함 |
| 단일 장치 바인딩 | device-id는 하나의 캡처된 세션에 연결 — 여러 장치 간에 쉽게 공유 불가 |
| 엔드포인트 | 설명 |
|---|
GET /api/v1/session/cookies?domain=example.com | 도메인의 모든 쿠키 |
GET /api/v1/session/localstorage?domain=example.com | localStorage 데이터 |
GET /api/v1/session/all | 전체 세션 덤프 |
GET /api/v1/fingerprint | 브라우저 지문 |
GET /api/v1/tokens/all | 추출된 모든 토큰 |
GET /api/v1/requests/recent?limit=50 | 최근 네트워크 요청 |
GET /api/v1/dom/snapshot?url=example.com | DOM 스냅샷 |
GET /api/v1/export/env | 환경 변수 형식 |
GET /api/v1/bulk/all?format=[json|jsonl|har|csv|txt] | 모든 것, 원하는 형식 |
| 탭 | 기능 |
|---|
| Live | 모든 캡처된 네트워크 이벤트의 실시간 스트림 |
| Bodies | HTTP 응답 본문 — JSON, HTML, SVG, 이미지, 미리보기 포함 |
| Responses | 도메인별 모든 HTTP 응답, 플래그로 필터 가능 |
| Intel | 도메인별 요약 — 토큰, 쿠키, 엔드포인트, DOM 맵 |
| Tokens | Bearer 토큰, 작업 토큰, 인증 쿠키, curl 스니펫 |
| Endpoints | 발견된 모든 API 엔드포인트, "LLM용 복사" 포함 |
| DOM Map | 전체 태그/클래스/ID 트리 — 항목 클릭 시 자동 스크래핑 |
| Find | 실제 렌더링된 HTML에 대해 CSS 선택자 테스트 |
| Nav | 탭 탐색 및 추적, 쿠키 덤프, HTML 캡처 |
| Queue | 구성 가능한 지연 시간으로 URL 목록 일괄 처리 |
| 영역 | 필요한 것 |
|---|
| 테스트 | 다른 사이트에서 SCRAPPER 시도, 버그 보고 |
| Firefox | Firefox 확장 프로그램 CDP 우회 개선 도움 |
| Windows | Windows 설치 프로그램 엣지 케이스 테스트 |
| 문서 | 특정 사이트나 사용 사례에 대한 튜토리얼 작성 |
| 코드 | PR 환영 — 특히 버그 수정 |