OZ1NG의 뽀나블(Pwnable)

[Tips] [Python] requests 모듈 - 429 에러 본문

Tips

[Tips] [Python] requests 모듈 - 429 에러

OZ1NG 2021. 2. 3. 00:25

requests.get(URL).text 로 API의 값을 읽어오다 보면

 

requests.get(URL).status_code는 429 코드를 남기고 (정상적인 경우에는 200)

requests.get(URL).text에 Too many API requests.라는 내용이 남으며

Traceback (most recent call last):
  File "c:\Users\000\Desktop\test.py", line 38, in Get_price_json
    json_result = json.loads(response_text) # response_text = requests.get(URL).text
  File "C:\Users\000\AppData\Local\Programs\Python\Python36-32\lib\json\__init__.py", line 354, in loads
    return _default_decoder.decode(s)
  File "C:\Users\000\AppData\Local\Programs\Python\Python36-32\lib\json\decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\000\AppData\Local\Programs\Python\Python36-32\lib\json\decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

json.loads(requests.get(URL).text)를 할때 위와 같이 decode 중에 예외를 보내어 함수가 멈추게 된다.

 

이 때 requests.get(URL).encoding을 보면 값이 'utf-8'로 되어 있는 것을 알 수 있는데

(정상적인 경우에는 'UTF-8', 대문자이다.)

혹시나 이게 문제일까봐 encoding값을 'UTF-8' 대문자로 바꿔봐도 고쳐지지는 않았다.

 

문제는 처음에 말했던 429 error code가 문제인데, 이는 요청 수가 특정 시간 동안 처리 될 수 있는 속도를 초과할 때

발생하는 문제라고 한다.

 

따라서 해결방법으로는 

1) time.sleep()을 사용해서 약간의 지연시간을 주는 것이 있다.

약 0.1초 정도 주었더니 어느정도 해결은 되었었다.

하지만 완벽히 해결된 것은 아니라 가끔씩 튀어나와 프로그램이 중간에 멈추는 일이 발생하였다.

따라서 이 방법을 시도한다면 시간 값을 적절히 세팅하는 것에 주의해야 할 것 같다.

 

2) try: execpt: 구문으로 재귀 사용

나는 속도가 중요했기 때문에 1)의 방법을 사용할 수는 없었다.

때문에 다른 방법을 생각하다가 

def test_func(test_arg1, test_arg2): 
	URL = "http://testURL.com/test?test_arg1="+test_arg1+"&test_arg2="+test_arg2
	try : 
	    response = requests.get(URL) 
	    print(response.status_code)
	    print(response.encoding) # test
	    response_text = response.text
	    json_result = json.loads(response_text)
	except:  
	    json_result = test_func(test_arg1, test_arg2)
	    pass
	finally:
	    return json_result

위와 같이 try: execpt: 구문 + 재귀 함수 사용하여 문제를 해결하였다.

(대충 코드를 요약하면 제대로 될때까지 시도한다는 뜻)

 

Comments