CodeGym /Java Course /Python SELF KO /데이터 저장 및 캐싱

데이터 저장 및 캐싱

Python SELF KO
레벨 34 , 레슨 4
사용 가능

1. 왜 캐싱이 필요할까?

자, 여러분! 이제 웹 스크래핑의 가장 흥미로운 부분 중 하나인 데이터 캐싱을 배워보자. 왜 캐싱이 필요하냐고? 그건 마치 스크립트를 실행하는 “자체 5분 기록”을 세우는 것과 같아! 왜 필요한지, 그리고 어떻게 작동하는지 간단히 알아보자.

상상해봐: 한 사이트에서 웹 스크래핑으로 모든 필요한 데이터를 얻었어. 그런데 내일 그 데이터를 갱신하고 싶다면? 다시 끝없는 요청 루프로 들어가야 할까? 아니야! 중복 작업을 피하고 데이터를 저장할 수 있는 캐싱을 활용하면 돼.

캐싱의 장점:

  • 속도: 캐싱된 데이터는 서버에서 새로 로드하는 것보다 더 빠르게 접근 가능해. 마치 좋아하는 케이크를 집 냉장고에 두고 쉽게 꺼내 먹는 것처럼 말이야!
  • 절약: 서버에 불필요한 요청을 덜어주고, 너의 인터넷 트래픽도 절약할 수 있어. 꽁짜 보너스야!
  • 안정성: 캐싱은 일시적인 연결 문제를 해결하는 데 도움을 줘. 사이트가 갑자기 접근 불가능해도 데이터는 여전히 남아있어. 거의 예비 낙하산 같은 느낌이지.

2. 데이터 캐싱 기초

캐시란 무엇일까?

캐시는 이전에 가져온 데이터를 재사용할 수 있게 해주는 임시 저장소야. 프로그래밍에서는 캐싱을 통해 동일한 데이터에 대한 반복 요청을 피할 수 있어. 마치 자주 사용하는 정보를 보관하는 너만의 도서관 같은 거지.

캐시의 종류:

  • 메모리 캐시: 빠르지만 전원이 꺼지면 초기화돼. RAM처럼 작동하지.
  • 파일 캐시: 데이터가 디스크에 저장되기 때문에 더 안정적이고 오래 지속돼.

3. Python으로 캐싱 실습

Python에서 데이터를 캐싱하려면 requests 라이브러리를 사용할 수 있어. 하지만 requests는 기본적으로 캐싱을 지원하지 않아. 이때 requests-cache가 도움이 돼. 이 라이브러리는 캐싱을 쉽게 추가할 수 있도록 도와줘.

라이브러리 설치

Bash

pip install requests-cache

캐싱 설정

스크립트에서 캐싱을 설정해보자:

Python

import requests_cache

# SQLite에 캐시 설정
requests_cache.install_cache('demo_cache', expire_after=180)

import requests

# 요청 보내기
response = requests.get('https://jsonplaceholder.typicode.com/todos/1')

# 응답이 어디에서 왔는지 확인
print(f'캐시에서 가져왔나요: {response.from_cache}')

# 데이터 출력
print(response.json())

먼저 requests_cache.install_cache를 통해 캐시를 설정해. 이것은 캐싱된 데이터를 저장하기 위한 SQLite 데이터베이스를 생성할 거야. expire_after 파라미터는 캐싱된 데이터가 삭제되기까지의 시간(초)을 지정해. 여기선 캐싱을 3분으로 설정했어.

캐싱 기능

이 코드를 다시 실행하면 response.from_cache를 확인해봐. 이 변수는 첫 3분 동안 후속 요청에 대해 True로 설정돼.

캐시 삭제

캐시를 삭제하는 건 간단해: 데이터베이스 파일을 삭제하거나 requests_cache.clear() 메서드를 사용해 캐시의 모든 항목을 지울 수 있어.

4. 고급 캐싱 기능

조건부 캐싱

때로는 더 많은 제어가 가능한 캐싱이 필요할 수도 있어. 예를 들어, 데이터가 이미 오래됐거나 요청 파라미터가 변경된 경우라면 캐싱할 필요가 없겠지.

이런 경우에는 requests-cache를 추가 파라미터와 함께 사용할 수 있어:

Python

requests_cache.install_cache('custom_cache',
             allowable_methods=['GET', 'POST'],
             allowable_codes=[200, 404],
             ignored_parameters=['timestamp'])

여기서 GETPOST 메서드에 대해 캐싱을 허용하고, 응답 코드 200과 404만 허용했어. 또한 timestamp 파라미터는 무시하도록 설정해서 서로 다른 타임스탬프로 된 요청을 동일한 것으로 간주하지 않도록 했어.

Redis와 함께 작업하기

만약 분산 캐싱 지원같은 더 강력한 솔루션이 필요하다면 redis를 사용할 수 있어. 이건 메모리를 기반으로 한 데이터 캐싱 시스템으로, 빅 데이터를 다룰 때 많이 쓰여.

작업 단계:

  1. Redis와 Python 라이브러리 설치:
    Bash
    
    brew install redis  # macOS 사용자용
    pip install redis
    
  2. 프로젝트에서 Redis 설정:
    Python
    
    import redis
    import requests
    
    r = redis.Redis(host='localhost', port=6379, db=0)
    
    def get_cached_response(url):
        if r.get(url):
            return r.get(url).decode('utf-8')
        else:
            response = requests.get(url)
            r.setex(url, 3600, response.text)  # 1시간 동안 캐싱
            return response.text
    
    print(get_cached_response('https://jsonplaceholder.typicode.com/todos/1'))
    

이 예제는 Redis를 사용해 응답을 1시간 동안 저장해. 캐시에 데이터가 있는지 확인하고, 없을 경우에만 HTTP 요청을 실행해.

5. 오류 처리

캐싱 작업을 할 때 가끔 데이터베이스가 손상되거나 캐시가 갱신되지 않을 수도 있어. 이런 경우, 로그를 작성하고 데이터를 주기적으로 확인하는 건 좋은 습관이야.

로그 작성을 위한 코드 예제:

Python

import logging

logging.basicConfig(level=logging.INFO)

try:
    response = get_cached_response('https://jsonplaceholder.typicode.com/todos/1')
    logging.info("캐시에서 데이터를 성공적으로 가져왔습니다")
except Exception as e:
    logging.error("데이터 가져오는 중 오류 발생: %s", str(e))

마무리

캐싱은 단순히 작업 속도를 높이는 도구가 아니야. 네 애플리케이션을 더 신뢰성 있고 네트워크의 일시적인 장애나 서버 과부하에도 안정적으로 만들어주는 방법이야. requests-cache 또는 redis 같은 도구를 사용하면 요청을 효과적으로 관리하고 데이터를 나중에 사용할 수 있도록 저장할 수 있어. 캐싱 전문가가 돼서 너의 스크립트를 쓸데없는 요청으로 부담스럽게 만들지 말자! 프로그래머의 오래된 명언처럼: "한 번 캐싱하는 게 백 번 다시 물어보는 것보다 낫다."

1
Опрос
파싱 제한 우회,  34 уровень,  4 лекция
недоступен
파싱 제한 우회
파싱 제한 우회
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION