μλ
νμΈμ!
μ€λμ 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 λ± λ€μν νμ₯ λꡬλ₯Ό λΆμ΄λ λ°©λ²μ μκ°ν μμ μ λλ€.