from urllib.parse import quote_plus
from urllib.parse import quote_plus
quote, quote_plus: 아스키코드 형식이 아닌 글자를 URL 인코딩
- urllib.parse.quote(string, safe='/', encoding='utf-8', errors='strict')
- string: 특수문자가 포함 된 문자열
- safe: 변환하지 않을 특수문자 지정
- encoding: 인코딩 방식
- errors: 인코딩 에러를 처리하는 방식
- return type: str
- urllib.parse.quote_plus(string, safe='', encoding='utf-8', errors='strict')
- string: 특수문자가 포함 된 문자열
- safe: 변환하지 않을 특수문자 지정
- default: ''
- default 값이 없음
- 변환하지 않을 특수문자를 따로 지정해줘야함
- encoding: 인코딩 방식
- errors: 인코딩 에러를 처리하는 방식
- return type: str
- quote와 quote_plus의 차이점
- 공백 변환
quote
: '%20'으로 변환
quote_plus
: '+'기호로 변환
- safe 인자의 기본 값 유무
quote
: default: '/'
quote_plus
: default: ''(default 값이 없음)
Python으로 Google 브라우저에서 '안녕하세요' 검색해보기
import requests
from urllib.parse import quote_plus
url_addr = "https://www.google.com/search?q={}\
&oq={}&aqs=chrome..\
69i57j35i39j46i131i199i433i465i512j0i131i433i512j46i131i199i433i465i512j0i3j46i131i340i433i512j0i3l2.1281j0j15\
&sourceid=chrome&ie=UTF-8"
special_literal = '안녕하세요'
url_addr_quote = url_addr.format(quote_plus(special_literal), quote_plus(special_literal))
response = requests.get(url_addr_quote)
print(response.status_code)
- Google에서 '안녕하세요' 검색
- URL을 확인해보니 q, oq key의 value가 'utf-8 형식으로 인코딩'된 것을 확인
- 목표
- urllib.parse.quote_plus의 인자로 '특수문자'를 전달하여 url 인코딩 하여 str로 반환
- quote_plus로 '안녕하세요'를 한글 -> utf-8로 인코딩 후 requets로 get 요청(get의 인자로 str(문자열) 전달)
- status_code로 응답이 제대로 되었는지 확인
- 결과

- '안녕하세요' 한글 특수문자가 utf-8 형식으로 인코딩 되어 URL에 추가된 것을 확인
- 이 URL을 통해 get 메서드로 HTTP 호출
urllib.parse.quote와 encode('ascii')의 차이점
urllib.parse.quote의 URL 인코딩?
- URL에 포함될 수 없는 문자들을 안전하게 전송할 수 있도록 인코딩 하는 함수
- RFC 3986 표준에 따라 URL의 Query String에 사용되는 문자들 중 일부 문자를 인코딩
- Quety String에 사용가능 한 문자(URL 인코딩에서 안전한 문자로 간주하는 것)
- 알파벳 (A-Z, a-z)
- 숫자 (0~9)
- 일부 특수문자 (- _ . ~)
- 이러한 'URL 인코딩에서 안전한 문자'는 URL 인코딩 될 때 변형 없이 그대로 포함될 수 있음
- 이외의 모든 문자들은 인코딩되어 문자열로 반환
- URL에 포함될 수 없는 문자(URL 인코딩 시에 안전하지 않은 문자)는 올바르게 해석하지 못할 수 있음
- 정리
- URL 인코딩에서 안전한 문자
- 변형없음
- URL 인코딩에서 안전하지 않은 문자
- utf-8 형식에 따라 인코딩되어 URL 문자열로 사용
- ASCII 문자라고 모두 'URL 인코딩에서 안전한 문자'는 아니다.
Query란?
- Query
- 데이터 베이스에서 데이터를 검색, 수정하기 위해 사용되는 명령문
Query String과 Query Parameter
-
Query String
-
Query Parameter
- Query String에 포함된 key=value 쌍 중에서 하나의 key=value 쌍을 의미
- 위 예에서 'q=python', 'category=books'는 각각의 하나의 Query Parameter
- Query String에 포함된 데이터를 '서버에서 사용할 수 있도록' 전달
내 생각 - urllib.parse.quote와 encode('ascii') 사용 방법
- Python으로 HTTP 요청을 통해 원하는 데이터 접근할 경우, 다음과 같은 방법으로 하면 될 것 같다.
- HTTP 요청을 할 url을 가져옴
- Query Paramter의 value 부분은 사용자가 입력하게함
- value 부분을 urllib.parse.quote로 특수문자를 인코딩
(인코딩 된 url은 str 타입)
- quote로 인코딩하면, URL 형식으로 특수문자가 인코딩
(인코딩 된 url은 str 타입)
- 4.1 requests 라이브러리로 get 요청시에는 이 URL을 바로 요청
- requests 라이브러리는 str 타입의 URL로 GET 요청 가능
- 4.2 socket으로 통신할 경우에는 URL str(문자열)은 encode('ascii')로 인코딩 후 요청
- byte 객체로 데이터를 요청해야 하므로, encode('ascii')로 인코딩 필요