하얀설표 블로그




해결)requests.exceptions.MissingSchema: Invalid URL '*': No scheme supplied.





( 수정됨)


에러

# 예시 코드
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}?"
    )


공감 : 0







white.seolpyo.com