1. Tại sao cần tạo bộ nhớ đệm?
Này các bạn, chúng ta đã đến một trong những phần thú vị nhất của web scraping — tạo bộ nhớ đệm dữ liệu. Tại sao cần bộ nhớ đệm? Vì nó giống như việc đạt được "kỷ lục 5 phút sạch" trong việc sử dụng các script của bạn! Hãy cùng tìm hiểu lý do tại sao cần làm điều này và nó hoạt động ra sao, nhưng theo cách dễ hiểu thôi nhé.
Hãy tưởng tượng: bạn đã thực hiện scraping một website, lấy được tất cả dữ liệu cần thiết và hôm sau muốn cập nhật nó. Liệu có phải lặp lại chu trình request vô tận không? Không, bạn có thể tránh công việc lặp lại đó và lưu dữ liệu bằng cách tạo bộ nhớ đệm.
Lợi ích của bộ nhớ đệm:
- Tốc độ: Dữ liệu trong bộ nhớ đệm có thể được truy cập nhanh hơn so với việc tải lại từ server. Nó giống như việc có sẵn bánh yêu thích trong tủ lạnh thay vì phải quay lại tiệm bánh!
- Tiết kiệm: Giảm tải cho server bằng cách giảm số lượng request, và cũng tiết kiệm lưu lượng internet của bạn. Thật tuyệt vời!
- Độ bền: Bộ nhớ đệm giúp ứng phó với các sự cố kết nối tạm thời. Nếu website bất thình lình không khả dụng, bạn vẫn có dữ liệu. Gần như có chiếc dù dự phòng vậy.
2. Những điều cơ bản về bộ nhớ đệm dữ liệu
Bộ nhớ đệm là gì?
Bộ nhớ đệm là một kho lưu trữ tạm thời giúp sử dụng lại dữ liệu đã lấy trước đó. Trong lập trình, bộ nhớ đệm giúp tránh việc request lại cùng một dữ liệu. Hãy tưởng tượng bộ nhớ đệm như thư viện cá nhân chứa những thông tin thường xuyên sử dụng của bạn.
Các loại bộ nhớ đệm:
- Bộ nhớ đệm trong RAM: Nhanh, nhưng bị xóa khi ngắt nguồn. Hoạt động như bộ nhớ RAM.
- Bộ nhớ đệm file: Dữ liệu được lưu trên ổ đĩa, bền hơn và sử dụng lâu dài.
3. Thực hành bộ nhớ đệm với Python
Để tạo bộ nhớ đệm dữ liệu trong Python, chúng ta có thể sử dụng thư viện requests. Tuy nhiên, thư viện requests không hỗ trợ bộ nhớ đệm mặc định. Đó là lúc requests-cache xuất hiện như một cứu cánh, cung cấp cách dễ dàng để thêm bộ nhớ đệm vào request của bạn.
Cài đặt thư viện
pip install requests-cache
Cấu hình bộ nhớ đệm
Cùng cấu hình bộ nhớ đệm trong script của chúng ta:
import requests_cache
# Cài bộ nhớ đệm SQLite
requests_cache.install_cache('demo_cache', expire_after=180)
import requests
# Gửi request
response = requests.get('https://jsonplaceholder.typicode.com/todos/1')
# Kiểm tra nguồn dữ liệu
print(f'From cache: {response.from_cache}')
# In dữ liệu ra
print(response.json())
Đầu tiên, chúng ta cài đặt bộ nhớ đệm bằng cách gọi requests_cache.install_cache. Lệnh này tạo một SQLite database để lưu trữ dữ liệu đệm. Tham số expire_after chỉ định thời gian (tính bằng giây) sau đó dữ liệu được xóa. Ở đây, chúng ta cài đặt thời gian đệm là ba phút.
Đặc điểm của bộ nhớ đệm
Khi bạn chạy lại đoạn mã này, hãy chú ý đến biến response.from_cache. Biến này sẽ bằng True cho các lần gọi sau trong ba phút đầu tiên.
Xóa bộ nhớ đệm
Để xóa bộ nhớ đệm, bạn chỉ cần xóa file database hoặc sử dụng phương thức requests_cache.clear() để xóa toàn bộ bản ghi trong bộ nhớ đệm.
4. Tiện ích mở rộng của bộ nhớ đệm
Bộ nhớ đệm có điều kiện
Đôi khi bạn cần bộ nhớ đệm được kiểm soát chặt hơn. Ví dụ, không cần đệm dữ liệu nếu chúng đã cũ hoặc nếu tham số request thay đổi.
Trong các trường hợp như vậy, bạn có thể sử dụng requests-cache với các tham số bổ sung:
requests_cache.install_cache('custom_cache',
allowable_methods=['GET', 'POST'],
allowable_codes=[200, 404],
ignored_parameters=['timestamp'])
Ở đây, chúng ta cho phép đệm cho các phương thức GET và POST và chỉ cho các phản hồi với mã 200 và 404. Chúng ta cũng bỏ qua tham số timestamp để các request với dấu thời gian khác nhau không bị xem là khác nhau.
Sử dụng Redis
Nếu bạn cần giải pháp mạnh mẽ hơn, chẳng hạn như hỗ trợ bộ nhớ đệm phân tán, bạn có thể sử dụng Redis. Đây là hệ thống dữ liệu bộ nhớ đệm dựa trên RAM, rất phổ biến trong thế giới Big Data.
Các bước:
- Cài đặt Redis và thư viện Python:
Bash
brew install redis # dành cho người dùng macOS pip install redis - Cấu hình Redis trong project của bạn:
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) # đệm trong 1 giờ return response.text print(get_cached_response('https://jsonplaceholder.typicode.com/todos/1'))
Ví dụ này sử dụng Redis để lưu kết quả phản hồi trong một giờ. Chúng ta kiểm tra xem dữ liệu đã có trong bộ nhớ đệm chưa, và chỉ khi không có, mới thực hiện request HTTP.
5. Xử lý lỗi
Khi làm việc với bộ nhớ đệm, đôi lúc database có thể bị hỏng hoặc bộ nhớ đệm không cập nhật. Trong các trường hợp này, việc ghi log và kiểm tra dữ liệu thường xuyên là một thực hành tốt.
Ví dụ mã ghi log:
import logging
logging.basicConfig(level=logging.INFO)
try:
response = get_cached_response('https://jsonplaceholder.typicode.com/todos/1')
logging.info("Dữ liệu đã được lấy từ bộ nhớ đệm thành công")
except Exception as e:
logging.error("Lỗi khi lấy dữ liệu: %s", str(e))
Kết luận
Bộ nhớ đệm không chỉ là công cụ tăng tốc độ. Đây là cách làm cho ứng dụng của bạn đáng tin cậy hơn và chống lại các sự cố tạm thời của mạng hoặc quá tải server. Sử dụng các công cụ như requests-cache hoặc redis cho phép bạn quản lý các request hiệu quả và lưu trữ dữ liệu để sử dụng sau. Hãy trở thành một chuyên gia về bộ nhớ đệm và đừng để script của bạn bị quá tải bởi những request không cần thiết! Và như câu nói của dân lập trình: "Tốt hơn là đệm một lần, hơn là hỏi lại trăm lần".
GO TO FULL VERSION