๐Ÿ•ท๏ธ ์›น ํฌ๋กค๋ง์˜ ํ•ต์‹ฌ ๋„๊ตฌ, 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๊ฐ€์ง€ ์›น ์Šคํฌ๋ž˜ํ•‘ ๋ฐฉ๋ฒ•


๋‹ต๊ธ€ ๋‚จ๊ธฐ๊ธฐ

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค