docs: Add Korean (한국어) README translation
Browse files- README.md +1 -1
- 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 |
+
·
|
| 39 |
+
<a href="https://scrapling.readthedocs.io/en/latest/fetching/choosing/"><strong>Fetcher 선택 가이드</strong></a>
|
| 40 |
+
·
|
| 41 |
+
<a href="https://scrapling.readthedocs.io/en/latest/spiders/architecture.html"><strong>Spider</strong></a>
|
| 42 |
+
·
|
| 43 |
+
<a href="https://scrapling.readthedocs.io/en/latest/spiders/proxy-blocking.html"><strong>프록시 로테이션</strong></a>
|
| 44 |
+
·
|
| 45 |
+
<a href="https://scrapling.readthedocs.io/en/latest/cli/overview/"><strong>CLI</strong></a>
|
| 46 |
+
·
|
| 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 |
+
[](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>
|