1. Dlaczego warto stosować cache’owanie?
No to co, studenci, dotarliśmy do jednej z najbardziej fascynujących części web scrapingu — cache’owania danych. Dlaczego cache’owanie? Bo to jak ustanowienie swojego „czystego pięciominutowego rekordu” w pracy ze skryptami! Zobaczmy, po co to w ogóle jest i jak to działa, ale na luzie, żeby głowa nie eksplodowała.
Wyobraźcie sobie: zrobiliście web scraping strony, zdobyliście wszystkie potrzebne dane, a jutro chcecie je zaktualizować. Czy serio trzeba będzie znowu zanurzać się w nieskończone pętle zapytań? Nie, można uniknąć zbędnej roboty i zachować dane dzięki cache’owaniu.
Zalety cache’owania:
- Szybkość: Zcache’owane dane są dostępne szybciej niż nowe pobranie ich z serwera. To jak mieć szybki dostęp do ulubionego ciastka: nie trzeba znowu iść do piekarni, już masz je w lodówce!
- Oszczędność: I nie przeciążasz serwerów nadmiarowymi zapytaniami, i oszczędzasz swój internet. Bonus za darmo!
- Odporność: Cache’owanie pomaga radzić sobie z chwilowymi problemami z połączeniem. Gdy strona nagle staje się niedostępna, nadal masz dane. To jak mieć zapasowy spadochron.
2. Podstawy cache’owania danych
Co to jest cache?
Cache to tymczasowy magazyn, który pozwala ponownie używać wcześniej pobranych danych. W programowaniu cache’owanie pomaga uniknąć ponownego zapytania o te same dane. Wyobraźcie sobie, że cache to wasza osobista biblioteka często używanych informacji.
Rodzaje cache:
- Cache w pamięci: Szybki, ale czyści się po odłączeniu zasilania. Działa jak pamięć RAM.
- Cache plikowy: Dane są zapisywane na dysku, bardziej trwałe i odporne.
3. Praktyczne cache’owanie w Pythonie
Aby cache’ować dane w Pythonie, możemy użyć biblioteki requests
. Jednak biblioteka requests
nie wspiera cache’owania out-of-the-box. Tu na ratunek przychodzi requests-cache
, która oferuje prosty sposób dodania cache’owania do waszych zapytań.
Instalacja biblioteki
pip install requests-cache
Konfiguracja cache’owania
Skonfigurujmy cache’owanie w naszym skrypcie:
import requests_cache
# Ustawiamy cache w SQLite
requests_cache.install_cache('demo_cache', expire_after=180)
import requests
# Wysyłamy zapytanie
response = requests.get('https://jsonplaceholder.typicode.com/todos/1')
# Sprawdzamy, skąd pochodzi odpowiedź
print(f'From cache: {response.from_cache}')
# Wyświetlamy dane
print(response.json())
Po pierwsze, ustawiamy cache, odwołując się do requests_cache.install_cache
. To utworzy bazę SQLite do przechowywania cache’owanych danych. Parametr expire_after
wskazuje czas (w sekundach), po którym dane z cache zostaną usunięte. Tutaj ustawiliśmy cache’owanie na trzy minuty.
Cechy cache’owania
Gdy ponownie uruchomicie ten kod, zwróćcie uwagę na response.from_cache
. Ta zmienna będzie miała wartość True
przy kolejnych wywołaniach w ciągu pierwszych trzech minut.
Usuwanie cache
Usunięcie cache jest proste: usuńcie plik bazy danych lub użyjcie metody requests_cache.clear()
, aby wyczyścić wszystkie wpisy z waszego cache.
4. Zaawansowane możliwości cache’owania
Cache’owanie warunkowe
Czasami może być potrzebne bardziej kontrolowane cache’owanie. Na przykład, nie chcecie cache’ować danych, jeśli są już przestarzałe lub przy zmianie parametrów zapytania.
W takich przypadkach można użyć requests-cache
z dodatkowymi parametrami:
requests_cache.install_cache('custom_cache',
allowable_methods=['GET', 'POST'],
allowable_codes=[200, 404],
ignored_parameters=['timestamp'])
Tutaj pozwalamy na cache’owanie dla metod GET
i POST
oraz tylko odpowiedzi z kodami 200 i 404. Ignorujemy także parametr timestamp
, aby zapytania z różnymi znacznikami czasu nie były traktowane jako różne.
Praca z Redis
Jeśli potrzebujecie bardziej zaawansowanego rozwiązania, na przykład wsparcia dla rozproszonego cache’owania, możecie użyć redis
. To system cache’owania danych oparty na pamięci, popularny w świecie big data.
Etapy pracy:
-
Zainstaluj Redis i bibliotekę Python:
Bash
brew install redis # dla użytkowników macOS pip install redis
-
Skonfiguruj Redis w swoim projekcie:
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) # cache na 1 godzinę return response.text print(get_cached_response('https://jsonplaceholder.typicode.com/todos/1'))
Ten przykład używa Redis do przechowywania odpowiedzi przez godzinę. Sprawdzamy, czy dane są w cache, i tylko w przypadku ich braku wykonujemy HTTP zapytanie.
5. Obsługa błędów
Gdy pracujecie z cache’owaniem, czasem baza może zostać uszkodzona lub cache się nie aktualizuje. W takich przypadkach dobrą praktyką jest prowadzenie logów i regularne sprawdzanie danych.
Przykład kodu do prowadzenia logów:
import logging
logging.basicConfig(level=logging.INFO)
try:
response = get_cached_response('https://jsonplaceholder.typicode.com/todos/1')
logging.info("Dane pomyślnie pobrano z cache")
except Exception as e:
logging.error("Błąd podczas pobierania danych: %s", str(e))
Końcowe przemyślenia
Cache’owanie to nie tylko narzędzie do przyspieszania pracy. To sposób na uczynienie waszych aplikacji bardziej niezawodnymi i odpornymi na czasowe awarie sieci lub przeciążenia serwerów. Używanie narzędzi takich jak requests-cache
lub redis
umożliwia efektywne zarządzanie zapytaniami i przechowywanie danych do późniejszego użycia. Bądźcie mistrzami cache i nie przeciążajcie swoich skryptów zbędnymi zapytaniami! I jak mawiają w starej programistycznej maksymie: „Lepiej raz zcache’ować, niż sto razy dopytywać”.
GO TO FULL VERSION