huggmyas commited on
Commit
a0357fa
·
1 Parent(s): 587c648

docs: Add Korean (한국어) README translation

Browse files
Files changed (2) hide show
  1. README.md +1 -1
  2. docs/README_KR.md +502 -0
README.md CHANGED
@@ -14,7 +14,7 @@
14
  <p align="center">
15
  <a href="https://trendshift.io/repositories/14244" target="_blank"><img src="https://trendshift.io/api/badge/repositories/14244" alt="D4Vinci%2FScrapling | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
16
  <br/>
17
- <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_AR.md">العربيه</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_ES.md">Español</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_FR.md">Français</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_DE.md">Deutsch</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_CN.md">简体中文</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_JP.md">日本語</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_RU.md">Русский</a>
18
  <br/>
19
  <a href="https://github.com/D4Vinci/Scrapling/actions/workflows/tests.yml" alt="Tests">
20
  <img alt="Tests" src="https://github.com/D4Vinci/Scrapling/actions/workflows/tests.yml/badge.svg"></a>
 
14
  <p align="center">
15
  <a href="https://trendshift.io/repositories/14244" target="_blank"><img src="https://trendshift.io/api/badge/repositories/14244" alt="D4Vinci%2FScrapling | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
16
  <br/>
17
+ <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_AR.md">العربيه</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_ES.md">Español</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_FR.md">Français</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_DE.md">Deutsch</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_CN.md">简体中文</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_JP.md">日本語</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_RU.md">Русский</a> | <a href="https://github.com/D4Vinci/Scrapling/blob/main/docs/README_KR.md">한국어</a>
18
  <br/>
19
  <a href="https://github.com/D4Vinci/Scrapling/actions/workflows/tests.yml" alt="Tests">
20
  <img alt="Tests" src="https://github.com/D4Vinci/Scrapling/actions/workflows/tests.yml/badge.svg"></a>
docs/README_KR.md ADDED
@@ -0,0 +1,502 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!-- mcp-name: io.github.D4Vinci/Scrapling -->
2
+
3
+ <h1 align="center">
4
+ <a href="https://scrapling.readthedocs.io">
5
+ <picture>
6
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/docs/assets/cover_dark.svg?sanitize=true">
7
+ <img alt="Scrapling Poster" src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/docs/assets/cover_light.svg?sanitize=true">
8
+ </picture>
9
+ </a>
10
+ <br>
11
+ <small>Effortless Web Scraping for the Modern Web</small>
12
+ </h1>
13
+
14
+ <p align="center">
15
+ <a href="https://github.com/D4Vinci/Scrapling/actions/workflows/tests.yml" alt="Tests">
16
+ <img alt="Tests" src="https://github.com/D4Vinci/Scrapling/actions/workflows/tests.yml/badge.svg"></a>
17
+ <a href="https://badge.fury.io/py/Scrapling" alt="PyPI version">
18
+ <img alt="PyPI version" src="https://badge.fury.io/py/Scrapling.svg"></a>
19
+ <a href="https://clickpy.clickhouse.com/dashboard/scrapling" rel="nofollow"><img src="https://img.shields.io/pypi/dm/scrapling" alt="PyPI package downloads"></a>
20
+ <a href="https://github.com/D4Vinci/Scrapling/tree/main/agent-skill" alt="AI Agent Skill directory">
21
+ <img alt="Static Badge" src="https://img.shields.io/badge/Skill-black?style=flat&label=Agent&link=https%3A%2F%2Fgithub.com%2FD4Vinci%2FScrapling%2Ftree%2Fmain%2Fagent-skill"></a>
22
+ <a href="https://clawhub.ai/D4Vinci/scrapling-official" alt="OpenClaw Skill">
23
+ <img alt="OpenClaw Skill" src="https://img.shields.io/badge/Clawhub-darkred?style=flat&label=OpenClaw&link=https%3A%2F%2Fclawhub.ai%2FD4Vinci%2Fscrapling-official"></a>
24
+ <br/>
25
+ <a href="https://discord.gg/EMgGbDceNQ" alt="Discord" target="_blank">
26
+ <img alt="Discord" src="https://img.shields.io/discord/1360786381042880532?style=social&logo=discord&link=https%3A%2F%2Fdiscord.gg%2FEMgGbDceNQ">
27
+ </a>
28
+ <a href="https://x.com/Scrapling_dev" alt="X (formerly Twitter)">
29
+ <img alt="X (formerly Twitter) Follow" src="https://img.shields.io/twitter/follow/Scrapling_dev?style=social&logo=x&link=https%3A%2F%2Fx.com%2FScrapling_dev">
30
+ </a>
31
+ <br/>
32
+ <a href="https://pypi.org/project/scrapling/" alt="Supported Python versions">
33
+ <img alt="Supported Python versions" src="https://img.shields.io/pypi/pyversions/scrapling.svg"></a>
34
+ </p>
35
+
36
+ <p align="center">
37
+ <a href="https://scrapling.readthedocs.io/en/latest/parsing/selection/"><strong>선택 메서드</strong></a>
38
+ &middot;
39
+ <a href="https://scrapling.readthedocs.io/en/latest/fetching/choosing/"><strong>Fetcher 선택 가이드</strong></a>
40
+ &middot;
41
+ <a href="https://scrapling.readthedocs.io/en/latest/spiders/architecture.html"><strong>Spider</strong></a>
42
+ &middot;
43
+ <a href="https://scrapling.readthedocs.io/en/latest/spiders/proxy-blocking.html"><strong>프록시 로테이션</strong></a>
44
+ &middot;
45
+ <a href="https://scrapling.readthedocs.io/en/latest/cli/overview/"><strong>CLI</strong></a>
46
+ &middot;
47
+ <a href="https://scrapling.readthedocs.io/en/latest/ai/mcp-server/"><strong>MCP 서버</strong></a>
48
+ </p>
49
+
50
+ Scrapling은 단일 요청부터 대규모 크롤링까지 모든 것을 처리하는 적응형 Web Scraping 프레임워크입니다.
51
+
52
+ 파서는 웹사이트 변경 사항을 학습하고, 페이지가 업데이트되면 요소를 자동으로 재배치합니다. Fetcher는 Cloudflare Turnstile 같은 안티봇 시스템을 별도 설정 없이 우회합니다. Spider 프레임워크를 사용하면 일시정지/재개 및 자동 프록시 로테이션을 갖춘 동시 멀티 세션 크롤링으로 확장할 수 있습니다 — 모두 Python 몇 줄이면 됩니다. 하나의 라이브러리, 타협 없는 성능.
53
+
54
+ 실시간 통계와 스트리밍을 통한 초고속 크롤링. Web Scraper가 만들고, Web Scraper와 일반 사용자 모두를 위해 설계했습니다.
55
+
56
+ ```python
57
+ from scrapling.fetchers import Fetcher, AsyncFetcher, StealthyFetcher, DynamicFetcher
58
+ StealthyFetcher.adaptive = True
59
+ p = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # 탐지를 피해 웹사이트를 가져옵니다!
60
+ products = p.css('.product', auto_save=True) # 웹사이트 디자인 변경에도 살아남는 데이터를 스크레이핑!
61
+ products = p.css('.product', adaptive=True) # 나중에 웹사이트 구조가 바뀌면, `adaptive=True`를 전달해서 찾으세요!
62
+ ```
63
+ 또는 본격적인 크롤링으로 확장
64
+ ```python
65
+ from scrapling.spiders import Spider, Response
66
+
67
+ class MySpider(Spider):
68
+ name = "demo"
69
+ start_urls = ["https://example.com/"]
70
+
71
+ async def parse(self, response: Response):
72
+ for item in response.css('.product'):
73
+ yield {"title": item.css('h2::text').get()}
74
+
75
+ MySpider().start()
76
+ ```
77
+
78
+ <p align="center">
79
+ <a href="https://dataimpulse.com/?utm_source=scrapling&utm_medium=banner&utm_campaign=scrapling" target="_blank" style="display:flex; justify-content:center; padding:4px 0;">
80
+ <img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/DataImpulse.png" alt="At DataImpulse, we specialize in developing custom proxy services for your business. Make requests from anywhere, collect data, and enjoy fast connections with our premium proxies." style="max-height:60px;">
81
+ </a>
82
+ </p>
83
+
84
+ # 플래티넘 스폰서
85
+ <table>
86
+ <tr>
87
+ <td width="200">
88
+ <a href="https://hypersolutions.co/?utm_source=github&utm_medium=readme&utm_campaign=scrapling" target="_blank" title="Bot Protection Bypass API for Akamai, DataDome, Incapsula & Kasada">
89
+ <img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/HyperSolutions.png">
90
+ <br />
91
+ </a>
92
+ </td>
93
+ <td> Scrapling은 Cloudflare Turnstile을 처리합니다. 엔터프라이즈급 보호가 필요하다면, <a href="https://hypersolutions.co?utm_source=github&utm_medium=readme&utm_campaign=scrapling">
94
+ <b>Hyper Solutions</b>
95
+ </a>가 <b>Akamai</b>, <b>DataDome</b>, <b>Kasada</b>, <b>Incapsula</b>용 유효한 안티봇 토큰을 생성하는 API 엔드포인트를 제공합니다. 간단한 API 호출만으로, 브라우저 자동화가 필요 없습니다. </td>
96
+ </tr>
97
+ <tr>
98
+ <td width="200">
99
+ <a href="https://birdproxies.com/t/scrapling" target="_blank" title="At Bird Proxies, we eliminate your pains such as banned IPs, geo restriction, and high costs so you can focus on your work.">
100
+ <img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/BirdProxies.jpg">
101
+ <br />
102
+ </a>
103
+ </td>
104
+ <td>프록시는 복잡하거나 비쌀 이유가 없다는 생각으로 <a href="https://birdproxies.com/t/scrapling">
105
+ <b>BirdProxies</b>
106
+ </a>를 만들었습니다. <br /> 195개 이상 지역의 빠른 레지덴셜 및 ISP 프록시, 합리적인 가격, 실질적인 지원. <br />
107
+ <b>랜딩 페이지에서 FlappyBird 게임을 플레이하고 무료 데이터를 받으세요!</b>
108
+ </td>
109
+ </tr>
110
+ <tr>
111
+ <td width="200">
112
+ <a href="https://evomi.com?utm_source=github&utm_medium=banner&utm_campaign=d4vinci-scrapling" target="_blank" title="Evomi is your Swiss Quality Proxy Provider, starting at $0.49/GB">
113
+ <img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/evomi.png">
114
+ <br />
115
+ </a>
116
+ </td>
117
+ <td>
118
+ <a href="https://evomi.com?utm_source=github&utm_medium=banner&utm_campaign=d4vinci-scrapling">
119
+ <b>Evomi</b>
120
+ </a>: 레지덴셜 프록시 GB당 $0.49부터. 완전히 위장된 Chromium 스크레이핑 브라우저, 레지덴셜 IP, 자동 CAPTCHA 해결, 안티봇 우회.</br>
121
+ <b>Scraper API로 번거로움 없이 결과를 얻으세요. MCP 및 N8N 통합 지원.</b>
122
+ </td>
123
+ </tr>
124
+ <tr>
125
+ <td width="200">
126
+ <a href="https://tikhub.io/?ref=KarimShoair" target="_blank" title="Unlock the Power of Social Media Data & AI">
127
+ <img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/TikHub.jpg">
128
+ <br />
129
+ </a>
130
+ </td>
131
+ <td>
132
+ <a href="https://tikhub.io/?ref=KarimShoair" target="_blank">TikHub.io</a>는 TikTok, X, YouTube, Instagram 등 16개 이상 플랫폼에서 900개 이상의 안정적인 API를 제공하며, 4,000만 이상의 데이터셋을 보유하고 있습니다. <br /> <a href="https://ai.tikhub.io/?ref=KarimShoair" target="_blank">할인된 AI 모델</a>도 제공 — Claude, GPT, GEMINI 등 최대 71% 할인.
133
+ </td>
134
+ </tr>
135
+ <tr>
136
+ <td width="200">
137
+ <a href="https://www.nsocks.com/?keyword=2p67aivg" target="_blank" title="Scalable Web Data Access for AI Applications">
138
+ <img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/nsocks.png">
139
+ <br />
140
+ </a>
141
+ </td>
142
+ <td>
143
+ <a href="https://www.nsocks.com/?keyword=2p67aivg" target="_blank">Nsocks</a>는 개발자와 스크레이퍼를 위한 빠른 레지덴셜 및 ISP 프록시를 제공합니다. 글로벌 IP 커버리지, 높은 익명성, 스마트 로테이션, 자동화와 데이터 추출을 위한 안정적인 성능. <a href="https://www.xcrawl.com/?keyword=2p67aivg" target="_blank">Xcrawl</a>로 대규모 웹 크롤링을 간소화하세요.
144
+ </td>
145
+ </tr>
146
+ </table>
147
+
148
+ <i><sub>여기에 광고를 게재하고 싶으신가요? [여기](https://github.com/sponsors/D4Vinci/sponsorships?tier_id=586646)를 클릭하세요</sub></i>
149
+ # 스폰서
150
+
151
+ <!-- sponsors -->
152
+
153
+ <a href="https://petrosky.io/d4vinci" target="_blank" title="PetroSky delivers cutting-edge VPS hosting."><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/petrosky.png"></a>
154
+
155
+ <a href="https://serpapi.com/?utm_source=scrapling" target="_blank" title="Scrape Google and other search engines with SerpApi"><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/SerpApi.png"></a>
156
+ <a href="https://visit.decodo.com/Dy6W0b" target="_blank" title="Try the Most Efficient Residential Proxies for Free"><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/decodo.png"></a>
157
+ <a href="https://hasdata.com/?utm_source=github&utm_medium=banner&utm_campaign=D4Vinci" target="_blank" title="The web scraping service that actually beats anti-bot systems!"><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/hasdata.png"></a>
158
+ <a href="https://proxyempire.io/?ref=scrapling&utm_source=scrapling" target="_blank" title="Collect The Data Your Project Needs with the Best Residential Proxies"><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/ProxyEmpire.png"></a><a href="https://www.swiftproxy.net/" target="_blank" title="Unlock Reliable Proxy Services with Swiftproxy!"><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/swiftproxy.png"></a>
159
+ <a href="https://www.rapidproxy.io/?ref=d4v" target="_blank" title="Affordable Access to the Proxy World – bypass CAPTCHAs blocks, and avoid additional costs."><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/rapidproxy.jpg"></a>
160
+ <a href="https://browser.cash/?utm_source=D4Vinci&utm_medium=referral" target="_blank" title="Browser Automation & AI Browser Agent Platform"><img src="https://raw.githubusercontent.com/D4Vinci/Scrapling/main/images/browserCash.png"></a>
161
+
162
+ <!-- /sponsors -->
163
+
164
+ <i><sub>여기에 광고를 게재하고 싶으신가요? [여기](https://github.com/sponsors/D4Vinci)를 클릭하고 원하는 티어를 선택하세요!</sub></i>
165
+
166
+ ---
167
+
168
+ ## 주요 기능
169
+
170
+ ### Spider — 본격적인 크롤링 프레임워크
171
+ - 🕷️ **Scrapy 스타일 Spider API**: `start_urls`, 비동기 `parse` 콜백, `Request`/`Response` 객체로 Spider를 정의합니다.
172
+ - ⚡ **동시 크롤링**: 설정 가능한 동시 요청 수 제한, 도메인별 스로틀링, 다운로드 딜레이를 지원합니다.
173
+ - 🔄 **멀티 세션 지원**: HTTP 요청과 스텔스 헤드리스 브라우저를 하나의 인터페이스로 통합 — ID로 요청을 다른 세션에 라우팅합니다.
174
+ - 💾 **일시정지 & 재개**: 체크포인트 기반의 크롤링 영속화. Ctrl+C로 정상 종료하고, 재시작하면 중단된 지점부터 이어갑니다.
175
+ - 📡 **스트리밍 모드**: `async for item in spider.stream()`으로 스크레이핑된 아이템을 실시간 통계와 함께 스트리밍으로 수신 — UI, 파이프라인, 장시간 크롤링에 적합합니다.
176
+ - 🛡️ **차단된 요청 감지**: 커스텀 로직을 통한 차단된 요청의 자동 감지 및 재시도를 지원합니다.
177
+ - 📦 **내장 내보내기**: 훅이나 자체 파이프라인, 또는 내장 JSON/JSONL로 결과를 내보냅니다. 각각 `result.items.to_json()` / `result.items.to_jsonl()`을 사용합니다.
178
+
179
+ ### 세션을 지원하는 고급 웹사이트 가져오기
180
+ - **HTTP 요청**: `Fetcher` 클래스로 빠르고 은밀한 HTTP 요청. 브라우저의 TLS fingerprint, 헤더를 모방하고, HTTP/3를 사용할 수 있습니다.
181
+ - **동적 로딩**: Playwright의 Chromium과 Google Chrome을 지원하는 `DynamicFetcher` 클래스로 완전한 브라우저 자동화를 통해 동적 웹사이트를 가져옵니다.
182
+ - **안티봇 우회**: `StealthyFetcher`와 fingerprint 위장을 통한 고급 스텔스 기능. 자동화로 모든 유형의 Cloudflare Turnstile/Interstitial을 손쉽게 우회합니다.
183
+ - **세션 관리**: `FetcherSession`, `StealthySession`, `DynamicSession` 클래스로 요청 간 쿠키와 상태를 관리하는 영속적 세션을 지원합니다.
184
+ - **프록시 로테이션**: 모든 세션 타입에 대응하는 순환 또는 커스텀 전략의 내장 `ProxyRotator`와 요청별 프록시 오버라이드를 제공합니다.
185
+ - **도메인 차단**: 브라우저 기반 Fetcher에서 특정 도메인(및 하위 도메인)으로의 요청을 차단합니다.
186
+ - **비동기 지원**: 모든 Fetcher와 전용 비동기 세션 클래스에서 완전한 비동기를 지원합니다.
187
+
188
+ ### 적응형 스크레이핑 & AI 통합
189
+ - 🔄 **스마트 요소 추적**: 지능적인 유사도 알고리즘으로 웹사이트 변경 후에도 요소를 재배치합니다.
190
+ - 🎯 **유연한 스마트 선택**: CSS selector, XPath selector, 필터 기반 검색, 텍스트 검색, 정규식 검색 등을 지원합니다.
191
+ - 🔍 **유사 요소 찾기**: 발견된 요소와 유사한 요소를 자동으로 찾아냅니다.
192
+ - 🤖 **AI와 함께 사용하는 MCP 서버**: AI 기반 Web Scraping과 데이터 추출을 위한 내장 MCP 서버. AI(Claude/Cursor 등)에 전달하기 전에 Scrapling을 활용해 대상 콘텐츠를 추출하는 강력한 커스텀 기능을 갖추고 있어, 작업 속도를 높이고 토큰 사용량을 최소화해 비용을 절감합니다. ([데모 영상](https://www.youtube.com/watch?v=qyFk3ZNwOxE))
193
+
194
+ ### 고성능 & 실전 검증된 아키텍처
195
+ - 🚀 **초고속**: 대부분의 Python 스크레이핑 라이브러리를 능가하는 최적화된 성능.
196
+ - 🔋 **메모리 효율**: 최적화된 데이터 구조와 지연 로딩으로 메모리 사용을 최소화합니다.
197
+ - ⚡ **고속 JSON 직렬화**: 표준 라이브러리보다 10배 빠릅니다.
198
+ - 🏗️ **실전 검증**: Scrapling은 92%의 테스트 커버리지와 완전한 타입 힌트 커버리지를 갖추고 있을 뿐 아니라, 지난 1년간 수백 명의 Web Scraper가 매일 사용해 왔습니다.
199
+
200
+ ### 개발자/Web Scraper 친화적 경험
201
+ - 🎯 **인터랙티브 Web Scraping Shell**: Scrapling 통합, 단축키, curl 요청을 Scrapling 요청으로 변환하거나 브라우저에서 요청 결과를 확인하는 등의 도구를 갖춘 선택적 내장 IPython Shell로, Web Scraping 스크립트 개발을 가속합니다.
202
+ - 🚀 **터미널에서 바로 사용**: 코드 한 줄 없이 Scrapling으로 URL을 스크레이핑할 수 있습니다!
203
+ - 🛠️ **풍부한 내비게이션 API**: 부모, 형제, 자식 탐색 메서드를 통한 고급 DOM 순회를 지원합니다.
204
+ - 🧬 **향상된 텍스트 처리**: 내장 정규식, 클리닝 메서드, 최적화된 문자열 연산을 제공합니다.
205
+ - 📝 **자동 셀렉터 생성**: 모든 요소에 대해 견고한 CSS/XPath selector를 생성합니다.
206
+ - 🔌 **익숙한 API**: Scrapy/Parsel에서 사용하는 것과 동일한 의사 요소(pseudo-element)를 가진 Scrapy/BeautifulSoup 스타일의 API.
207
+ - 📘 **완전한 타입 커버리지**: 뛰어난 IDE 지원과 코드 자동완성을 위한 완전한 타입 힌트. 코드베이스 전체가 변경될 때마다 **PyRight**와 **MyPy**로 자동 검사됩니다.
208
+ - 🔋 **바로 사용 가능한 Docker 이미지**: 매 릴리스마다 모든 브라우저를 포함한 Docker 이미지가 자동으로 빌드 및 푸시됩니다.
209
+
210
+ ## 시작하기
211
+
212
+ 깊이 들어가지 않고, Scrapling이 할 수 있는 것들을 간단히 살펴보겠습니다.
213
+
214
+ ### 기본 사용법
215
+ 세션을 지원하는 HTTP 요청
216
+ ```python
217
+ from scrapling.fetchers import Fetcher, FetcherSession
218
+
219
+ with FetcherSession(impersonate='chrome') as session: # Chrome의 최신 TLS fingerprint 사용
220
+ page = session.get('https://quotes.toscrape.com/', stealthy_headers=True)
221
+ quotes = page.css('.quote .text::text').getall()
222
+
223
+ # 또는 일회성 요청 사용
224
+ page = Fetcher.get('https://quotes.toscrape.com/')
225
+ quotes = page.css('.quote .text::text').getall()
226
+ ```
227
+ 고급 스텔스 모드
228
+ ```python
229
+ from scrapling.fetchers import StealthyFetcher, StealthySession
230
+
231
+ with StealthySession(headless=True, solve_cloudflare=True) as session: # 작업이 끝날 때까지 브라우저를 열어둡니다
232
+ page = session.fetch('https://nopecha.com/demo/cloudflare', google_search=False)
233
+ data = page.css('#padded_content a').getall()
234
+
235
+ # 또는 일회성 요청 스타일 — 이 요청을 위해 브라우저를 열고, 완료 후 닫습니다
236
+ page = StealthyFetcher.fetch('https://nopecha.com/demo/cloudflare')
237
+ data = page.css('#padded_content a').getall()
238
+ ```
239
+ 완전한 브라우저 자동화
240
+ ```python
241
+ from scrapling.fetchers import DynamicFetcher, DynamicSession
242
+
243
+ with DynamicSession(headless=True, disable_resources=False, network_idle=True) as session: # 작업이 끝날 때까지 브라우저를 열어둡니다
244
+ page = session.fetch('https://quotes.toscrape.com/', load_dom=False)
245
+ data = page.xpath('//span[@class="text"]/text()').getall() # 원하시면 XPath selector도 사용 가능
246
+
247
+ # 또는 일회성 요청 스타일 — 이 요청을 위해 브라우저를 열고, 완료 후 닫습니다
248
+ page = DynamicFetcher.fetch('https://quotes.toscrape.com/')
249
+ data = page.css('.quote .text::text').getall()
250
+ ```
251
+
252
+ ### Spider
253
+ 동시 요청, 여러 세션 타입, 일시정지 & 재개를 갖춘 본격적인 크롤러 구축:
254
+ ```python
255
+ from scrapling.spiders import Spider, Request, Response
256
+
257
+ class QuotesSpider(Spider):
258
+ name = "quotes"
259
+ start_urls = ["https://quotes.toscrape.com/"]
260
+ concurrent_requests = 10
261
+
262
+ async def parse(self, response: Response):
263
+ for quote in response.css('.quote'):
264
+ yield {
265
+ "text": quote.css('.text::text').get(),
266
+ "author": quote.css('.author::text').get(),
267
+ }
268
+
269
+ next_page = response.css('.next a')
270
+ if next_page:
271
+ yield response.follow(next_page[0].attrib['href'])
272
+
273
+ result = QuotesSpider().start()
274
+ print(f"{len(result.items)}개의 인용구를 스크레이핑했습니다")
275
+ result.items.to_json("quotes.json")
276
+ ```
277
+ 하나의 Spider에서 여러 세션 타입 사용:
278
+ ```python
279
+ from scrapling.spiders import Spider, Request, Response
280
+ from scrapling.fetchers import FetcherSession, AsyncStealthySession
281
+
282
+ class MultiSessionSpider(Spider):
283
+ name = "multi"
284
+ start_urls = ["https://example.com/"]
285
+
286
+ def configure_sessions(self, manager):
287
+ manager.add("fast", FetcherSession(impersonate="chrome"))
288
+ manager.add("stealth", AsyncStealthySession(headless=True), lazy=True)
289
+
290
+ async def parse(self, response: Response):
291
+ for link in response.css('a::attr(href)').getall():
292
+ # 보호된 페이지는 스텔스 세션을 통��� 라우팅
293
+ if "protected" in link:
294
+ yield Request(link, sid="stealth")
295
+ else:
296
+ yield Request(link, sid="fast", callback=self.parse) # 명시적 콜백
297
+ ```
298
+ 체크포인트를 사용해 장시간 크롤링을 일시정지 & 재개:
299
+ ```python
300
+ QuotesSpider(crawldir="./crawl_data").start()
301
+ ```
302
+ Ctrl+C를 누르면 정상적으로 일시정지되고, 진행 상황이 자동 저장됩니다. 이후 Spider를 다시 시작할 때 동일한 `crawldir`을 전달하면 중단된 지점부터 재개합니다.
303
+
304
+ ### 고급 파싱 & 내비게이션
305
+ ```python
306
+ from scrapling.fetchers import Fetcher
307
+
308
+ # 풍부한 요소 선택과 내비게이션
309
+ page = Fetcher.get('https://quotes.toscrape.com/')
310
+
311
+ # 여러 선택 메서드로 인용구 가져오기
312
+ quotes = page.css('.quote') # CSS selector
313
+ quotes = page.xpath('//div[@class="quote"]') # XPath
314
+ quotes = page.find_all('div', {'class': 'quote'}) # BeautifulSoup 스타일
315
+ # 아래와 동일
316
+ quotes = page.find_all('div', class_='quote')
317
+ quotes = page.find_all(['div'], class_='quote')
318
+ quotes = page.find_all(class_='quote') # 등등...
319
+ # 텍스트 내용으로 요소 찾기
320
+ quotes = page.find_by_text('quote', tag='div')
321
+
322
+ # 고급 내비게이션
323
+ quote_text = page.css('.quote')[0].css('.text::text').get()
324
+ quote_text = page.css('.quote').css('.text::text').getall() # 체이닝 셀렉터
325
+ first_quote = page.css('.quote')[0]
326
+ author = first_quote.next_sibling.css('.author::text')
327
+ parent_container = first_quote.parent
328
+
329
+ # 요소 관계와 유사도
330
+ similar_elements = first_quote.find_similar()
331
+ below_elements = first_quote.below_elements()
332
+ ```
333
+ 웹사이트를 가져오지 않고 파서를 바로 사용할 수도 있습니다:
334
+ ```python
335
+ from scrapling.parser import Selector
336
+
337
+ page = Selector("<html>...</html>")
338
+ ```
339
+ 사용법은 완전히 동일합니다!
340
+
341
+ ### 비동기 세션 관리 예시
342
+ ```python
343
+ import asyncio
344
+ from scrapling.fetchers import FetcherSession, AsyncStealthySession, AsyncDynamicSession
345
+
346
+ async with FetcherSession(http3=True) as session: # `FetcherSession`은 컨텍스트 인식이 가능하며 동기/비동기 패턴 모두에서 작동
347
+ page1 = session.get('https://quotes.toscrape.com/')
348
+ page2 = session.get('https://quotes.toscrape.com/', impersonate='firefox135')
349
+
350
+ # 비동기 세션 사용
351
+ async with AsyncStealthySession(max_pages=2) as session:
352
+ tasks = []
353
+ urls = ['https://example.com/page1', 'https://example.com/page2']
354
+
355
+ for url in urls:
356
+ task = session.fetch(url)
357
+ tasks.append(task)
358
+
359
+ print(session.get_pool_stats()) # 선택 사항 - 브라우저 탭 풀 상태 (사용 중/유휴/에러)
360
+ results = await asyncio.gather(*tasks)
361
+ print(session.get_pool_stats())
362
+ ```
363
+
364
+ ## CLI & 인터랙티브 Shell
365
+
366
+ Scrapling에는 강력한 커맨드라인 인터페이스가 포함되어 있습니다:
367
+
368
+ [![asciicast](https://asciinema.org/a/736339.svg)](https://asciinema.org/a/736339)
369
+
370
+ 인터랙티브 Web Scraping Shell 실행
371
+ ```bash
372
+ scrapling shell
373
+ ```
374
+ 프로그래밍 없이 페이지를 파일로 바로 추출합니다 (기본적으로 `body` 태그 내부의 콘텐츠를 추출). 출력 파일이 `.txt`로 끝나면 대상의 텍스트 콘텐츠가 추출됩니다. `.md`로 끝나면 HTML 콘텐츠의 Markdown 표현이 됩니다. `.html`로 끝나면 HTML 콘텐츠 자체가 됩니다.
375
+ ```bash
376
+ scrapling extract get 'https://example.com' content.md
377
+ scrapling extract get 'https://example.com' content.txt --css-selector '#fromSkipToProducts' --impersonate 'chrome' # CSS selector '#fromSkipToProducts'에 매칭되는 모든 요소
378
+ scrapling extract fetch 'https://example.com' content.md --css-selector '#fromSkipToProducts' --no-headless
379
+ scrapling extract stealthy-fetch 'https://nopecha.com/demo/cloudflare' captchas.html --css-selector '#padded_content a' --solve-cloudflare
380
+ ```
381
+
382
+ > [!NOTE]
383
+ > MCP 서버와 인터랙티브 Web Scraping Shell 등 더 많은 기능이 있지만, 이 페이지는 간결하게 유지하겠습니다. 전체 문서는 [여기](https://scrapling.readthedocs.io/en/latest/)에서 확인하세요.
384
+
385
+ ## 성능 벤치마크
386
+
387
+ Scrapling은 강력할 뿐만 아니라 초고속입니다. 아래 벤치마크는 Scrapling의 파서를 다른 인기 라이브러리의 최신 버전과 비교한 것입니다.
388
+
389
+ ### 텍스트 추출 속도 테스트 (5000개 중첩 요소)
390
+
391
+ | # | Library | Time (ms) | vs Scrapling |
392
+ |---|:-----------------:|:---------:|:------------:|
393
+ | 1 | Scrapling | 2.02 | 1.0x |
394
+ | 2 | Parsel/Scrapy | 2.04 | 1.01 |
395
+ | 3 | Raw Lxml | 2.54 | 1.257 |
396
+ | 4 | PyQuery | 24.17 | ~12x |
397
+ | 5 | Selectolax | 82.63 | ~41x |
398
+ | 6 | MechanicalSoup | 1549.71 | ~767.1x |
399
+ | 7 | BS4 with Lxml | 1584.31 | ~784.3x |
400
+ | 8 | BS4 with html5lib | 3391.91 | ~1679.1x |
401
+
402
+
403
+ ### 요소 유사도 & 텍스트 검색 성능
404
+
405
+ Scrapling의 적응형 요소 찾기 기능은 대���들을 크게 앞섭니다:
406
+
407
+ | Library | Time (ms) | vs Scrapling |
408
+ |-------------|:---------:|:------------:|
409
+ | Scrapling | 2.39 | 1.0x |
410
+ | AutoScraper | 12.45 | 5.209x |
411
+
412
+
413
+ > 모든 벤치마크는 100회 이상 실행의 평균입니다. 측정 방법은 [benchmarks.py](https://github.com/D4Vinci/Scrapling/blob/main/benchmarks.py)를 참조하세요.
414
+
415
+ ## 설치
416
+
417
+ Scrapling은 Python 3.10 이상이 필요합니다:
418
+
419
+ ```bash
420
+ pip install scrapling
421
+ ```
422
+
423
+ 이 설치에는 파서 엔진과 의존성만 포함되며, Fetcher나 커맨드라인 의존성은 포함되지 않습니다.
424
+
425
+ ### 선택적 의존성
426
+
427
+ 1. 아래의 추가 기능, Fetcher, 또는 관련 클래스를 사용하려면 Fetcher 의존성과 브라우저 의존성을 다음과 같이 설치해야 합니다:
428
+ ```bash
429
+ pip install "scrapling[fetchers]"
430
+
431
+ scrapling install # 일반 설치
432
+ scrapling install --force # 강제 재설치
433
+ ```
434
+
435
+ 이렇게 하면 모든 브라우저와 시스템 의존성, fingerprint 조작 의존성이 다운로드됩니다.
436
+
437
+ 또는 명령어 대신 코드에서 설치할 수도 있습니다:
438
+ ```python
439
+ from scrapling.cli import install
440
+
441
+ install([], standalone_mode=False) # 일반 설치
442
+ install(["--force"], standalone_mode=False) # 강제 재설치
443
+ ```
444
+
445
+ 2. 추가 기능:
446
+ - MCP 서버 기능 설치:
447
+ ```bash
448
+ pip install "scrapling[ai]"
449
+ ```
450
+ - Shell 기능 (Web Scraping Shell 및 `extract` 명령어) 설치:
451
+ ```bash
452
+ pip install "scrapling[shell]"
453
+ ```
454
+ - 모든 기능 설치:
455
+ ```bash
456
+ pip install "scrapling[all]"
457
+ ```
458
+ 위 추가 기능을 설치한 후에도 (아직 하지 않았다면) `scrapling install`로 브라우저 의존성을 설치해야 합니다.
459
+
460
+ ### Docker
461
+ DockerHub에서 모든 추가 기능과 브라우저가 포함된 Docker 이미지를 설치할 수도 있습니다:
462
+ ```bash
463
+ docker pull pyd4vinci/scrapling
464
+ ```
465
+ 또는 GitHub 레지스트리에서 다운로드:
466
+ ```bash
467
+ docker pull ghcr.io/d4vinci/scrapling:latest
468
+ ```
469
+ 이 이미지는 GitHub Actions와 레포지토리의 main 브랜치를 사용하여 자동으로 빌드 및 푸시됩니다.
470
+
471
+ ## 기여하기
472
+
473
+ 기여를 환영합니다! 시작하기 전에 [기여 가이드라인](https://github.com/D4Vinci/Scrapling/blob/main/CONTRIBUTING.md)을 읽어주세요.
474
+
475
+ ## 면책 조항
476
+
477
+ > [!CAUTION]
478
+ > 이 라이브러리는 교육 및 연구 목적으로만 제공됩니다. 이 라이브러리를 사용함으로써, 국내외 데이터 스크레이핑 및 개인정보 보호 관련 법률을 준수하는 데 동의한 것으로 간주됩니다. 저자와 기여자는 이 소프트웨어의 오용에 대해 책임지지 않습니다. 항상 웹사이트의 이용약관과 robots.txt 파일을 존중하세요.
479
+
480
+ ## 🎓 인용
481
+ 연구 목적으로 이 라이브러리를 사용하셨다면, 아래 참고 문헌으로 인용해 주세요:
482
+ ```text
483
+ @misc{scrapling,
484
+ author = {Karim Shoair},
485
+ title = {Scrapling},
486
+ year = {2024},
487
+ url = {https://github.com/D4Vinci/Scrapling},
488
+ note = {An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!}
489
+ }
490
+ ```
491
+
492
+ ## 라이선스
493
+
494
+ 이 프로젝트는 BSD-3-Clause 라이선스 하에 배포됩니다.
495
+
496
+ ## 감사의 말
497
+
498
+ 이 프로젝트에는 다음에서 차용한 코드가 포함되어 있습니다:
499
+ - Parsel (BSD 라이선스) — [translator](https://github.com/D4Vinci/Scrapling/blob/main/scrapling/core/translator.py) 서브모듈에 사용
500
+
501
+ ---
502
+ <div align="center"><small>Karim Shoair가 ❤️으로 디자인하고 만들었습니다.</small></div><br>