我一直在使用Spotify的spotipy api,并且我一直在向艺术家提出很多请求。我曾一度循环浏览 48,000 名 Spotify 艺术家并收集有关他们的一些信息。我意识到在该循环期间,正常函数已停止执行,并且卡在 sleep_for_retry() 上。我可以看到我的 python 笔记本中调用的函数序列,但它卡在了这里:
artist() > _get() >_internal_call() > request() > send() > send() > urlopen() > sleep() > sleep_for_retry()
我意识到我尝试提出这么多请求真的很愚蠢,而且很明显我在某些时候会被拒绝。但展望未来,我如何才能遵守他们的 sleep_for_retry() 函数?我在网上看到了一些关于使用 python 的时间库并执行类似操作的内容:
time.sleep(<some amount of time here>)
,但我不知道如何使用我的 Spotipy api 来实现它。
有人有这方面的经验吗?我喜欢 Spotipy API,我想继续使用它,但我不想发出超出其服务器处理能力的请求。
错误看起来像这样:
--> 321 return self._internal_call("GET", url, payload, kwargs)
322
323 def _post(self, url, args=None, payload=None, **kwargs):
/usr/local/lib/python3.9/dist-packages/spotipy/client.py in _internal_call(self, method, url, payload, params)
262
263 try:
--> 264 response = self._session.request(
265 method, url, headers=headers, proxies=self.proxies,
266 timeout=self.requests_timeout, **args
/usr/local/lib/python3.9/dist-packages/requests/sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
527 }
528 send_kwargs.update(settings)
--> 529 resp = self.send(prep, **send_kwargs)
530
531 return resp
/usr/local/lib/python3.9/dist-packages/requests/sessions.py in send(self, request, **kwargs)
643
644 # Send the request
--> 645 r = adapter.send(request, **kwargs)
646
647 # Total elapsed time of the request (approximately)
/usr/local/lib/python3.9/dist-packages/requests/adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
438 try:
439 if not chunked:
--> 440 resp = conn.urlopen(
441 method=request.method,
442 url=url,
/usr/local/lib/python3.9/dist-packages/urllib3/connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
874
875 response.drain_conn()
--> 876 retries.sleep(response)
877 log.debug("Retry: %s", url)
878 return self.urlopen(
/usr/local/lib/python3.9/dist-packages/urllib3/util/retry.py in sleep(self, response)
426
427 if self.respect_retry_after_header and response:
--> 428 slept = self.sleep_for_retry(response)
429 if slept:
430 return
/usr/local/lib/python3.9/dist-packages/urllib3/util/retry.py in sleep_for_retry(self, response)
405 retry_after = self.get_retry_after(response)
406 if retry_after:
--> 407 time.sleep(retry_after)
408 return True
我尝试过这样做:
for i in range(0,5000):
time.sleep(15)
currentResults = spotify.artist(uniqueIds[i])
if (currentResults['popularity'] > 23):
popularIds2.append(uniqueIds[i])
但它仍然卡在 sleep_for_retry() 函数中
您的问题在于 Spotify 限制对其 API 的请求的方式。
如果超出这些限制,Spotify 将返回 429 状态代码(“请求过多”)和 Retry-After HTTP 标头,该标头告诉您的客户端在尝试下一个请求之前需要等待多少秒。
在您的例子中,Spotipy 使用 requests 库发出 HTTP 请求,并且默认情况下将请求设置为尊重 Retry-After 标头(这很好!)。当返回 429 状态代码时,请求库将在休眠了 Retry-After 标头指示的秒数后自动重试请求。这就是为什么您看到脚本挂在 time.sleep(retry_after) 行上;它正在等待重试时间过去。
所以我认为你可以使用默认的 Spotipy 配置开箱即用。
这个问题解决了吗?只有某些功能受到速率限制,这太烦人了。