GitHub - D4Vinci/Scrapling: ๐ท๏ธ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!
ํต์ฌ ํฌ์ธํธ
- 1Scrapling์ ๋จ์ผ ์์ฒญ๋ถํฐ ๋๊ท๋ชจ ํฌ๋กค๋ง๊น์ง ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ๋ ์ ์ํ ์น ์คํฌ๋ํ ํ๋ ์์ํฌ์ ๋๋ค.
- 2์ด ํ๋ ์์ํฌ๋ ์น์ฌ์ดํธ ๋ณ๊ฒฝ์ ์ ์ํ๋ ํ์๋ฅผ ํตํด ์์ ์์น๋ฅผ ์๋ ์กฐ์ ํ๊ณ , Fetcher๋ฅผ ์ฌ์ฉํ์ฌ Cloudflare Turnstile๊ณผ ๊ฐ์ anti-bot ์์คํ ์ ์ฐํํ๋ฉฐ, Spider API๋ก ๋ฉํฐ์ธ์ ํฌ๋กค๋ง, ํ๋ก์ ๋กํ ์ด์ , ์ผ์ ์ค์ง/์ฌ๊ฐ๋ฅผ ์ง์ํฉ๋๋ค.
- 3Scrapling์ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋น ๋ฐ์ด๋ ์ฑ๋ฅ๊ณผ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ์ ๊ณตํ๋ฉฐ, CLI ๋ฐ ๋ํํ ์ ธ์ ํฌํจํ ๊ฐ๋ฐ์ ์นํ์ ์ธ ๊ธฐ๋ฅ๊ณผ AI ์ฐ๋(MCP server)์ ํตํด ์น ์คํฌ๋ํ ์์ ์ ๊ฐ์ํํฉ๋๋ค.
Scrapling์ ๋จ์ผ ์์ฒญ๋ถํฐ ๋๊ท๋ชจ ํฌ๋กค๋ง๊น์ง ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋ ์ ์ํ(adaptive) ์น ์คํฌ๋ํ ํ๋ ์์ํฌ์ ๋๋ค. ์ด ํ๋ ์์ํฌ๋ ์น์ฌ์ดํธ ๋ณ๊ฒฝ์ ๋ฐ๋ผ ํ์(parser)๊ฐ ์ค์ค๋ก ํ์ตํ์ฌ ์์(element)์ ์์น๋ฅผ ์๋์ผ๋ก ์ฌ์กฐ์ ํ๋ฉฐ, Cloudflare Turnstile๊ณผ ๊ฐ์ anti-bot ์์คํ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐํํ ์ ์๋ Fetcher๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ํ, ๋์์ฑ(concurrent) ๋ฐ ๋ค์ค ์ธ์ (multi-session) ํฌ๋กค๋ง์ ์ง์ํ๋ Spider ํ๋ ์์ํฌ๋ ์ผ์์ ์ง/์ฌ๊ฐ(pause/resume) ๊ธฐ๋ฅ๊ณผ ์๋ ํ๋ก์ ๋กํ ์ด์ (proxy rotation) ๊ธฐ๋ฅ์ ๋ด์ฅํ๊ณ ์์ต๋๋ค.
์ฃผ์ ํน์ง ๋ฐ ํต์ฌ ๋ฐฉ๋ฒ๋ก ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Spider (ํฌ๋กค๋ง ํ๋ ์์ํฌ)
- Scrapy-like Spider API:
start_urls, ๋น๋๊ธฐparse์ฝ๋ฐฑ,Request/Response๊ฐ์ฒด ๋ฑ Scrapy์ ์ ์ฌํ API๋ฅผ ์ ๊ณตํ์ฌ ์คํ์ด๋ ์ ์๋ฅผ ์ฉ์ดํ๊ฒ ํฉ๋๋ค. - Concurrent Crawling: ์ค์ ๊ฐ๋ฅํ ๋์์ฑ ์ ํ, ๋๋ฉ์ธ๋ณ ์ค๋กํ๋ง(throttling), ๋ค์ด๋ก๋ ์ง์ฐ(download delays)์ ํตํด ํจ์จ์ ์ธ ๋์ ํฌ๋กค๋ง์ ์ง์ํฉ๋๋ค.
- Multi-Session Support: HTTP ์์ฒญ๊ณผ ์คํ
์ค(stealthy) headless ๋ธ๋ผ์ฐ์ ์์ฒญ์ ๋จ์ผ ์คํ์ด๋ ๋ด์์ ํตํฉ ๊ด๋ฆฌํ๋ฉฐ,
sid(session ID)๋ฅผ ํตํด ๋ค๋ฅธ ์ธ์ ์ผ๋ก ์์ฒญ์ ๋ผ์ฐํ ํ ์ ์์ต๋๋ค. - Pause & Resume: ์ฒดํฌํฌ์ธํธ(checkpoint) ๊ธฐ๋ฐ์ ํฌ๋กค๋ง ์ง์์ฑ(persistence)์ ์ ๊ณตํ์ฌ, Ctrl+C๋ก ์ข ๋ฃ ์ ์งํ ์ํฉ์ ์ ์ฅํ๊ณ ๋์ค์ ๋ค์ ์์ํ ์ ์์ต๋๋ค.
- Streaming Mode:
async for item in spider.stream()๊ตฌ๋ฌธ์ ํตํด ์ค์๊ฐ ํต๊ณ์ ํจ๊ป ์คํฌ๋ํ๋ ํญ๋ชฉ์ ์คํธ๋ฆผ์ผ๋ก ๋ฐ์๋ณผ ์ ์์ต๋๋ค. - Blocked Request Detection: ์ฐจ๋จ๋ ์์ฒญ์ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ ๋ก์ง์ผ๋ก ์ฌ์๋(retry)ํฉ๋๋ค.
- Built-in Export:
result.items.to_json()๋๋result.items.to_jsonl()๋ฅผ ํตํด JSON/JSONL ํ์์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค.
- Scrapy-like Spider API:
- Advanced Website Fetching (์ธ์
์ง์)
- HTTP Requests (
Fetcher): ๋ธ๋ผ์ฐ์ ์ TLS fingerprint, ํค๋๋ฅผ ๋ชจ๋ฐฉํ๊ณ HTTP/3๋ฅผ ์ง์ํ์ฌ ๋น ๋ฅด๊ณ ์คํ ์คํ HTTP ์์ฒญ์ ์ํํฉ๋๋ค. - Dynamic Loading (
DynamicFetcher): Playwright์ Chromium ๋ฐ Google Chrome์ ํตํด ์ ์ฒด ๋ธ๋ผ์ฐ์ ์๋ํ(full browser automation)๋ฅผ ์ ๊ณตํ์ฌ ๋์ ์น์ฌ์ดํธ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. - Anti-bot Bypass (
StealthyFetcher): ๊ณ ๊ธ ์คํ ์ค ๊ธฐ๋ฅ๊ณผ fingerprint ์คํธํ(spoofing)์ ํตํด Cloudflare Turnstile/Interstitial๊ณผ ๊ฐ์ ๋ค์ํ anti-bot ์์คํ ์ ์ฐํํฉ๋๋ค. - Session Management:
FetcherSession,StealthySession,DynamicSessionํด๋์ค๋ฅผ ํตํด ์ฟ ํค(cookie) ๋ฐ ์ํ ๊ด๋ฆฌ(state management)๋ฅผ ์ํ ์๊ตฌ์ ์ธ ์ธ์ ์ง์์ ์ ๊ณตํฉ๋๋ค. - Proxy Rotation:
ProxyRotator๋ฅผ ๋ด์ฅํ์ฌ ์ํ(cyclic) ๋๋ ์ฌ์ฉ์ ์ ์ ๋กํ ์ด์ ์ ๋ต์ ์ง์ํ๋ฉฐ, ์์ฒญ๋ณ ํ๋ก์ ์ฌ์ ์๋ ๊ฐ๋ฅํฉ๋๋ค. - Async Support: ๋ชจ๋ fetcher ๋ฐ ์ ์ฉ ๋น๋๊ธฐ ์ธ์ ํด๋์ค์ ๊ฑธ์ณ ์์ ํ ๋น๋๊ธฐ ์ง์์ ์ ๊ณตํฉ๋๋ค.
- HTTP Requests (
- Adaptive Scraping & AI Integration (ํต์ฌ ๋ฐฉ๋ฒ๋ก )
- Smart Element Tracking: ์ด ๊ธฐ๋ฅ์ Scrapling์ ํต์ฌ์ ์ธ ์ ์ ๋ฉ์ปค๋์ฆ์ผ๋ก, ์น์ฌ์ดํธ ๋์์ธ ๋ณ๊ฒฝ ํ์๋ "์ง๋ฅํ ์ ์ฌ์ฑ ์๊ณ ๋ฆฌ์ฆ(intelligent similarity algorithms)"์ ์ฌ์ฉํ์ฌ ์ด์ ์ ์๋ณ๋ ์์๋ฅผ ์ฌ๋ฐฐ์นํฉ๋๋ค. ์ด๋ CSS ์ ๋ ํฐ๋ XPath๊ฐ ์น์ฌ์ดํธ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๋ฌดํจํ๋ ๊ฒฝ์ฐ, ์๊ฐ์ ๋๋ ๊ตฌ์กฐ์ ํน์ง์ ์ ์ฌ์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ๋ชฉํ ์์๋ฅผ ๋ค์ ์ฐพ์๋ด๋ ๋ฐฉ์์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์์์ ํ ์คํธ ๋ด์ฉ, ์ฃผ๋ณ ์์์์ ๊ด๊ณ, ์์ฑ(attributes) ๋ฑ์ ์ข ํฉ์ ์ผ๋ก ๋ถ์ํ์ฌ ๋ณํ๋ ํ์ด์ง ๋ด์์ ๊ฐ์ฅ ์ ์ฌํ ๋์์ ์๋ณํฉ๋๋ค.
- Smart Flexible Selection: CSS ์
๋ ํฐ, XPath ์
๋ ํฐ, ํํฐ ๊ธฐ๋ฐ ๊ฒ์, ํ
์คํธ ๊ฒ์, ์ ๊ท์(regex) ๊ฒ์ ๋ฑ ๋ค์ํ ์ ํ ๋ฐฉ๋ฒ์ ์ง์ํฉ๋๋ค.
find_all,find_by_text์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํ์ฌ ์ ์ฐํ ์์ ํ์์ด ๊ฐ๋ฅํฉ๋๋ค. - Find Similar Elements: ๋ฐ๊ฒฌ๋ ์์์ ์ ์ฌํ ๋ค๋ฅธ ์์๋ฅผ ์๋์ผ๋ก ์ฐพ์๋ ๋๋ค. ์ด๋ ์น ํ์ด์ง์์ ๋ฐ๋ณต๋๋ ๊ตฌ์กฐ(์: ์ํ ๋ชฉ๋ก)๋ฅผ ์คํฌ๋ํํ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
- MCP Server to be used with AI: ๋ด์ฅ๋ MCP(Minimum Cost Page) ์๋ฒ๋ AI(Claude/Cursor ๋ฑ)์ ์ฐ๋ํ์ฌ AI ๋ณด์กฐ ์น ์คํฌ๋ํ ๋ฐ ๋ฐ์ดํฐ ์ถ์ถ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด ์๋ฒ๋ Scrapling์ ํ์ฉํ์ฌ ํน์ ์ฝํ ์ธ ๋ฅผ ์ถ์ถํ ํ AI์ ์ ๋ฌํจ์ผ๋ก์จ, AI์ ํ ํฐ ์ฌ์ฉ๋์ ์ต์ํํ๊ณ ๋น์ฉ์ ์ ๊ฐํ๋ฉฐ ์์ ์๋๋ฅผ ํฅ์์ํต๋๋ค. ์ด๋ ์คํฌ๋ํ๋ ๋ฐ์ดํฐ๋ฅผ AI ๋ชจ๋ธ์ ์ต์ ํ๋ ํํ๋ก ์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค.
- High-Performance & Battle-tested Architecture
- ์ต์ ํ๋ ์ฑ๋ฅ๊ณผ ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์๋ํ๋ฉฐ, ๋ค๋ฅธ Python ์คํฌ๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ณด๋ค ๋น ๋ฅธ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ํนํ, JSON ์ง๋ ฌํ(serialization)๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ณด๋ค 10๋ฐฐ ๋น ๋ฆ ๋๋ค. 92%์ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง์ ์๋ฒฝํ ํ์ ํํธ(type hints) ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํตํด ๋์ ์์ ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- Developer/Web Scraper Friendly Experience
- ๋ํํ(interactive) ์น ์คํฌ๋ํ ์
ธ,
curl์์ฒญ์ Scrapling ์์ฒญ์ผ๋ก ๋ณํํ๋ ๊ธฐ๋ฅ,extract๋ช ๋ น์ด๋ฅผ ํตํ ์ฝ๋ ์๋ ์คํฌ๋ํ ๋ฑ ๋ค์ํ ๊ฐ๋ฐ์ ํธ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.parent,sibling,child์ ๊ฐ์ DOM ํธ๋๋ฒ์ค(traverse) ๋ฉ์๋์ ํฅ์๋ ํ ์คํธ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ํฌํจํฉ๋๋ค. ๋ํ, Scrapy/BeautifulSoup์ ์ ์ฌํ ์น์ํ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋ํํ(interactive) ์น ์คํฌ๋ํ ์
ธ,
์ค์น ๋ฐ ๋ฐฐํฌ๋ pip install scrapling ๋ช
๋ น์ด๋ก ๊ฐ๋ฅํ๋ฉฐ, fetcher, AI, ์
ธ ๊ธฐ๋ฅ ๋ฑ์ ์ํ ์ถ๊ฐ ์์กด์ฑ(dependencies)์ scrapling[fetchers], scrapling[ai], scrapling[shell], scrapling[all]๊ณผ ๊ฐ์ด ์ค์นํ ์ ์์ต๋๋ค. Docker ์ด๋ฏธ์ง๋ ์ ๊ณตํ์ฌ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ ํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. Scrapling์ ๊ต์ก ๋ฐ ์ฐ๊ตฌ ๋ชฉ์ ์ผ๋ก ์ ๊ณต๋๋ฉฐ, ๋ฐ์ดํฐ ์คํฌ๋ํ ๋ฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ๋ฒ์ ์ค์ํด์ผ ํฉ๋๋ค.