【问题标题】:Spotify Python API call timeout issuesSpotify Python API 调用超时问题
【发布时间】:2020-11-13 03:45:57
【问题描述】:

我在 Spotify API 调用中遇到错误。是否有解决这些超时问题的方法。 Python Spotify Code

TimeoutError Traceback(最近一次调用最后一次) C:\ProgramData\Anaconda3\lib\site-packages\urllib3\util\connection.py 在 create_connection(地址,超时,source_address,socket_options) 73 sock.bind(源地址) ---> 74 sock.connect(sa) 75回袜子

TimeoutError: [WinError 10060] 连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应

在处理上述异常的过程中,又发生了一个异常:

KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-11-eb4cef5ffdbb> in <module>
      5     #print(artist)
      6     #time.sleep(2)
----> 7     result = spotify.search(artist,search_type='artist')['artists']['items']
      8     #print(result)
      9     try:

<ipython-input-7-6a2d183a2f3a> in search(self, query, search_type)
     80         data = urlencode({"q": query, "type": search_type.lower()})
     81         lookup_url = f"{endpoint}?{data}"
---> 82         r = requests.get(lookup_url, headers=headers)#.json()
     83         if r.status_code not in range(200, 299):
     84             return {}

C:\ProgramData\Anaconda3\lib\site-packages\requests\api.py in get(url, params, **kwargs)
     74 
     75     kwargs.setdefault('allow_redirects', True)
---> 76     return request('get', url, params=params, **kwargs)
     77 
     78 

C:\ProgramData\Anaconda3\lib\site-packages\requests\api.py in request(method, url, **kwargs)
     59     # cases, and look like a memory leak in others.
     60     with sessions.Session() as session:
---> 61         return session.request(method=method, url=url, **kwargs)
     62 
     63 

C:\ProgramData\Anaconda3\lib\site-packages\requests\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    528         }
    529         send_kwargs.update(settings)
--> 530         resp = self.send(prep, **send_kwargs)
    531 
    532         return resp

C:\ProgramData\Anaconda3\lib\site-packages\requests\sessions.py in send(self, request, **kwargs)
    641 
    642         # Send the request
--> 643         r = adapter.send(request, **kwargs)
    644 
    645         # Total elapsed time of the request (approximately)

C:\ProgramData\Anaconda3\lib\site-packages\requests\adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
    437         try:
    438             if not chunked:
--> 439                 resp = conn.urlopen(
    440                     method=request.method,
    441                     url=url,

C:\ProgramData\Anaconda3\lib\site-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)
    668 
    669             # Make the request on the httplib connection object.
--> 670             httplib_response = self._make_request(
    671                 conn,
    672                 method,

C:\ProgramData\Anaconda3\lib\site-packages\urllib3\connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)
    379         # Trigger any extra validation we need to do.
    380         try:
--> 381             self._validate_conn(conn)
    382         except (SocketTimeout, BaseSSLError) as e:
    383             # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout.

C:\ProgramData\Anaconda3\lib\site-packages\urllib3\connectionpool.py in _validate_conn(self, conn)
    974         # Force connect early to allow us to validate the connection.
    975         if not getattr(conn, "sock", None):  # AppEngine might not have  `.sock`
--> 976             conn.connect()
    977 
    978         if not conn.is_verified:

C:\ProgramData\Anaconda3\lib\site-packages\urllib3\connection.py in connect(self)
    306     def connect(self):
    307         # Add certificate verification
--> 308         conn = self._new_conn()
    309         hostname = self.host
    310 

C:\ProgramData\Anaconda3\lib\site-packages\urllib3\connection.py in _new_conn(self)
    157 
    158         try:
--> 159             conn = connection.create_connection(
    160                 (self._dns_host, self.port), self.timeout, **extra_kw
    161             )

C:\ProgramData\Anaconda3\lib\site-packages\urllib3\util\connection.py in create_connection(address, timeout, source_address, socket_options)
     72             if source_address:
     73                 sock.bind(source_address)
---> 74             sock.connect(sa)
     75             return sock
     76 

KeyboardInterrupt: 

1
###########Create Data frame with required columns to be extracte


  [1]: https://i.stack.imgur.com/lCaz4.p

ng

【问题讨论】:

    标签: python api spotify


    【解决方案1】:

    我真的希望 spotipy 能在他们的包中解决这个问题,但尽管如此,这是我的解决方法:

    1. 导入错误类型

    如果你没有捕捉到这个确切的错误类型,你会因为你的捕捉是开放式的而给自己带来问题。例如,如果您的语法中有 TypeError 或其他内容,它将出错并转到您的 catch 块,您将无法知道它一开始就出错了。

    from requests.exceptions import ReadTimeout

    1. 当您初始化您的 spotipy 客户端时,我建议您添加几个可能有用的参数。
    spotify = spotipy.Spotify(auth=spotify_token, requests_timeout=10, retries=10)
    
    • requests_timeout |几秒钟后抛出您正在寻找的相同错误。我使用它只是为了让它不会永远挂起,如果 10 秒后没有任何回复,它只会重试请求。
    • 重试 |如果出现错误,spotipy 将请求的最大重试次数。我认为它默认为 3,所以我只是想增加一点以防万一。
    1. 运行 try/except 类型的重试系统

    如果它一直挂起,您绝对可以扩展它以使其继续重试(使用while循环或其他东西),但这是基本思想:

    try:
    
      result = spotify.search(artist,search_type='artist')['artists']['items']
    
    except ReadTimeout:
    
      print('Spotify timed out... trying again...')
      result = spotify.search(artist,search_type='artist')['artists']['items']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-15
      • 2021-07-04
      • 2022-11-18
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多