1. 脚本中的错误处理
网络抓取的问题
想象一下:你的脚本很优雅地坐在那里准备工作,但突然踩到了香蕉皮——砰!出现了错误和故障。如何让它在严酷的互联网环境中存活下来?今天我们来教它两个重要技能:耐心和重试。 是的,我们要设置重试和超时。
网络抓取的工作可能很顺利,直到你发现你的脚本突然中断,原因可能是:
- 连接问题。
- 服务器暂时不可用。
- HTML 结构的不可预测的变化。
你的脚本就像绝地武士一样,需要准备好迎接意外,并学会处理它们。有时候,只需等待一分钟并重试请求就可以解决问题。而这时我们的英雄登场了——重试和超时机制!
错误处理机制入门
首先,让我们回顾一下基础——Python 中的错误处理。我们使用 try-except
块来管理错误,防止它们破坏脚本的运行。
import requests
try:
response = requests.get('https://example.com')
response.raise_for_status() # 检查请求是否成功
except requests.exceptions.RequestException as e:
print(f'发生了一个错误: {e}')
2. 设置重试
为什么要使用重试机制?
一个脚本如果遇到第一个故障就放弃,简直就像一只害怕大雨的猫。而我们需要一个能够坚强面对几个困难的脚本。这就是我们配置重试的原因——让你的脚本更加自信。
如何设置重试机制
现在,让我们看看如何组织重试机制。最简单的方法之一是用 urllib3
库,它提供了自动在错误情况下重新发送请求的功能。
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. 超时:防止卡住
告别漫长的等待
超时就像闹钟:帮助你避免无限期等待服务器响应。设置超时后,你告诉脚本:“别等了!如果服务器在指定时间内没回应,就继续前进!”
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. 配置示例
使用重试实现稳定的脚本
现在让我们创建一个像钢铁侠盔甲一样稳定的脚本。我们将同时使用超时和重试。
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('成功下载了数据!')
使用超时防止脚本卡住
我们已经展示了如何设置超时。现在让我们确保脚本不仅稳定,还能在长时间等待时合理响应。与其“卡住”,它会提醒主人:“嘿,服务器想太久了,我不打算等了!”
这种简单而清晰的方法会让你的代码更可靠,并准备好应对可能发生的各种不可预测的情况。
实际应用
当你开发真实的抓取项目时,往往会遇到服务器方面的各种限制。重试和超时是你最好的朋友,用于最大限度地降低故障风险。这会帮助你确保代码的平稳运行,尤其是在自动化数据处理和需要按时得到精确结果的情况下。这些技巧还能提升你的简历质量以及客户对你提供数据的信任度。
GO TO FULL VERSION