如何遵守 Spotipy 的 sleep_for_retry() 函数?

问题描述 投票:0回答:2

我一直在使用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() 函数中

python get google-colaboratory spotify spotipy
2个回答
1
投票

您的问题在于 Spotify 限制对其 API 的请求的方式。

如果超出这些限制,Spotify 将返回 429 状态代码(“请求过多”)和 Retry-After HTTP 标头,该标头告诉您的客户端在尝试下一个请求之前需要等待多少秒。

在您的例子中,Spotipy 使用 requests 库发出 HTTP 请求,并且默认情况下将请求设置为尊重 Retry-After 标头(这很好!)。当返回 429 状态代码时,请求库将在休眠了 Retry-After 标头指示的秒数后自动重试请求。这就是为什么您看到脚本挂在 time.sleep(retry_after) 行上;它正在等待重试时间过去。

所以我认为你可以使用默认的 Spotipy 配置开箱即用。


0
投票

这个问题解决了吗?只有某些功能受到速率限制,这太烦人了。

© www.soinside.com 2019 - 2024. All rights reserved.