Requests: python 3의 μš”μ²­μ—μ„œ 잘λͺ»λœ 였λ₯˜ 처리 [μœ„μ˜ μ˜ˆμ™Έ 처리 쀑 λ‹€λ₯Έ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€]

에 λ§Œλ“  2019λ…„ 12μ›” 16일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: psf/requests

Python3이 μžˆλŠ” μš”μ²­ λΌμ΄λΈŒλŸ¬λ¦¬λŠ” μ˜ˆμ™Έλ₯Ό κ½€ λ‚˜μœ λ°©μ‹μœΌλ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€. python2μ—μ„œλŠ” 잘 μž‘λ™ν•©λ‹ˆλ‹€. python2 μ„€μΉ˜ μš”μ²­ λΌμ΄λΈŒλŸ¬λ¦¬μ™€ python3 μ„€μΉ˜ μš”μ²­ 라이브러리λ₯Ό λͺ¨λ‘ μ‚¬μš©ν•˜μ—¬ requests.get('https://api.github.com') μ‚¬μš©ν•˜μ—¬ GitHubλ₯Ό μš”μ²­ν•˜λ €κ³  ν–ˆμŠ΅λ‹ˆλ‹€. λ„€νŠΈμ›Œν¬κ°€ λ‹€μš΄λœ λ™μ•ˆ μš”μ²­μ΄ λ§Œλ“€μ–΄μ§€λ©΄ λ‹€λ₯΄κ²Œ μˆ˜ν–‰λ©λ‹ˆλ‹€. (λͺ¨λ“  μ˜ˆμ™ΈλŠ” λ‹€λ₯΄κ²Œ μ²˜λ¦¬λ©λ‹ˆλ‹€). python2와 python3 λͺ¨λ‘μ— μš”μ²­μ„ μ„€μΉ˜ν•˜κ³  μš”μ²­ μ‹œ 인터넷 연결을 μ œκ±°ν•˜μ—¬ 문제λ₯Ό μž¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄κ°€ μ‚¬μš©ν•œ μ½”λ“œ
import requests
requests.get('https://api.github.com')

λ‚΄ μ‹œμŠ€ν…œμ— requests==2.5.3 λ₯Ό μ„€μΉ˜ν–ˆκ³  버전을 requests==2.22.0 μ—…κ·Έλ ˆμ΄λ“œν•˜λ €κ³  μ‹œλ„ν–ˆμ§€λ§Œ μ—¬μ „νžˆ λ¬Έμ œκ°€ μ§€μ†λ©λ‹ˆλ‹€.

μ˜ˆμƒ κ²°κ³Ό

python2μ—μ„œλŠ” λ‹€μŒκ³Ό 같은 더 κΉ¨λ—ν•œ μ˜ˆμ™Έλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 65, in get return request('get', url, **kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 49, in request response = session.request(method=method, url=url, **kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 461, in request resp = self.send(prep, **send_kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 573, in send r = adapter.send(request, **kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 415, in send raise ConnectionError(err, request=request) requests.exceptions.ConnectionError: ('Connection aborted.', gaierror(-2, 'Name or service not known'))

μ‹€μ œ κ²°κ³Ό

`
역좔적(κ°€μž₯ 졜근 호좜 λ§ˆμ§€λ§‰):
파일 "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", 157ν–‰, _new_conn
(self._dns_host, self.port), self.timeout, **extra_kw
create_connection의 파일 "/usr/local/lib/python3.6/site-packages/urllib3/util/connection.py", 61ν–‰
socket.getaddrinfo(호슀트, 포트, μ œν’ˆκ΅°, socket.SOCK_STREAM)의 해상도:
getaddrinfo의 파일 "/usr/lib/python3.6/socket.py", 745ν–‰
_socket.getaddrinfo(호슀트, 포트, μ œν’ˆκ΅°, μœ ν˜•, ν”„λ‘œν† νƒ€μž…, ν”Œλž˜κ·Έ)의 res에 λŒ€ν•΄:
socket.gaierror: [Errno -2] 이름 λ˜λŠ” μ„œλΉ„μŠ€λ₯Ό μ•Œ 수 μ—†μŒ

μœ„μ˜ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” λ™μ•ˆ λ‹€λ₯Έ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

역좔적(κ°€μž₯ 졜근 호좜 λ§ˆμ§€λ§‰):
파일 "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", 672ν–‰, urlopen
청크 = 청크,
파일 "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", 376ν–‰, _make_request
self._validate_conn(conn)
파일 "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", 994ν–‰, _validate_conn
μ—°κ²°()
파일 "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", 라인 334, μ—°κ²°
conn = self._new_conn()
파일 "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", 169ν–‰, _new_conn
self, "μƒˆ 연결을 μ„€μ •ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€: %s" % e
urllib3.exceptions.NewConnectionError:: μƒˆ 연결을 μ„€μ •ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€: [Errno -2] 이름 λ˜λŠ” μ„œλΉ„μŠ€λ₯Ό μ•Œ 수 μ—†μŒ

μœ„μ˜ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” λ™μ•ˆ λ‹€λ₯Έ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

역좔적(κ°€μž₯ 졜근 호좜 λ§ˆμ§€λ§‰):
파일 "/usr/local/lib/python3.6/site-packages/requests/adapters.py", 449ν–‰, 보내기
μ‹œκ°„ 초과 = μ‹œκ°„ 초과
파일 "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", 720ν–‰, urlopen
λ©”μ†Œλ“œ, URL, 였λ₯˜=e, _pool=self, _stacktrace=sys.exc_info()[2]
파일 "/usr/local/lib/python3.6/site-packages/urllib3/util/retry.py", 쀄 436, 증뢄
MaxRetryError(_pool, url, error λ˜λŠ” ResponseError(원인)) λ°œμƒ
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.github.com', port=443): μ΅œλŒ€ μž¬μ‹œλ„ 횟수 초과: url: / (NewConnectionError('둜 인해 λ°œμƒ): μƒˆ 연결을 μ„€μ •ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€: [Errno -2] 이름 λ˜λŠ” μ„œλΉ„μŠ€λ₯Ό μ•Œ 수 μ—†μŒ',))

μœ„μ˜ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” λ™μ•ˆ λ‹€λ₯Έ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

역좔적(κ°€μž₯ 졜근 호좜 λ§ˆμ§€λ§‰):
파일 "", 1ν–‰, μ—μ„œ
파일 "/usr/local/lib/python3.6/site-packages/requests/api.py", 75ν–‰, get
λ°˜ν™˜ μš”μ²­('get', url, params=params, *kwargs)μš”μ²­ μ‹œ 파일 "/usr/local/lib/python3.6/site-packages/requests/api.py", 60ν–‰session.request(λ©”μ†Œλ“œ=λ©”μ„œλ“œ, url=url, * kwargs)λ₯Ό
μš”μ²­ μ‹œ 파일 "/usr/local/lib/python3.6/site-packages/requests/sessions.py", 533ν–‰
resp = self.send(μ€€λΉ„, *send_kwargs)파일 "/usr/local/lib/python3.6/site-packages/requests/sessions.py", 646ν–‰, 보내기r = adapter.send(μš”μ²­, * kwargs)
파일 "/usr/local/lib/python3.6/site-packages/requests/adapters.py", 516ν–‰, 보내기
μ—°κ²° 였λ₯˜ λ°œμƒ(e, μš”μ²­=μš”μ²­)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.github.com', port=443): URL둜 μ΅œλŒ€ μž¬μ‹œλ„ 횟수 초과: / (NewConnectionError('둜 인해 λ°œμƒ): μƒˆ 연결을 μ„€μ •ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€: [Errno -2] 이름 λ˜λŠ” μ„œλΉ„μŠ€λ₯Ό μ•Œ 수 μ—†μŒ',))

`

λ²ˆμ‹ 단계

import requests

μ‹œμŠ€ν…œ 정보

$ python -m requests.help
Python 2.7.15+ (Python2 version)
requests==2.5.3 (Requests version in python2)
=============================
Python 3.6.9 (Python3 version)
requests==2.5.3(Requests version in python3)
=============================
OS: Ubuntu 18.04.3 LTS

이 λͺ…령은 μš”μ²­ v2.16.4 μ΄μƒμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄,
μ‹œμŠ€ν…œμ— λŒ€ν•œ λͺ‡ 가지 κΈ°λ³Έ 정보λ₯Ό μ œκ³΅ν•˜μ‹­μ‹œμ˜€(Python 버전,
운영 체제, &c).

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

방금 같은 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 이 ν•΄κ²° 방법을 μ‚¬μš©ν•˜μ—¬ 였λ₯˜ 후에도 계속할 수 μžˆμŠ΅λ‹ˆκΉŒ?
λ‚΄ ν”„λ‘œκ·Έλž¨μ€ μ˜ˆμ™Έκ°€ λ°œμƒν•œ 후에 μ’…λ£Œλ˜μ–΄μ„œλŠ” μ•ˆλ˜μ§€λ§Œ κ·Έλ ‡κ²Œ ν•  방법을 찾지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  3 λŒ“κΈ€

λ‚˜λ„ 이 λ¬Έμ œμ— λΆ€λ”ͺμ³€μ§€λ§Œ 더 예쁜 좜λ ₯을 μœ„ν•œ ν•΄κ²° 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. μ—¬κΈ° μŠ€ν¬λ¦½νŠΈμ—μ„œ "from None"에 μ£Όλͺ©ν•˜μ‹­μ‹œμ˜€.

import requests
url = 'http://10.0.0.12/example/'
try:
    requests.get(url, timeout=2)
except requests.exceptions.RequestException:
    raise Exception('Failed to connect to %s' % url) from None

μœ„μ˜ 슀크립트λ₯Ό μ‹€ν–‰ν•˜λ©΄ 좜λ ₯이 훨씬 더 κΉ¨λ—ν•΄μ§‘λ‹ˆλ‹€.

$ python example.py
Traceback (most recent call last):
  File "example.py", line 6, in <module>
    raise Exception('Failed to connect to %s' % url) from None
Exception: Failed to connect to http://10.0.0.12/example/

Python3μ—μ„œλŠ” from None 만 ν•  수 있으며 이 PEPμ—μ„œ κ°€μ Έμ˜¨ 것 κ°™μŠ΅λ‹ˆλ‹€. https://www.python.org/dev/peps/pep-0409/

λ‚˜λ„ 이 λ¬Έμ œμ— λΆ€λ”ͺμ³€μ§€λ§Œ 더 예쁜 좜λ ₯을 μœ„ν•œ ν•΄κ²° 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. μ—¬κΈ° μŠ€ν¬λ¦½νŠΈμ—μ„œ "from None"에 μ£Όλͺ©ν•˜μ‹­μ‹œμ˜€.

import requests
url = 'http://10.0.0.12/example/'
try:
    requests.get(url, timeout=2)
except requests.exceptions.RequestException:
    raise Exception('Failed to connect to %s' % url) from None

μœ„μ˜ 슀크립트λ₯Ό μ‹€ν–‰ν•˜λ©΄ 좜λ ₯이 훨씬 더 κΉ¨λ—ν•΄μ§‘λ‹ˆλ‹€.

$ python example.py
Traceback (most recent call last):
  File "example.py", line 6, in <module>
    raise Exception('Failed to connect to %s' % url) from None
Exception: Failed to connect to http://10.0.0.12/example/

Python3μ—μ„œλŠ” from None 만 ν•  수 있으며 이 PEPμ—μ„œ κ°€μ Έμ˜¨ 것 κ°™μŠ΅λ‹ˆλ‹€. https://www.python.org/dev/peps/pep-0409/

방금 같은 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 이 ν•΄κ²° 방법을 μ‚¬μš©ν•˜μ—¬ 였λ₯˜ 후에도 계속할 수 μžˆμŠ΅λ‹ˆκΉŒ?
λ‚΄ ν”„λ‘œκ·Έλž¨μ€ μ˜ˆμ™Έκ°€ λ°œμƒν•œ 후에 μ’…λ£Œλ˜μ–΄μ„œλŠ” μ•ˆλ˜μ§€λ§Œ κ·Έλ ‡κ²Œ ν•  방법을 찾지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰