์๋
ํ์ธ์!
์ค๋์ Python ๊ธฐ๋ฐ ์น ํฌ๋กค๋ง ๋ฐ ์คํฌ๋ํ ๋๊ตฌ ์ค์์ ๊ฐ์ฅ ๊ฐ๋ ฅํ๊ณ ๋๋ฆฌ ์ฌ์ฉ๋๋ Scrapy์ ๋ํด ๊น์ด ์๊ฒ ์์๋ณด๊ฒ ์ต๋๋ค. ๋ง์ฝ ์ฌ๋ฌ๋ถ์ด ์น์์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์์งํ๊ณ ์ถ๋ค๋ฉด, Scrapy๋ ๊ผญ ์์์ผ ํ ๋๊ตฌ์
๋๋ค.
โจ Scrapy๋ ๋ฌด์์ธ๊ฐ?
Scrapy๋ ์น์ฌ์ดํธ์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์์งํ๊ณ ๊ตฌ์กฐํ๋ ํํ๋ก ์ ์ฅํ ์ ์๋๋ก ๋๋ ์คํ์์ค ์น ํฌ๋กค๋ง ํ๋ ์์ํฌ์
๋๋ค.
2008๋
์ ์ฒ์ ๊ณต๊ฐ๋์ด ์ง๊ธ๊น์ง ํ๋ฐํ๊ฒ ์ ์ง/๊ฐ๋ฐ๋๊ณ ์์ผ๋ฉฐ, ํนํ ๋์ฉ๋ ๋ฐ์ดํฐ ์์ง ์์
์์ ๊ทธ ์ง๊ฐ๋ฅผ ๋ฐํํฉ๋๋ค.
๐ง ์ Scrapy์ธ๊ฐ?
Scrapy๋ ๋จ์ํ HTML ํ์๋ ๋จ๋ฐ์ฑ ์์ง ์คํฌ๋ฆฝํธ์๋ ๋ค๋ฆ
๋๋ค.
์น ํฌ๋กค๋ง ์ ๋ฐ์ ํ๋ฆ์ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ์ค๊ณํ ์ ์๊ณ , ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์์ต๋๋ค:
โ ์ฃผ์ ์ฅ์
์ฅ์ | ์ค๋ช |
---|---|
๋น ๋ฅธ ์๋ | ๋น๋๊ธฐ ๊ธฐ๋ฐ์ผ๋ก ์์ฒ ๊ฐ์ ์์ฒญ์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ |
ํ์ฅ์ฑ | ๋ฏธ๋ค์จ์ด, ํ์ดํ๋ผ์ธ, ์๊ทธ๋ ๋ฑ ํ์ฅ ๊ตฌ์กฐ ์ ๊ณต |
ํจ์จ์ ์ธ ์์ ์ฌ์ฉ | ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ๋ฐ CPU ํจ์จ์ฑ ์ฐ์ |
๊ตฌ์กฐํ๋ ์ถ๋ ฅ | JSON, CSV, XML ๋ฑ ๋ค์ํ ํํ๋ก ์ ์ฅ ๊ฐ๋ฅ |
ํ ์คํธ ๋ฐ ๋๋ฒ๊น ์ฉ์ด | ๋ก๊ทธ, ์, ํฌ๋กค๋ง ํต๊ณ ๋ฑ ํ๋ถํ ๋๊ตฌ ์ ๊ณต |
๐งฉ Scrapy์ ๋ด๋ถ ๊ตฌ์ฑ ์์
Scrapy๋ ๋ค์ํ ์ปดํฌ๋ํธ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ๊ฐ ๋ถ๋ถ์ด ์ญํ ์ ๋ถ๋ดํ์ฌ ์๋ํฉ๋๋ค.
๊ตฌ์ฑ ์์ | ์ญํ |
---|---|
Spider | ํฌ๋กค๋งํ URL๊ณผ ๋ฐ์ดํฐ ์ถ์ถ ๋ก์ง ์ ์ |
Scheduler | ์์ฒญ(request)๋ค์ ํ์ ์ ์ฅํ๊ณ ๊ด๋ฆฌ |
Downloader | ์น ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ์์ |
Item | ์์งํ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ ์ ์ |
Pipeline | ์์ง๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ ์ฅ |
Middleware | ์์ฒญ/์๋ต์ ์ค๊ฐ์์ ๊ฐ๊ณตํ๊ฑฐ๋ ํํฐ๋ง |
๐ง ์ค์น ๋ฐ ํ๋ก์ ํธ ์์ฑ
# Scrapy ์ค์น
pip install scrapy
# ์ ํ๋ก์ ํธ ์์ฑ
scrapy startproject myproject
# ์คํ์ด๋ ์์ฑ
cd myproject
scrapy genspider example example.com
๐ธ๏ธ ๊ฐ๋จํ ์คํ์ด๋ ์์
์๋๋ ๋ด์ค ์ฌ์ดํธ์์ ๊ธฐ์ฌ ์ ๋ชฉ์ ์์งํ๋ ๊ฐ๋จํ ์์ ์ ๋๋ค.
import scrapy
class NewsSpider(scrapy.Spider):
name = "news"
start_urls = ["https://news.ycombinator.com/"]
def parse(self, response):
for title in response.css(".storylink"):
yield {
"title": title.css("::text").get(),
"url": title.css("::attr(href)").get()
}
์คํ์ ๋ค์๊ณผ ๊ฐ์ด ํฉ๋๋ค:
scrapy crawl news -o news.json
๐ ๊ฒฐ๊ณผ๋ news.json
ํ์ผ์ ์ ์ฅ๋ฉ๋๋ค.
๐ ์ค๋ฌด์ ์ ์ฉํ Scrapy ๊ธฐ๋ฅ
1. CSS Selector์ XPath ์ง์
์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ตํ๊ฒ ์ถ์ถ ๊ฐ๋ฅ
2. ์๋ ์ค๋ณต ์์ฒญ ๋ฐฉ์ง
์ด๋ฏธ ๋ฐฉ๋ฌธํ URL์ ์๋์ผ๋ก ์ ์ธ
3. User-Agent ๋ฐ ํ๋ก์ ์ค์
์ํฐ์คํฌ๋ํ ํํผ ๊ฐ๋ฅ
USER_AGENT = "Mozilla/5.0 ..."
DOWNLOAD_DELAY = 1 # ์๋ฒ ๊ณผ๋ถํ ๋ฐฉ์ง
4. ๋ฏธ๋ค์จ์ด(Middleware)
์ฟ ํค, ์ธ์ฆ ํ ํฐ, ํ๋ก์ ๋กํ ์ด์ ๋ฑ ์ค๊ฐ ์์ฒญ ๊ฐ๊ณต
โ ๋จ์ ๋ ์๋ค?
๋จ์ | ์ค๋ช |
---|---|
ํ์ต ๊ณก์ | ์ด๋ณด์์๊ฒ๋ ๊ตฌ์กฐ๊ฐ ๋ณต์กํ๊ฒ ๋๊ปด์ง ์ ์์ |
๋์ ์ฝํ ์ธ ์ด๋ ค์ | JS ๊ธฐ๋ฐ ํ์ด์ง ํฌ๋กค๋ง์ ๋ณ๋ ํด(Splash, Playwright ๋ฑ) ํ์ |
UI ์์ | GUI๊ฐ ์๊ณ CLI ์ค์ฌ์ด๋ผ ์ต์ํ์ง ์์ ๋ถ๋ค์ ๋ถํธํ ์ ์์ |
๐งช ๋์ ์น์ฌ์ดํธ๋ ๊ฐ๋ฅํ ๊น?
Scrapy๋ง์ผ๋ก๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ํ์ํ ํ์ด์ง์์ ๋ฐ์ดํฐ ์์ง์ด ์ด๋ ต์ต๋๋ค.
์ด๋ด ๋ Splash๋ Playwright + scrapy-playwright๋ฅผ ์ฐ๋ํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.
pip install scrapy-playwright
์ค์ ์:
DOWNLOAD_HANDLERS = {
"http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
"https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
}
๐ฆ Scrapy์ ํ์ฉ ์ฌ๋ก
- ์ผํ๋ชฐ ์ํ ์ ๋ณด ์์ง (๊ฐ๊ฒฉ, ํ์ , ์ฌ๊ณ ๋ฑ)
- ์ฑ์ฉ ์ฌ์ดํธ์์ ์ฑ์ฉ ๊ณต๊ณ ์์ง
- ๋ด์ค ์ฌ์ดํธ์์ ์ ๋ชฉ ๋ฐ ๋ณธ๋ฌธ ์์ง
- ๊ณต๊ณต ๋ฐ์ดํฐ ์๋ ์์ง
- ํ์ต์ฉ AI ๋ฐ์ดํฐ์ ์์ฑ
๐ฌ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
Scrapy๋ ๋จ์ํ ํฌ๋กค๋ง ๋๊ตฌ๋ฅผ ๋์ด, ์น์์ ๋ฐ์ดํฐ ์์ง์ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์๋ํํ ์ ์๋ ๊ฐ๋ ฅํ ํ๋ ์์ํฌ์
๋๋ค.
์ด๊ธฐ ํ์ต์๋ ์ฝ๊ฐ์ ์๊ฐ๊ณผ ๋
ธ๋ ฅ์ด ํ์ํ์ง๋ง, ํ ๋ฒ ์ตํ๋ฉด ์ด๋ค ์ฌ์ดํธ๋ ํจ์จ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์งํ ์ ์๋ ๊ฐ๋ ฅํ ๋ฌด๊ธฐ๊ฐ ๋์ด์ค๋๋ค.
๐ ๋ค์ ๊ธ ์๊ณ
Scrapy์ Splash, Playwright, Impersonate ๋ฑ ๋ค์ํ ํ์ฅ ๋๊ตฌ๋ฅผ ๋ถ์ด๋ ๋ฐฉ๋ฒ์ ์๊ฐํ ์์ ์ ๋๋ค.