복붙노트

[PYTHON] 최대 재시도 횟수가 URL 초과했습니다.

PYTHON

최대 재시도 횟수가 URL 초과했습니다.

나는이 URL "https://itunes.apple.com/in/genre/ios-business/id6000?mt=8"의 콘텐츠를 얻으 려하고이 오류를 보여줍니다.

Traceback (most recent call last):
  File "/home/preetham/Desktop/eg.py", line 17, in <module>
    page1 = requests.get(ap)
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 55, in get
    return request('get', url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 383, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 486, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 378, in send
    raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='itunes.apple.com', port=443): Max retries exceeded with url: /in/app/adobe-reader/id469337564?mt=8 (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)

코드는

url="https://itunes.apple.com/in/genre/ios-business/id6000?mt=8"
page = requests.get(url)
tree = html.fromstring(page.text)
flist=[]
plist=[]
for i in range(0,100):
    app = tree.xpath("//div[@class='column first']/ul/li/a/@href")
    ap=app[0]
    page1 = requests.get(ap)

범위를 (0,2)로 시도하면 작동하지만 범위를 100으로 설정하면이 오류가 표시됩니다.

해결법

  1. ==============================

    1.여기서 일어난 일은 아이튠즈 서버가 당신의 연결을 거부한다는 것입니다 (당신은 짧은 시간에 같은 IP 주소로부터 너무 많은 요청을 보내고 있습니다)

    여기서 일어난 일은 아이튠즈 서버가 당신의 연결을 거부한다는 것입니다 (당신은 짧은 시간에 같은 IP 주소로부터 너무 많은 요청을 보내고 있습니다)

    오류 추적은 "대상 컴퓨터가 적극적으로이를 거부했기 때문에 연결할 수 없습니다"와 같은 잘못된 것입니다.

    Github의 python.requests lib에 문제가 있습니다. 여기에서 확인하십시오.

    이 문제 (디버그 추적을 오도하는만큼 그리 큰 문제는 아닙니다)를 극복하기 위해 다음과 같은 연결 관련 예외를 잡아야합니다.

    try:
        page1 = requests.get(ap)
    except requests.exceptions.ConnectionError:
        r.status_code = "Connection refused"
    

    이 문제를 극복하는 또 다른 방법은 서버에 요청을 보내기에 충분한 시간 간격을 사용하여 파이썬에서 수면 (timeinsec) 함수 (수면을 가져 오는 것을 잊지 말 것)로 달성 할 수있는 경우입니다.

    from time import sleep
    

    모든 요청은 모두 멋진 파이썬 lib입니다. 희망이 당신의 문제를 해결합니다.

  2. ==============================

    2.요청 기능 만 사용하십시오.

    요청 기능 만 사용하십시오.

    import requests
    from requests.adapters import HTTPAdapter
    from requests.packages.urllib3.util.retry import Retry
    
    
    session = requests.Session()
    retry = Retry(connect=3, backoff_factor=0.5)
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    
    session.get(url)
    

    이것은 URL을 얻고 requests.exceptions.ConnectionError의 경우 3 번 재 시도합니다. backoff_factor는주기적인 요청 할당량의 경우 실패를 다시 피하려는 시도 사이의 지연을 적용하는 데 도움이됩니다.

    requests.packages.urllib3.util.retry.Retry를 살펴보면 재 시도를 단순화하는 많은 옵션이 있습니다.

  3. ==============================

    3.그냥 해.

    그냥 해.

    page = requests.get (url) 대신 다음 코드를 붙여 넣습니다.

    import time
    
    page = ''
    while page == '':
        try:
            page = requests.get(url)
            break
        except:
            print("Connection refused by the server..")
            print("Let me sleep for 5 seconds")
            print("ZZzzzz...")
            time.sleep(5)
            print("Was a nice sleep, now let me continue...")
            continue
    

    천만에요 :)

  4. ==============================

    4.pip 설치 pyopenssl이 나를 위해 그것을 해결하는 것 같았다.

    pip 설치 pyopenssl이 나를 위해 그것을 해결하는 것 같았다.

    https://github.com/requests/requests/issues/4246

  5. ==============================

    5.예외 처리는 항상 구현하는 것이 좋습니다. 예기치 않은 스크립트 종료를 막을뿐만 아니라 오류 및 정보 알림을 기록하는 데 도움이 될 수 있습니다. 파이썬 요청을 사용할 때 나는 예외를 잡는 것을 선호한다 :

    예외 처리는 항상 구현하는 것이 좋습니다. 예기치 않은 스크립트 종료를 막을뿐만 아니라 오류 및 정보 알림을 기록하는 데 도움이 될 수 있습니다. 파이썬 요청을 사용할 때 나는 예외를 잡는 것을 선호한다 :

        try:
            res = requests.get(adress,timeout=30)
        except requests.ConnectionError as e:
            print("OOPS!! Connection Error. Make sure you are connected to Internet. Technical Details given below.\n")
            print(str(e))            
            renewIPadress()
            continue
        except requests.Timeout as e:
            print("OOPS!! Timeout Error")
            print(str(e))
            renewIPadress()
            continue
        except requests.RequestException as e:
            print("OOPS!! General Error")
            print(str(e))
            renewIPadress()
            continue
        except KeyboardInterrupt:
            print("Someone closed the program")
    

    여기서 renewIPadress ()는 IP 주소가 차단되면 변경할 수있는 사용자 정의 함수입니다. 이 기능을 사용하지 않고 이동할 수 있습니다.

  6. ==============================

    6.나는 똑같은 문제가있어 내 경우에 가장 쉬운 해결책을 찾았다. 이것을 교체하십시오 :

    나는 똑같은 문제가있어 내 경우에 가장 쉬운 해결책을 찾았다. 이것을 교체하십시오 :

    url="https://itunes.apple.com/in/genre/ios-business/id6000?mt=8"
    

    이것으로 :

    url="http://itunes.apple.com/in/genre/ios-business/id6000?mt=8"
    

    차이점은 프로토콜에서 "s"입니다. 이것은 나의 문제를 해결했다.

  7. from https://stackoverflow.com/questions/23013220/max-retries-exceeded-with-url by cc-by-sa and MIT license