[python] 요청시 URL로 최대 재시도 횟수 초과

App Store> Business 의 내용을 얻으려고합니다 .

import requests
from lxml import html

page = requests.get("https://itunes.apple.com/in/genre/ios-business/id6000?mt=8")
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)

range와 함께 시도하면 (0,2)작동하지만 rangein을 넣으면 100다음 오류가 표시됩니다.

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)



답변

여기서 일어난 일은 itunes 서버가 연결을 거부 한다는 것입니다 (짧은 시간에 동일한 IP 주소에서 너무 많은 요청을 보내고 있습니다)

URL에서 최대 재시도 횟수를 초과했습니다 : / in / app / adobe-reader / id469337564? mt = 8

오류 추적은 “대상 시스템이 적극적으로 거부했기 때문에 연결할 수 없습니다” 와 같이 잘못 오도됩니다 .

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

이 문제를 해결하려면 (디스플레이 추적을 오도하는 문제가 아닌) 연결 관련 예외를 다음과 같이 잡아야합니다.

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

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

from time import sleep

모든 요청에서 모두 훌륭한 파이썬 라이브러리입니다. 문제가 해결되기를 바랍니다.


답변

requests'기능 만 사용하십시오 .

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)

GET경우 URL 이 3 번 재 시도 requests.exceptions.ConnectionError됩니다. backoff_factor정기적 인 요청 할당량의 경우 다시 실패하지 않도록 시도 사이에 지연을 적용하는 데 도움이됩니다.

한 번 봐 requests.packages.urllib3.util.retry.Retry, 그것은 단순화 시도 할 수있는 여러 가지 옵션이 있습니다.


답변

그냥하세요

대신 다음 코드를 붙여 넣습니다 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

천만에요 🙂


답변

pip install pyopenssl 나를 위해 그것을 해결하는 것 같았습니다.

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


답변

비슷한 문제가 있지만 다음 코드가 저에게 효과적이었습니다.

url = <some REST url>
page = requests.get(url, verify=False)

“verify = False”는 SSL 확인을 비활성화합니다. 평소처럼 try and catch를 추가 할 수 있습니다.


답변

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

    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 주소가 차단되면 변경할 수있는 사용자 정의 함수입니다. 이 기능없이 갈 수 있습니다.


답변

회사 환경에서 프록시를 지정하면 해결되었습니다.

page = requests.get("http://www.google.com:80", proxies={"http": "http://111.233.225.166:1234"})

전체 오류는 다음과 같습니다.

requests.exceptions.ConnectionError : HTTPSConnectionPool (host = ‘www.google.com’, port = 80) : 최대 재시도 횟수가 url을 초과했습니다 : / (NewConnectionError ( ‘: 새로운 연결을 설정하지 못했습니다 : [WinError 10060] 일정 시간이 지난 후 연결된 당사자가 제대로 응답하지 않아서 실패했거나 연결된 호스트가 응답하지 않아서 설정된 연결에 실패했습니다. ‘))