CodeGym /课程 /Python SELF ZH /让脚本更稳定:重试和超时时间

让脚本更稳定:重试和超时时间

Python SELF ZH
第 34 级 , 课程 3
可用

1. 脚本中的错误处理

网络抓取的问题

想象一下:你的脚本很优雅地坐在那里准备工作,但突然踩到了香蕉皮——砰!出现了错误和故障。如何让它在严酷的互联网环境中存活下来?今天我们来教它两个重要技能:耐心和重试。 是的,我们要设置重试和超时。

网络抓取的工作可能很顺利,直到你发现你的脚本突然中断,原因可能是:

  • 连接问题。
  • 服务器暂时不可用。
  • HTML 结构的不可预测的变化。

你的脚本就像绝地武士一样,需要准备好迎接意外,并学会处理它们。有时候,只需等待一分钟并重试请求就可以解决问题。而这时我们的英雄登场了——重试和超时机制!

错误处理机制入门

首先,让我们回顾一下基础——Python 中的错误处理。我们使用 try-except 块来管理错误,防止它们破坏脚本的运行。

Python

import requests

try:
    response = requests.get('https://example.com')
    response.raise_for_status()  # 检查请求是否成功
except requests.exceptions.RequestException as e:
    print(f'发生了一个错误: {e}')

2. 设置重试

为什么要使用重试机制?

一个脚本如果遇到第一个故障就放弃,简直就像一只害怕大雨的猫。而我们需要一个能够坚强面对几个困难的脚本。这就是我们配置重试的原因——让你的脚本更加自信。

如何设置重试机制

现在,让我们看看如何组织重试机制。最简单的方法之一是用 urllib3 库,它提供了自动在错误情况下重新发送请求的功能。

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'发生了一个错误: {e}')

在这个例子中,我们创建了一个 session,并应用了重试机制 (Retry)。 我们设定了最多 5 次重试,如果遇到状态码 500、502、503 和 504 的错误。 backoff_factor=1 表示每次重试间隔时间按指数增长(1, 2, 4, 8... 秒)。

3. 超时:防止卡住

告别漫长的等待

超时就像闹钟:帮助你避免无限期等待服务器响应。设置超时后,你告诉脚本:“别等了!如果服务器在指定时间内没回应,就继续前进!”

Python

try:
    response = requests.get('https://example.com', timeout=10)
    response.raise_for_status()
    print(response.content)
except requests.exceptions.Timeout:
    print('请求超时了')
except requests.exceptions.RequestException as e:
    print(f'发生了一个错误: {e}')

为什么需要超时?

你是否曾经因为等待脚本从一个已经“烧焦”的服务器获取响应而浪费时间?超时机制避免了不必要的等待,让你的代码有能力快速恢复并继续工作。别让你的脚本“以为”它可以在这段时间内抽个烟!

4. 配置示例

使用重试实现稳定的脚本

现在让我们创建一个像钢铁侠盔甲一样稳定的脚本。我们将同时使用超时和重试。

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('请求超时了')
    except requests.exceptions.RequestException as e:
        print(f'发生了一个错误: {e}')
    return None

content = fetch_url('https://example.com')
if content:
    print('成功下载了数据!')

使用超时防止脚本卡住

我们已经展示了如何设置超时。现在让我们确保脚本不仅稳定,还能在长时间等待时合理响应。与其“卡住”,它会提醒主人:“嘿,服务器想太久了,我不打算等了!”

这种简单而清晰的方法会让你的代码更可靠,并准备好应对可能发生的各种不可预测的情况。

实际应用

当你开发真实的抓取项目时,往往会遇到服务器方面的各种限制。重试和超时是你最好的朋友,用于最大限度地降低故障风险。这会帮助你确保代码的平稳运行,尤其是在自动化数据处理和需要按时得到精确结果的情况下。这些技巧还能提升你的简历质量以及客户对你提供数据的信任度。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION