JavaRush /Курсы /Python SELF /Сохранение и кэширование данных

Сохранение и кэширование данных

Python SELF
34 уровень , 4 лекция
Открыта

1. Зачем нужно кэширование?

Итак, студенты, мы подошли к одной из самых увлекательных частей веб-скрейпинга — кэширование данных. Почему кэширование? Потому что это как поставить свой собственный "чистый пятиминутный рекорд" в работе со скриптами! Давайте разберемся, зачем это нужно и как это работает, но по-простому, чтобы голова не пошла кругом.

Представьте себе: вы сделали веб-скрейпинг сайта, получили все нужные данные и завтра хотите их обновить. Неужели сновафя придется погружаться в бесконечный цикл запросов? Нет, можно обойтись без дублирующей работы и сохранить данные с помощью кэширования.

Преимущества кэширования:

  • Скорость: Кэшированные данные доступны быстрее, чем загрузка их заново с сервера. Это как иметь быстрый доступ к любимому пирожному: не нужно снова идти в пекарню, оно уже у вас в холодильнике!
  • Экономия: И сервера не перегружаете лишними запросами, и свой интернет-трафик экономите. Халявный бонус!
  • Устойчивость: Кэширование помогает справляться с временными проблемами с соединением. Если сайт внезапно становится недоступным, у вас всё равно остаются данные. Почти как иметь запасной парашют.

2. Основы кэширования данных

Что такое кэш?

Кэш — это временное хранилище, которое позволяет повторно использовать ранее извлеченные данные. В программировании кэширование помогает избежать повторного запроса одних и тех же данных. Представьте себе, что кэш — это ваша личная библиотека часто используемой информации.

Типы кэшей:

  • Кэш в памяти: Быстрый, но обнуляется при отключении питания. Работает как оперативная память.
  • Файловый кэш: Данные сохраняются на диске, более устойчивы и долговечны.

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'From cache: {response.from_cache}')

# Выводим данные
print(response.json())

Во-первых, мы устанавливаем кэш, обращаясь к requests_cache.install_cache. Это создаст базу SQLite для хранения кэшированных данных. Параметр expire_after указывает время (в секундах), после которого кэшированные данные будут удалены. Здесь мы настроили кэширование на три минуты.

Особенности кэширования

Когда вы снова запустите этот код, обратите внимание на response.from_cache. Эта переменная будет равна 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'])

Здесь мы разрешаем кэширование для методов GET и POST и только для ответов с кодами 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 для хранения ответов в течение часа. Мы проверяем, есть ли данные в кэше, и только в случае их отсутствия выполняем 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)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ana Уровень 36
2 августа 2025
Неужели сновафя?? 😂