
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 응답을 무사히 잘 한다.

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