Unexpected end of file from server, API 호출량 조절하기

Alex·2024년 8월 25일

GenAI해커톤

목록 보기
2/9

DART에서 API는 하루 2만번씩 호출이 가능하다.
그래서, 사실 모든 비상장기업+상장기업의 분기보고서를 가져오는 것이 어렵지 않을 거라고 생각했다.

하지만, 예상과 전혀 달랐다.
우선, 공시 정보를 호출하기 위한 API를 불렀을 때 계속 dcmNo(문서번호)가 null로 나왔다. 왜 자꾸 이런 문제가 뜨는지... 이해가 안됐다.

흐름은 다음과 같았다.

공시정보API를 호출해서 받은 2024년도의 분기 보고서에서 rcpNo를 가져온다.

이걸 기반으로

https://dart.fss.or.kr/dsaf001/main.do?rcpNo={rcpNo}를 만들어서 URL에 접속하면 해당 보고서가 뜬다.

여기서 Jsoup으로 HTML코드를 뜯어서 dcmNo를 가져온다.
rcpNo와 dcmNo가 있어야 이 PDF를 다운로드 할 수 있는 URL을 만들 수 있기 때문이다.

그런데 자꾸 dcmNo가 있는데도 최종적으로 만들어진 결과물에 dcmNo가 파싱돼서 나오지 않았다.

Unexpected end of file from server

또 다른 문제였다. 계속 API를 호출할 때마다 이런 에러가 발생했다. 왜 그런거지?... 갑자기 DART 사이트는 접속도 되지 않았다.

이런 일이 처음이어서 뭐가 잘못된건지 찾아보다가

디버깅을 해보니 try catch 부분에서 계속 예외가 터져서 API 호출이 안되는 거란 걸 알게 됐다.

검색을 하고서
내 IP가 BOT으로 판단돼서 차단이 된 것이라는 걸 알게 됐다.

DART에서는 1분당 몇번 이상의 API호출이 오면 차단이 되는 거 같았다.
https://dart.fss.or.kr/dsaf001/main.do?rcpNo={rcpNo}이 URL을 계속 Jsoup으로 들어가는 것도 BOT으로 여겨져서 차단당했다.

BOT으로 판단되는 상황이 1)짧은 시간에 API를 과도하게 호출했을 때 2)특정 URL로 계속 접속하려고 할 때 이 두가지 상황이었다.

이걸 어떻게 해결해야할지 고민하다가

1)IP를 계속 변경해서 우회해라
2)API호출량을 조절해라

두 가지 조언을 받았다.

그런데, Claude에게 물어보니 1번이 이용약관 위배에 해당할 수 있다고 한다... 그래서, 좀더 안전해 보이는 2번 선택지를 쓰기로 했다.

우선, 한번에 너무 많은 API 요청이 가지 않도록 요청을 한번 하고 스레드를 1초간 잠재웠다.

그리고, count를 세면서 API 요청 한번당 +1을 해주고, 100번이 됐을 때 60초간 스레드를 잠재웠다.

결과는 very good. API 요청량을 조절하니 조금 느리긴 하지만 다행이도 API 응답을 무사히 잘 한다.

이 결과물을 받기 위해서 이틀내내...얼마나 고생했는지 모른다...

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글