CodeGym /Kurs Javy /Python SELF PL /Przechowywanie i cache’owanie danych

Przechowywanie i cache’owanie danych

Python SELF PL
Poziom 34 , Lekcja 4
Dostępny

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

Bash

pip install requests-cache

Konfiguracja cache’owania

Skonfigurujmy cache’owanie w naszym skrypcie:

Python

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:

Python

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:

  1. Zainstaluj Redis i bibliotekę Python:
    Bash
    
    brew install redis  # dla użytkowników macOS
    pip install redis
    
  2. 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:

Python

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ć”.

1
Опрос
Omijanie ograniczeń dla parsowania,  34 уровень,  4 лекция
недоступен
Omijanie ograniczeń dla parsowania
Omijanie ograniczeń dla parsowania
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION