본문 바로가기
카테고리 없음

[Python] requests 실행시 hosting connection is disconnected 에러 해결

by 퍼포먼스마케팅코더 2023. 1. 29.
반응형

Python requests 실행시 hosting connection is disconnected 에러 해결

 

python requests 명령을 실행할 때 "hosting connection is disconnected"와 같은 오류가 발생하면 여러 가지 문제로 인해 발생할 수 있습니다. 가능한 원인 및 해결책은 다음과 같습니다:


연결하려는 서버가 중단되었거나 연결할 수 없습니다. 이는 네트워크 문제 또는 서버 자체의 문제 때문일 수 있습니다. 이 경우, 서버가 다시 백업되고 실행될 때까지 기다렸다가 요청을 다시 시도해야 합니다.

연결하려는 URL이 잘못되었습니다. URL이 올바른지, 올바른 프로토콜(http 또는 https)을 사용하고 있는지 다시 확인합니다.

네트워크 연결에 문제가 있습니다. 이것은 약한 와이파이 신호 또는 라우터의 문제 때문일 수 있습니다. 신호를 개선하려면 네트워크에 다시 연결하거나 라우터 가까이로 이동하십시오.

방화벽 또는 보안 설정이 연결을 차단하고 있습니다. 네트워크 또는 연결하려는 서버의 방화벽 때문일 수 있습니다. 방화벽을 일시적으로 사용하지 않도록 설정하여 문제가 해결되는지 확인할 수 있습니다.

동일한 IP 주소의 요청이 너무 많아 서버가 요청을 차단하고 있습니다. 이를 속도 제한이라고 합니다. 잠시 기다렸다가 다시 시도하거나 프록시를 사용할 수 있습니다.

계정 또는 IP 주소에 허용된 최대 연결 수를 초과했을 수 있습니다. 이 경우 서버 관리자에게 문의하여 추가 연결을 요청할 수 있습니다.

VPN을 사용할 때 일부 제한으로 인해 문제가 발생할 수 있습니다. VPN 연결을 끊은 후 다시 시도할 수 있습니다.

이러한 문제의 대부분은 통제할 수 없으며 잠시 기다렸다가 다시 시도하는 것이 가장 좋은 해결책입니다.
오류가 계속되면 서버 관리자에게 문의하여 도움을 요청할 수 있습니다. 문제의 원인에 대한 자세한 정보가 있을 수 있으며 해결책을 제공할 수 있습니다.

 

 

 

 

python requests 명령을 실행할 때 "hosting connection is disconnected"와 같은 오류가 발생합니다. 같은 IP 주소를 가진 요청이 너무 많고 서버가 요청을 차단하고 있기 때문입니다. 이것을 속도 제한이라고 합니다. 잠시 기다렸다가 다시 시도하거나 프록시를 사용할 수 있는 방법 외에 구체적인 방법을 실행할 수 있는 파이썬 코딩이 있다면 추천해주시고 구체적인 설명을 부탁드립니다.

 

 

Backoff 

 

Python 요청 라이브러리로 요청할 때 속도 제한을 처리하는 한 가지 방법은 Backoff 패키지를 사용하는 것입니다. Backoff 패키지는 사용자 지정 가능한 Backoff 전략을 사용하여 속도 제한으로 인해 실패한 요청을 자동으로 재시도할 수 있는 방법을 제공합니다. 다음은 Backoff 패키지를 사용하여 속도 제한을 처리하는 방법의 예입니다:

 

이 예에서는 make_request 함수를 정의하여 지정된 URL에 GET 요청을 수행합니다. 지수 백오프 전략을 사용하여 백오프 개체가 생성됩니다. factor 인수는 재시도 간 지연이 증가하는 속도를 지정하고 max_tries 인수는 최대 재시도 횟수를 지정합니다. 그런 다음 속도 제한의 경우 backoff(make_request)를 사용하여 요청을 재시도하는 데 backoff 개체가 사용됩니다. 시도 예외 블록은 예외 요청을 포착하는 데 사용됩니다.예외가 있습니다. Too ManyRedirects 속도 제한을 초과할 경우 "Too many requests"를 리디렉션하고 인쇄합니다. 이것은 간단한 예이며 요구 사항에 따라 전략을 사용자 정의할 수 있습니다.

 

import requests
from backoff import Backoff

def make_request():
    response = requests.get('https://example.com')
    response.raise_for_status()
    return response

# Create a backoff object with an exponential backoff strategy
backoff = Backoff(factor=2, max_tries=5)

# Use the backoff object to retry the request in case of rate limiting
try:
    response = backoff(make_request)
except requests.exceptions.TooManyRedirects:
    print('Too many requests')
else:
    print(response.text)
 

retry

함수 호출을 재시도하기 위한 간단한 장식자를 제공하는 retry와 같은 라이브러리를 사용할 수도 있습니다. 이러한 라이브러리를 사용하면 속도 제한을 보다 세련된 방식으로 처리할 수 있으므로 재시도 논리를 구현할 필요가 없습니다.
 
from retry import retry

@retry(tries=5, delay=5)
def make_request():
    response = requests.get('https://example.com')
    response.raise_for_status()
    return response

proxy

또 다른 해결책은 프록시 서버를 사용하여 요청하는 것입니다. 프록시 서버는 컴퓨터와 연결하려는 서버 간의 중개 역할을 합니다. 프록시 서버를 사용하면 IP 주소를 회전하고 속도 제한으로 인해 차단되는 것을 방지할 수 있습니다. requests-proxy와 같은 라이브러리를 사용하여 요청의 프록시 설정을 처리할 수 있습니다.

 

import requests
from requests_proxy import Proxy

proxies = {
    'http': 'http://10.10.1.10:3128',
    'https': 'http://10.10.1.10:1080',
}
response = requests.get('https://example.com', proxies=proxies)

 

다음은 python 요청 라이브러리와 함께 프록시를 사용하여 서버의 속도 제한을 무시하는 방법의 예입니다:

import requests

proxies = {
  'http': 'http://10.10.1.10:3128',
  'https': 'http://10.10.1.10:1080',
}

try:
    response = requests.get('http://example.com', proxies=proxies)
    response.raise_for_status()
    print(response.text)
except requests.exceptions.RequestException as err:
    print ("OOps: Something Else",err)
except requests.exceptions.HTTPError as errh:
    print ("Http Error:",errh)
except requests.exceptions.ConnectionError as errc:
    print ("Error Connecting:",errc)
except requests.exceptions.Timeout as errt:
    print ("Timeout Error:",errt)
 

이 코드에서 HTTP 및 HTTPS에 대한 프록시 서버의 IP 주소와 포트 번호가 포함된 사전이 만들어집니다. requests.get() 메서드는 지정된 URL로 GET 요청을 보내는 데 사용되며, proxies 매개 변수는 이전에 만든 프록시 사전으로 설정됩니다. 서버가 200이 아닌 상태 코드를 반환할 경우 요청합니다.예외 모듈은 예외를 발생시키고 오류 메시지를 인쇄하는 데 사용됩니다. 요청이 성공하면 응답 텍스트가 인쇄됩니다. 이렇게 하면 프록시를 사용할 수 있지만 프록시 서버가 중단되거나 연결하려는 서버에 의해 IP가 차단되는 등 프록시 자체의 문제와 제한 사항이 있습니다. 

 

 

Time Sleep

또한 시간 모듈을 사용하여 요청 간 지연을 추가하고 서버의 속도 제한에 도달하지 않도록 할 수 있습니다. 다음은 예입니다:
 
import time
import requests

for i in range(10):
    response = requests.get('http://example.com')
    print(response.status_code)
    time.sleep(5)
이 코드에서 for 루프는 지정된 URL로 10개의 GET 요청을 전송하는 데 사용됩니다. 시간이요.sleep() 기능은 각 요청 사이에 5초의 지연을 추가하는 데 사용됩니다. 이렇게 하면 서버의 속도 제한에 도달하지 않고 요청이 차단되지 않습니다.
 
 

Fake useragent

또 다른 방법은 IP 풀을 사용하여 요청을 작성하는 것입니다. 이렇게 하면 IP를 회전하여 IP당 요청 수 제한에 도달하지 않도록 할 수 있습니다.

fake_useragent와 같은 라이브러리를 사용하여 사용자 에이전트를 변경하고 회전 프록시 풀을 사용하여 IP 풀을 관리할 수 있습니다.

 

from fake_useragent import UserAgent
from rotating_proxies.policy import BanDetectionPolicy
from requests.exceptions import ProxyError
from rotating_proxies.pool import Pool

ua = UserAgent()

# You can also hardcode the headers
headers = {'User-Agent': ua.random}

# Create a pool of proxies
proxies = Pool(
    generator=lambda: 'http://user:password@proxy.com:port',
    max_size=10,
    policy=BanDetectionPolicy(ban_codes=(429, 403, 502))
)

# Make a request using the proxy pool
for proxy in proxies.get():
    try:
        response = requests.get('https://httpbin.org/get', headers=headers, proxies=proxy)

 

 
속도 제한을 피하는 또 다른 방법은 "backoff"라고 불리는 기술을 사용하는 것인데, 이것은 다른 요청을 하기 전에 일정 시간 동안 기다리는 방법입니다. 다음은 요청 라이브러리에서 백오프를 사용하는 방법의 예입니다:

 

 
import requests
from time import sleep

# Make the request
response = requests.get('https://example.com')

# Check if the request was successful
if response.status_code != 200:
    # Wait for a while before trying again
    sleep(5)
    response = requests.get('https://example.com')

# Print the response
print(response.content)

 

이 예에서는 먼저 요청을 하고 상태 코드가 200이 아닌지 확인합니다. 요청이 성공하지 못한 경우 sleep() 기능을 사용하여 5초간 기다린 후 다시 시도합니다.

또한 백오프와 같은 라이브러리를 사용하여 보다 정교한 방법으로 백오프를 처리할 수 있습니다. 이 라이브러리는 실패한 요청을 자동으로 재시도하고 실패할 때마다 지연 시간이 기하급수적으로 증가합니다.

 

from backoff import on_exception, expo

@on_exception(expo, requests.exceptions.RequestException, max_tries=8)
def make_request():
    response = requests.get('https://example.com')
    return response

response = make_request()
print(response.content)

 

이 예에서는 on_exception decorator를 사용하여 make_request() 함수가 요청할 때마다 지수 백오프 알고리즘을 사용하도록 지정합니다.예외가 있습니다.RequestException이 발생했습니다. max_tries 매개 변수는 8로 설정되어 있으며, 이는 함수가 포기하기 전에 최대 8번 재시도된다는 것을 의미합니다.

프록시 또는 백오프 기술을 사용하면 서버와의 연결이 끊기고 "호스트 연결이 끊어졌습니다" 오류가 발생하지 않도록 할 수 있습니다.

일부 웹 사이트에서는 프록시 서버에서 오는 요청을 탐지하고 차단하는 메커니즘을 구현했기 때문에 인증이 필요하지 않은 프록시를 사용하는 것이 항상 가능한 것은 아닙니다.

반응형

댓글