遵守 API 速率限制
让我们把关于错误处理的所学用起来。在本练习中,您会遇到一个「速率限制错误」(rate-limit error),这表示您在短时间内向服务器发送了过多请求。我们将通过实现一种权宜做法绕过速率限制,避免脚本失败。
您的音乐库包含超过 3500 首曲目。我们来通过检查每首曲目的 Length 属性,找出时长最长的曲目。
不过有个问题,/tracks API 的最大分页大小为 500 项,并且速率限制为每秒 1 个请求。我们编写的脚本在短时间内向服务器发送了太多请求。让我们来修复它!
requests 和 time 包已导入,并且我们已为您创建了以下变量:
longestTrackLength = 0
longestTrackTitle = ""
headers = {'Authorization': 'Bearer 8apDFHaNJMxy8Kt818aa6b4a0ed0514b5d3'}
page_number = 1
本练习是课程的一部分
Python 中的 API 入门
练习说明
- 首先在不修改代码的情况下运行本练习。您会注意到控制台输出
429 Client Error,这表明我们在短时间内向服务器发送了过多请求。 - 通过在 while 循环末尾使用
time包的sleep方法添加「暂停 3 秒」,来修复脚本。
交互式实操练习
通过完成这段示例代码来试试这个练习。
while True:
params = {'page': page_number, 'per_page': 500}
response = requests.get('http://localhost:3000/tracks', params=params, headers=headers)
response.raise_for_status()
response_data = response.json()
print(f'Fetching tracks page {page_number}')
if len(response_data['results']) == 0:
break
for track in response_data['results']:
if(track['Length'] > longestTrackLength):
longestTrackLength = track['Length']
longestTrackTitle = track['Name']
page_number = page_number + 1
# Add your fix here
____.____(3)
print('The longest track in my music library is: ' + longestTrackTitle)