2014-01-07 3 views
0

나는 rauth를 사용 중이며 Beatport API에 대한 호출을 요청하고 있습니다. 전화가 작동하지만 다음과 같은 오류가 발생할 수 있습니다. ConnectionError: HTTPSConnectionPool(host='oauth-api.beatport.com', port=443): Max retries exceeded with urlPython 요청 - ConnectionError - 최대 재시도 횟수를 초과했습니다.

여기 추적 코드입니다. 여기

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "scraper/songlist_top100.py", line 88, in <module> 
    'sortBy': 'releaseDate ASC'}) 
    File "C:\Python27\lib\site-packages\requests\sessions.py", line 347, in get 
    return self.request('GET', url, **kwargs) 
    File "C:\Python27\lib\site-packages\rauth\session.py", line 208, in request 
    return super(OAuth1Session, self).request(method, url, **req_kwargs) 
    File "C:\Python27\lib\site-packages\requests\sessions.py", line 335, in reques 
t 
    resp = self.send(prep, **send_kwargs) 
    File "C:\Python27\lib\site-packages\requests\sessions.py", line 438, in send 
    r = adapter.send(request, **kwargs) 
    File "C:\Python27\lib\site-packages\requests\adapters.py", line 327, in send 
    raise ConnectionError(e) 
ConnectionError: HTTPSConnectionPool(host='oauth-api.beatport.com', port=443): 
Max retries exceeded with url: /catalog/3/tracks?perPage=150& 
oauth_nonce=xxxxx&oauth_timestamp=xxxxx&facets=artistName%3A 
Avicii&oauth_signature_method=HMAC-SHA1&oauth_version=1.0& 
oauth_consumer_key=xxxxx&oauth_token=xxxxxx&sortBy=releaseDate+ASC 
&oauth_signature=xxxxx%3D&page=3 (Caused by <class 'httplib.BadStatusLine'>: '') 

from rauth import OAuth1Service 
import requests 
from hunt.models import DJ, Song 

def get_obj_or_none(model, **kwargs): 
    try: 
     return model.objects.get(**kwargs) 
    except model.DoesNotExist: 
     return None 

beatport_login = 'xxx' 
beatport_pass = 'xxx' 

beatport = OAuth1Service(
    name='beatport', 
    consumer_key='xxxxx', 
    consumer_secret='xxxxx', 
    request_token_url= 'https://oauth-api.beatport.com/identity/1/oauth/request-token', 
    access_token_url='https://oauth-api.beatport.com/identity/1/oauth/access-token', 
    authorize_url='https://oauth-api.beatport.com/identity/1/oauth/authorize', 
    base_url='https://oauth-api.beatport.com/json/catalog') 

request_token, request_token_secret = beatport.get_request_token(method='POST', data={ 
    'oauth_callback': 'http://www.edmhunters.com'}) 

authorize_url = beatport.get_authorize_url(request_token) 

values = { 
    'oauth_token': request_token, 
    'username': beatport_login, 
    'password': beatport_pass, 
    'submit' : 'Login', 
} 

r = requests.post('https://oauth-api.beatport.com/identity/1/oauth/authorize-submit', data=values) 

verifier = r.url.split("oauth_verifier=",1)[1] 

tokens = beatport.get_raw_access_token(request_token, request_token_secret, method='POST', data={ 
    'oauth_verifier': verifier}) 

token_string = tokens.content 

access_token = token_string[token_string.find('=')+1:token_string.find('&')] 
access_token_secret = token_string[token_string.find('t=')+2:token_string.rfind('&s')] 

session = beatport.get_session((access_token, access_token_secret)) 

for dj in DJ.objects.all(): 
    r = session.get('https://oauth-api.beatport.com/catalog/3/tracks', params={'facets': "artistName:"+dj.name, 'perPage': 150}) 
    count_response = r.json() 
    results = [] 
    for i in range(1, count_response['metadata']['totalPages']+1): 
     r1 = session.get('https://oauth-api.beatport.com/catalog/3/tracks', params={'facets': "artistName:"+dj.name, 
                        'page': i, 
                        'perPage': 150, 
                        'sortBy': 'releaseDate ASC'}) 
     json_response = r1.json() 
     results += json_response['results'] 

    song_list = []  
    for song in results: 
     artists = [artist['name'] for artist in song['artists'] if str(artist['type'])=='artist'] 
     remixers = [artist['name'] for artist in song['artists'] if str(artist['type'])=='remixer'] 
     if not ((dj.name in artists) and ((dj.name not in remixers) if len(remixers)>0 else False)): 
      song_list.append(song) 

    for song in song_list: 
     artists = [artist['name'] for artist in song['artists'] if str(artist['type'])=='artist'] 
     remixers = [artist['name'] for artist in song['artists'] if str(artist['type'])=='remixer'] 
     artist_list = ', '.join(artists) 
     remixer_list = ', '.join(remixers) 
     song_name = song['name'] 
     if not(song_name.lower().find("feat.") == -1): 
      normal_name=song_name[0:song_name.lower().find("feat.")].rstrip() 
     else: 
      normal_name=song_name 

     genre_list=[] 
     for genre in song['genres']: 
      genre_list.append(genre['name']) 
     genres = ', '.join(genre_list) 

     if not get_obj_or_none(Song, name__iexact=song_name, artist=dj): 
      s = Song(song_id=song['id'], 
        name=song_name, 
        title=song['title'], 
        normalized_name=normal_name, 
        artist=dj, 
        artists=artist_list, 
        remixers=remixer_list, 
        release_date=song['releaseDate'], 
        slug=song['slug'], 
        artwork=song['images']['large']['url'], 
        genres=genres) 
      s.save() 
      print "Added song:", s.song_id, s.artist 

왜 내가 위에서 언급 한 오류를받을 수 있나요 내 스크립트입니다?

+0

추적 코드가 귀하의 코드와 전혀 일치하지 않는 것으로 보입니다. 서버는 빈 응답을 제공합니다 (응답이없는 경우). –

+0

@MartijnPieters 나는 오류와 관련이 없다고 생각하면서 응답 부분을 생략했다. 나는 응답 부분으로 코드를 업데이트했다. –

+0

왜 오류가 발생했는지는 알 수 없지만 세 번째 페이지에서 발생하는 것처럼 보입니다. 아마 페이지 1과 2가 성공했을 것입니다. Beatport와 함께해야 할 문제와 같은 것 같습니다. –

답변

1

마치 Beatport API에 과부하가 걸린 것처럼 보이며 때로는 연결을 조기에 닫습니다. 귀하의 첫 번째 요청 집합이 성공적으로 완료되었으므로 응답이 비어 있기 때문에 오류를 던진 것은 3 페이지입니다.

당신은 정말 비트 포트에게보고해야하지만, 당신은 아마도 요청을 다시 시도 requests 모듈을 지시하면이 문제를 해결할 수 :

from requests.adapters import HTTPAdapter 

# .... 

session = beatport.get_session((access_token, access_token_secret)) 
session.mount('https://oauth-api.beatport.com', HTTPAdapter(max_retries=5)) 

는 귀하의 요청을 오류가 발생한 경우 몇 번 더 시도합니다.

+0

하지만 요청을 다시 시도 할 때마다 지연을 추가 할 수 있습니까? – avi

+0

@avi : 아니요,하지만 지연을 추가하려면 [backoff'] (https://pypi.python.org/pypi/backoff)와 같은 타사 패키지를 사용할 수 있습니다. –

관련 문제