에러
# 예시 코드
import requests
url = 'httpstat.us/200'
with requests.get(url) as r:
print(r.status_code)
위 예시 코드를 실행하면 다음과 같은 에러가 발생한다.
에러 예시
Traceback (most recent call last):
File "*.py", line 2, in <module>
with requests.get(url) as r:
^^^^^^^^^^^
File "*\Python\Python311\site-packages\requests\api.py", line 73, in get
return request("get", url, params=params, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "*\Python\Python311\site-packages\requests\api.py", line 59, in request
return session.request(method=method, url=url, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "*\Python\Python311\site-packages\requests\sessions.py", line 573, in request
prep = self.prepare_request(req)
^^^^^^^^^^^^^^^^
File "*\Python\Python311\site-packages\requests\sessions.py", line 484, in prepare_request
p.prepare(
File "*\Python\Python311\site-packages\requests\models.py", line 368, in prepare
self.prepare_url(url, params)
File "*\Python\Python311\site-packages\requests\models.py", line 439, in prepare_url
raise MissingSchema(
requests.exceptions.MissingSchema: Invalid URL 'httpstat.us/200': No scheme supplied. Perhaps you meant https://httpstat.us/200?
해결방법
요청을 보낼 url 주소에 URI scheme을 추가한다.
이 경우 유효한 URI scheme은 http:// 또는 https:// 프로토콜이다.
import requests
url = 'https://httpstat.us/200'
with requests.get(url) as r:
print(r.status_code)
>> 200
설명
일반적으로 사용하는 URI scheme은 http나 https와 같은 웹사이트에서 사용하는 프로토콜이다.
그러나, 실제로 제공되는 scheme은 정말 많고 다양한데, 이 링크에서 그것들을 확인할 수 있다.
일부 예시를 가져오자면 ftp://, chrome://, blob://, file://, fax://, dns://등이 있다.
requests doc에서 URI scheme과 관련된 설명을 찾아보는 것은 실패했으나, 추정컨데 URI scheme으로 인한 문제를 사전에 방지하기 위한 것이 목적으로 보인다.
requests 모듈의 models.py를 확인해보면 다음과 같이 처리해둔 것을 확인할 수 있다.# /requests/models.py line 432 ~ 442
# Support for unicode domain names and paths.
try:
scheme, auth, host, port, path, query, fragment = parse_url(url)
except LocationParseError as e:
raise InvalidURL(*e.args)
if not scheme:
raise MissingSchema(
f"Invalid URL {url!r}: No scheme supplied. "
f"Perhaps you meant https://{url}?"
)