πŸ•·οΈ μ›Ή 크둀링의 핡심 도ꡬ, Scrapy μ™„μ „ 정볡 κ°€μ΄λ“œ

μ•ˆλ…•ν•˜μ„Έμš”!
μ˜€λŠ˜μ€ 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 λ“± λ‹€μ–‘ν•œ ν™•μž₯ 도ꡬλ₯Ό λΆ™μ΄λŠ” 방법을 μ†Œκ°œν•  μ˜ˆμ •μž…λ‹ˆλ‹€.

5κ°€μ§€ μ›Ή μŠ€ν¬λž˜ν•‘ 방법


λ‹΅κΈ€ 남기기

이메일 μ£Όμ†ŒλŠ” κ³΅κ°œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•„μˆ˜ ν•„λ“œλŠ” *둜 ν‘œμ‹œλ©λ‹ˆλ‹€