해결)requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='httpstat.us', port=443): Read timed out.



작성시간 :





(수정됨)

에러

에러 예시

import requests
url = 'https://httpstat.us/200?sleep=4000'
with requests.get(url, timeout = 3) as r:
    print(r.status_code)

>> Traceback (most recent call last):
  File "c:\seolpyo\example.py", line 3, in <module> with requests.get(url, timeout = 0.2) as r: File "C:\seolpyo\python\Lib\site-packages\requests\api.py", line 73, in get
    return request("get", url, params=params, **kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\seolpyo\python\Lib\site-packages\requests\api.py", line 59, in request
     return session.request(method=method, url=url, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\seolpyo\python\Lib\site-packages\requests\sessions.py", line 589, in request
    resp = self.send(prep, **send_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\seolpyo\python\Lib\site-packages\requests\sessions.py", line 703, in send
    r = adapter.send(request, **kwargs)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\seolpyo\python\Lib\site-packages\requests\adapters.py", line 532, in send
    raise ReadTimeout(e, request=request)
requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='httpstat.us', port=443): Read timed out. (read timeout=3)

해결방법

requests.get 또는 requests.post 명령시 timeout 인수를 다음과 같이 여유있게 설정하면 된다.

import requests
url = 'https://httpstat.us/200?sleep=4000'
# https://white.seolpyo.com/
with requests.get(url, timeout = 5) as r:
    print(r.status_code)
>> 200

설명

파이썬 requests 모듈 사용시 설정된 timeout 시간(초)동안 통신 요청에 대한 응답이 돌아오지 않는 경우 ReadTimeout에러가 발생한다.
requests doc에서는 기본적으로 timeout 설정값을 설정하지 않으면 timeout 에러가 발생하지 않고, 응답이 올 때 까지 대기한다고 한다.
통신 요청을 하는 서버 상태에 따라 대기시간이 얼마나 길어질지 알 수 없기 때문에 무한대기상태를 원치 않는다면 timeout을 설정하라고 하고 있다.

추천하는 값은 기본 TCP 패킷 재전송 기간인 3의 배수보다 약간 크게 설정하는 것을 추천한다고 한다.

httpstat.us

httpstat.us는 다양한 크롤링 테스트를 할 수 있도록 도와주는 웹사이트다.
내가 설정한 옵션은 요청 후 4초 뒤에 http 200 응답을 보내달라는 설정을 사용했다.
4000인데 4초인 이유는 ms(millisecond, 밀리초)를 기준으로 하기 때문이다.
최대 5분까지 sleep 요청이 가능하다고 한다.

그 외 다양한 옵션들을 제공하고 있으므로 궁금하다면 사이트를 방문해보자.



태그



공유

하기






white.seolpyo.com