본문 바로가기

카테고리 없음

[웹크롤링] URL에 한글을 넣었더니 문제가 발생했다: 퍼센트 인코딩(percent-encoding)을 알아보자

웹브라우저에서 지금 보고 있는 사이트의 주소를 복사해서 다른 곳에 붙여 넣었더니, 한글은 온데간데없이 사라지고 왠 %로 시작하는 이상한 문자가 대신 들어가 있는 것을 본 적이 있으신가요. 바로 URL 인코딩 때문입니다. 

 

파이썬으로 크롤링을 진행할 때도 이 한글이 종종 문제가 되는데요. 오늘은 그 해결 방법을 알아보겠습니다.

 

퍼센트 인코딩이란

퍼센트 인코딩(percent-encoding)은 URL에 문자를 표현하는 문자 인코딩 방법으로 영문자, 숫자, 몇몇 기호만을 사용하여 문자를 나타냅니다. 이 외에 한글, 한자, 특수문자 등은 사용할 수 없습니다. 

때문에 파이썬에서 한글 포함된 URL 주소에 요청을 보내면 오류가 발생하게 됩니다. 다행히 이 오류를 피하는 방법이 있습니다.

 

첫 번째 방법은 한글 텍스트를 퍼센트 인코딩하는 하는 것입니다.

import urllib
urllib.parse.quote('행주')
# %ED%96%89%EC%A3%BC

 

두 번째 방법은 requests 라이브리를 사용해서 요청을 보낼 때 params 매개변수를 함께 사용하는 것입니다.

import requests
url = '주소'
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get(url, params=payload)

 

예시

지마켓에서 '노트북'이라는 키워드로 검색을 했습니다. 이때 주소창을 잘 보면 노트북이라는 한글 문자가 퍼센트 인코딩 된 것을 볼 수 있습니다. 파이썬에서 퍼센트 인코딩 처리를 하는 예제를 다루어보겠습니다.

 

 

 

1) 한글 텍스트를 직접적으로 퍼센트 인코딩하는 경우

# 라이브러리 가져오기
import requests
from bs4 import BeautifulSoup
import urllib
# 검색 키워드 퍼센트 인코딩 처리
keyword = '노트북'
keyword = urllib.parse.quote(keyword)
url = f'http://browse.gmarket.co.kr/search?keyword={keyword}'
# HTTP 요청 및 처리
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
keyword = soup.select('.box__keywords .list__keywords li')
for word in keyword:
    print(word.get_text())

 

2) params 매개변수를 이용하는 경우

url = f'http://browse.gmarket.co.kr/search'
payload = {'keyword': '노트북'}
r = requests.get(url, params=payload)
soup = BeautifulSoup(r.text, 'html.parser')
keyword = soup.select('.box__keywords .list__keywords li')
for word in keyword:
    print(word.get_text())

 

두 코드 모두 상품 연관검색어를 출력해줍니다.

 

 

- 이 글은 아나콘다(Anaconda3)가 설치된  주피터 노트북에서 작성되었습니다.