sslv3 alert handshake failure 나 Max retries exceeded 는 대부분 다음 셋 중 하나다.
첫째, 짧은 시간에 너무 많이 요청해 상대가 끊는 경우다. 연결을 재사용하고 사이에 간격을 둔다. requests.Session 을 쓰는 것만으로도 크게 줄어든다.
둘째, 로컬 OpenSSL 이 오래돼 서버가 요구하는 TLS 버전이나 암호군을 맞추지 못하는 경우다. 파이썬과 urllib3·certifi 를 올린다.
셋째, 중간에 TLS 를 가로채는 프록시가 있는 경우다. 이때는 프록시의 CA 를 신뢰 목록에 넣는다. 검증을 끄는 것은 답이 아니다.
import ssl, urllib3
print(ssl.OPENSSL_VERSION)
재시도는 라이브러리에 맡긴다.
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
retry = Retry(total=5, backoff_factor=1.5,
status_forcelist=[429, 500, 502, 503, 504])
session.mount("https://", HTTPAdapter(max_retries=retry, pool_maxsize=4))