
Scrapling v0.4.13
๐ท๏ธ ์ ์ํ ์น ์คํฌ๋ํ ํ๋ ์์ํฌ๋ก, ๋จ์ผ ์์ฒญ๋ถํฐ ์ ์ฒด ๊ท๋ชจ ํฌ๋กค๋ง๊น์ง ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํฉ๋๋ค!
Effortless Web Scraping for the Modern Web
์ ํ ๋ฉ์๋ ยท Fetcher ์ ํ ๊ฐ์ด๋ ยท Spider ยท ํ๋ก์ ๋กํ ์ด์ ยท CLI ยท MCP ์๋ฒ
Scrapling์ ๋จ์ผ ์์ฒญ๋ถํฐ ๋๊ท๋ชจ ํฌ๋กค๋ง๊น์ง ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ๋ ์ ์ํ Web Scraping ํ๋ ์์ํฌ์ ๋๋ค.
ํ์๋ ์น์ฌ์ดํธ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ตํ๊ณ , ํ์ด์ง๊ฐ ์ ๋ฐ์ดํธ๋๋ฉด ์์๋ฅผ ์๋์ผ๋ก ์ฌ๋ฐฐ์นํฉ๋๋ค. Fetcher๋ Cloudflare Turnstile ๊ฐ์ ์ํฐ๋ด ์์คํ ์ ๋ณ๋ ์ค์ ์์ด ์ฐํํฉ๋๋ค. Spider ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ์์ ์ง/์ฌ๊ฐ ๋ฐ ์๋ ํ๋ก์ ๋กํ ์ด์ ์ ๊ฐ์ถ ๋์ ๋ฉํฐ ์ธ์ ํฌ๋กค๋ง์ผ๋ก ํ์ฅํ ์ ์์ต๋๋ค - ๋ชจ๋ Python ๋ช ์ค์ด๋ฉด ๋ฉ๋๋ค. ํ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํํ ์๋ ์ฑ๋ฅ.
์ค์๊ฐ ํต๊ณ์ ์คํธ๋ฆฌ๋ฐ์ ํตํ ์ด๊ณ ์ ํฌ๋กค๋ง. Web Scraper๊ฐ ๋ง๋ค๊ณ , Web Scraper์ ์ผ๋ฐ ์ฌ์ฉ์ ๋ชจ๋๋ฅผ ์ํด ์ค๊ณํ์ต๋๋ค.
from scrapling.fetchers import Fetcher, AsyncFetcher, StealthyFetcher, DynamicFetcher
StealthyFetcher.adaptive = True
p = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # ํ์ง๋ฅผ ํผํด ์น์ฌ์ดํธ๋ฅผ ๊ฐ์ ธ์ต๋๋ค!
products = p.css('.product', auto_save=True) # ์น์ฌ์ดํธ ๋์์ธ ๋ณ๊ฒฝ์๋ ์ด์๋จ๋ ๋ฐ์ดํฐ๋ฅผ ์คํฌ๋ ์ดํ!
products = p.css('.product', adaptive=True) # ๋์ค์ ์น์ฌ์ดํธ ๊ตฌ์กฐ๊ฐ ๋ฐ๋๋ฉด, `adaptive=True`๋ฅผ ์ ๋ฌํด์ ์ฐพ์ผ์ธ์!
๋๋ ๋ณธ๊ฒฉ์ ์ธ ํฌ๋กค๋ง์ผ๋ก ํ์ฅ
from scrapling.spiders import Spider, Response
class MySpider(Spider):
name = "demo"
start_urls = ["https://example.com/"]
async def parse(self, response: Response):
for item in response.css('.product'):
yield {"title": item.css('h2::text').get()}
MySpider().start()