CodeGym /Khóa học Java /Python SELF VI /Retry và Timeout để tăng tính bền bỉ cho script

Retry và Timeout để tăng tính bền bỉ cho script

Python SELF VI
Mức độ , Bài học
Có sẵn

1. Xử lý lỗi trong script

Vấn đề của web scraping

Hãy tưởng tượng: script của bạn trông rất đẹp và sẵn sàng hoạt động, nhưng bất ngờ "trượt vỏ chuối" - và thế là lỗi xảy ra! Làm sao để nó sống sót trong điều kiện khắc nghiệt của Internet? Hôm nay mình cùng nhau sẽ dạy nó hai kỹ năng quan trọng nhất: kiên định và thử lại. Chính xác, chúng ta sẽ thiết lập Retry và Timeout.

Làm việc với web scraping có thể rất thú vị cho đến khi bạn nhận ra script của mình đột nhiên dừng lại vì:

  • Lỗi kết nối.
  • Máy chủ tạm thời không khả dụng.
  • Sự thay đổi không báo trước trong cấu trúc HTML của trang web.

Script của bạn giống như một Jedi, cần sẵn sàng cho những bất ngờ và biết cách đối phó với chúng. Đôi khi, vấn đề có thể được giải quyết chỉ cần chờ một chút và thử lại. Và đó là lúc xuất hiện các anh hùng của chúng ta - Retry và Timeout!

Giới thiệu về cơ chế xử lý lỗi

Trước tiên, hãy nhớ lại nền tảng - xử lý lỗi trong Python. Chúng ta sử dụng các khối try-except để quản lý lỗi và ngăn không cho chúng làm hỏng script của mình.

Python

import requests

try:
    response = requests.get('https://example.com')
    response.raise_for_status()  # kiểm tra yêu cầu thành công
except requests.exceptions.RequestException as e:
    print(f'Đã xảy ra lỗi: {e}')

2. Cài đặt Retry

Tại sao cần sử dụng thử lại?

Một script chỉ từ bỏ ngay từ lỗi đầu tiên - giống như một chú mèo sợ mưa rào. Bạn cần một script có thể đứng vững qua vài khó khăn. Đó là lý do tại sao chúng ta cài đặt Retry - biến script của bạn thành một chiến binh tự tin.

Cách thiết lập thử lại

Giờ hãy xem cách chúng ta có thể tổ chức thử lại. Một trong những cách đơn giản nhất là sử dụng thư viện urllib3, cung cấp tính năng tự động gửi lại yêu cầu trong trường hợp lỗi.

Python

from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
import requests

session = requests.Session()
retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
session.mount('https://', HTTPAdapter(max_retries=retries))

try:
    response = session.get('https://example.com')
    response.raise_for_status()
    print(response.content)
except requests.exceptions.RequestException as e:
    print(f'Đã xảy ra lỗi: {e}')

Trong ví dụ này chúng ta tạo session, áp dụng cơ chế thử lại (Retry). Chúng ta thiết lập thử tối đa 5 lần trong trường hợp lỗi với mã 500, 502, 503 và 504. backoff_factor=1 có nghĩa là thời gian giữa các lần thử sẽ tăng dần theo cấp số nhân (1, 2, 4, 8... giây).

3. Timeout: ngăn chặn treo script

Loại bỏ chờ đợi vô ích

Timeout - như báo thức: giúp tránh việc đợi phản hồi server quá lâu. Thiết lập Timeout, bạn bảo với script của mình: "Đủ rồi! Nếu server không phản hồi trong thời gian quy định, tiếp tục làm việc khác!"

Python

try:
    response = requests.get('https://example.com', timeout=10)
    response.raise_for_status()
    print(response.content)
except requests.exceptions.Timeout:
    print('Yêu cầu vượt quá thời gian chờ')
except requests.exceptions.RequestException as e:
    print(f'Đã xảy ra lỗi: {e}')

Tại sao cần thiết?

Bạn đã bao giờ bị treo khi script của mình chờ phản hồi từ server, mà server đó đã “cháy” như một cái bánh mì nướng? Timeout giúp tránh sự chờ đợi không cần thiết và cho phép code của bạn phục hồi nhanh chóng để tiếp tục làm việc. Đừng để script của mình "nghĩ" rằng nó có thể hút vài điếu thuốc trong lúc chờ!

4. Ví dụ cài đặt

Xây dựng script bền bỉ bằng Retry

Giờ hãy kết hợp script mạnh mẽ giống như cánh tay sắt của Iron Man. Chúng ta sẽ sử dụng cả Timeout và Retry.

Python

from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
import requests

def fetch_url(url):
    session = requests.Session()
    retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
    session.mount('https://', HTTPAdapter(max_retries=retries))

    try:
        response = session.get(url, timeout=10)
        response.raise_for_status()
        return response.content
    except requests.exceptions.Timeout:
        print('Yêu cầu vượt quá thời gian chờ')
    except requests.exceptions.RequestException as e:
        print(f'Đã xảy ra lỗi: {e}')
    return None

content = fetch_url('https://example.com')
if content:
    print('Tải dữ liệu thành công!')

Sử dụng Timeout để tránh treo script

Chúng ta đã trình bày cách đặt Timeout. Giờ hãy đảm bảo rằng script của chúng ta không chỉ bền bỉ mà còn phản ứng hợp lý với thời gian chờ lâu. Thay vì "treo", nó sẽ nhắc nhở người dùng: "Này, server suy nghĩ quá lâu, tớ không chờ nữa đâu!"

Một cách đơn giản và ngắn gọn như vậy sẽ làm cho code của bạn mạnh mẽ và sẵn sàng đối mặt với mọi tình huống không dự đoán trước có thể xảy ra trên Internet.

Ứng dụng thực tế

Khi bạn phát triển các dự án web scraping thực tế, bạn thường phải đối mặt với các hạn chế khác nhau của server. Retry và Timeout là bạn tốt nhất của bạn để giảm thiểu rủi ro gặp lỗi. Điều này giúp đảm bảo hoạt động trơn tru cho code của bạn, đặc biệt là khi xử lý dữ liệu tự động và khi cần kết quả chính xác kịp thời. Các kỹ thuật này cũng có thể nâng cao chất lượng CV của bạn và độ tin cậy từ khách hàng mà bạn cung cấp dữ liệu.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION