1. Навіщо потрібне кешування?
Отже, студенти, ми підійшли до однієї з найцікавіших частин веб-скрейпінгу — кешування даних. Чому кешування? Тому що це як встановити свій власний "чистий п'ятихвилинний рекорд" у роботі зі скриптами! Давайте розберемось, навіщо це потрібно і як це працює, але по-простому, щоб голова не пішла обертом.
Уявіть собі: ви зробили веб-скрейпінг сайту, отримали всі потрібні дані і завтра хочете їх оновити. Невже знову доведеться занурюватися у нескінченний цикл запитів? Ні, можна обійтися без дублюючої роботи і зберегти дані за допомогою кешування.
Переваги кешування:
- Швидкість: Кешовані дані доступні швидше, ніж завантаження їх наново з сервера. Це як мати швидкий доступ до улюбленого тістечка: не потрібно знову йти в пекарню, воно вже у вас в холодильнику!
- Економія: І сервери не перевантажуєте зайвими запитами, і свій інтернет-трафік економите. Халявний бонус!
- Стійкість: Кешування допомагає справлятися з тимчасовими проблемами з'єднання. Якщо сайт раптом стає недоступним, у вас все одно залишаються дані. Майже як мати запасний парашут.
2. Основи кешування даних
Що таке кеш?
Кеш — це тимчасове сховище, яке дозволяє повторно використовувати раніше отримані дані. У програмуванні кешування допомагає уникнути повторного запиту одних і тих самих даних. Уявіть собі, що кеш — це ваша особиста бібліотека часто використовуваної інформації.
Типи кешів:
- Кеш у пам'яті: Швидкий, але обнуляється при відключенні живлення. Працює як оперативна пам'ять.
- Файловий кеш: Дані зберігаються на диску, більш стійкі і довговічні.
3. Практичне кешування з Python
Для того щоб кешувати дані в Python, ми можемо використовувати бібліотеку requests. Проте бібліотека requests не підтримує кешування "із коробки". Тут на допомогу приходить requests-cache, яка пропонує легкий спосіб додати кешування до ваших запитів.
Установка бібліотеки
pip install requests-cache
Налаштування кешування
Давайте налаштуємо кешування у нашому скрипті:
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 з додатковими параметрами:
requests_cache.install_cache('custom_cache',
allowable_methods=['GET', 'POST'],
allowable_codes=[200, 404],
ignored_parameters=['timestamp'])
Тут ми дозволяємо кешування для методів GET і POST та тільки для відповідей з кодами 200 і 404. Ми також ігноруємо параметр timestamp, щоб запити з різними часовими мітками не вважалися різними.
Робота з Redis
Якщо вам потрібне більш потужне рішення, наприклад, підтримка розподіленого кешування, ви можете використовувати redis. Це система кешування даних на основі пам'яті, популярна у світі великих даних.
Етапи роботи:
- Встановіть Redis і бібліотеку Python:
Bash
brew install redis # для користувачів macOS pip install redis - Налаштуйте 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. Обробка помилок
Коли ви працюєте з кешуванням, іноді база може бути пошкоджена або кеш не оновлюється. У таких випадках гарною практикою є ведення логів і регулярна перевірка даних.
Приклад коду для ведення логів:
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, дозволяє ефективно керувати запитами і зберігати дані для подальшого використання. Будьте кеш-гуру і не перевантажуйте свої скрипти зайвими запитами! І, як кажуть у старій програмістській приказці: "Краще один раз закешувати, ніж сто разів перепитувати".
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ