[파이썬] Scrapy 실시간 대시보드 구성

Scrapy

Scrapy는 Python으로 작성된 놀라운 웹 스크래핑 프레임워크입니다. 이 강력한 도구를 사용하면 웹에서 데이터를 추출하고 분석할 수 있습니다. 그러나 때로는 크롤러가 작동하는 동안 발생하는 이벤트와 데이터를 실시간으로 모니터링하고 시각화하는 것이 유용할 수 있습니다.

이 블로그 게시물에서는 Scrapy 프로젝트에 실시간 대시보드를 구성하는 방법을 알아보겠습니다.

필요한 패키지 설치

Scrapy 실시간 대시보드를 구성하려면 다음 패키지를 설치해야 합니다.

pip install scrapy
pip install scrapyrt
pip install redis

Scrapyrt는 Scrapy 프로젝트를 RESTful API로 노출시키기 위해 사용되며, Redis는 데이터를 저장하고 관리하기 위해 사용됩니다.

Scrapy 프로젝트 설정

Scrapyrt가 프로젝트를 RESTful API로 노출시키려면 몇 가지 구성이 필요합니다.

먼저, settings.py 파일에 다음 코드를 추가합니다.

EXTENSIONS = {
    'scrapy.extensions.telnet.TelnetConsole': None,
}

TELNETCONSOLE_PORT = None

그리고 middlewares.py 파일에 다음 코드를 추가합니다.

from scrapy import signals
from scrapy.utils.serialize import ScrapyJSONEncoder
import json

class RealtimeDashboardMiddleware:
    def __init__(self, crawler):
        self.encoder = ScrapyJSONEncoder()
        self.stats = crawler.stats

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def process_spider_input(self, response, spider):
        self.send_stats_to_redis()

    def process_spider_exception(self, response, exception, spider):
        self.send_stats_to_redis()

    def send_stats_to_redis(self):
        stats = self.encoder.encode(self.stats.get_stats())
        # TODO: Send stats to Redis
        print(json.loads(stats))

Redis에 Stats 전송하기

Redis에 데이터를 저장하고 관리하기 위해 send_stats_to_redis 메서드 내에 Redis 연결 코드를 추가해야 합니다. Redis 클라이언트를 사용하여 대시보드에서 사용할 수 있는 실시간 데이터를 저장할 수 있습니다.

import redis

def send_stats_to_redis(self):
    stats = self.encoder.encode(self.stats.get_stats())
    
    r = redis.Redis(host='localhost', port=6379, db=0)
    r.set('scrapy:stats', stats)

대시보드 화면 구성

Scrapy의 실시간 대시보드를 표시하기 위해 웹 애플리케이션을 개발해야 합니다. Flask, Django 또는 웹 프레임워크 등을 사용하여 간단한 대시보드 애플리케이션을 만들 수 있습니다.

실시간 대시보드를 표시하기 위한 예제 웹 애플리케이션 코드는 아래와 같습니다.

from flask import Flask, render_template
import redis

app = Flask(__name__)

@app.route('/')
def index():
    r = redis.Redis(host='localhost', port=6379, db=0)
    stats = r.get('scrapy:stats')
    return render_template('dashboard.html', stats=stats)

if __name__ == '__main__':
    app.run(debug=True)

대시보드 템플릿 구성

대시보드를 표시하기 위한 HTML 템플릿을 만들어야 합니다. 간단한 예제를 위해 dashboard.html 파일을 다음과 같이 작성했습니다.


<!DOCTYPE html>
<html>
<head>
    <title>Scrapy Realtime Dashboard</title>
</head>
<body>
    <h1>Scrapy Realtime Dashboard</h1>
    <pre>{{ stats }}</pre>
</body>
</html>

실행

다음 단계를 따라 Scrapy 프로젝트를 실행합니다.

  1. Scrapy 프로젝트 디렉토리로 이동합니다.
  2. Scrapyrt 실행: scrapyrt -p 9080
  3. 웹 애플리케이션 실행: python app.py
  4. 브라우저에서 http://localhost:5000에 접속하여 대시보드를 확인합니다.

이제 Scrapy 크롤러가 동작하는 동안에 발생하는 이벤트와 데이터를 실시간으로 모니터링하고 대시보드에 표시할 수 있습니다.

이것은 Scrapy를 사용하여 실시간 대시보드를 구성하는 방법에 대한 간략한 개요입니다. 실제로 대시보드를 구축하면서 세부 정보를 조정하고 추가 기능을 구현할 수 있습니다.

Happy coding!