遵守 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)