CodeGym /Java Adesua /Python SELF TW /數據保存與緩存

數據保存與緩存

Python SELF TW
等級 34 , 課堂 4
開放

1. 為什麼需要緩存?

各位同學,我們來到了網頁爬蟲中最有趣的一部分——數據緩存。為什麼要緩存呢?因為這就像為你的腳本設置一個“乾淨的五分鐘記錄”!讓我們來簡單看看這是為什麼有用,以及它是如何運行的,保證不會讓你頭暈。

想像這樣的場景:你完成了網站的網頁爬蟲,拿到了所有需要的數據,隔天又需要更新它們。難道還要再次進入無盡的請求循環嗎?不需要,其實你可以通過緩存來保存數據,避免重複的工作量。

緩存的優勢:

  • 速度:緩存的數據加載速度比從伺服器重新獲取快得多。這就像快速拿到冰箱裡的甜點,而不用再走一趟糕點店!
  • 節省:不僅減少了對伺服器的多餘請求,還節約了你的網絡流量,雙贏!
  • 穩定性:緩存能幫助應對臨時的網絡問題。如果網站突然無法訪問,你的數據仍然是安全的。就像隨時備一個備用降落傘。

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

# 輸出數據
print(response.json())

首先,我們通過調用 requests_cache.install_cache 設置了緩存,這會創建一個 SQLite 數據庫來存放緩存數據。參數 expire_after 指定了緩存數據的有效時間(以秒為單位)。這裡我們設置了 3 分鐘的緩存過期時間。

緩存的特性

當你重新運行這段代碼時,注意 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'])

這裡我們允許對 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)  # 緩存一小時
            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-cacheredis 這樣的工具,可以高效地管理請求並保存數據以作後續使用。成為緩存大師吧,別讓你的腳本被多餘的請求拖累!正如那句古老的程序員格言所說:“緩存一次,勝過百次重問。”

1
Опрос
繞過解析限制,  34 уровень,  4 лекция
недоступен
繞過解析限制
繞過解析限制
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION