본문 바로가기
파이썬/python 문법 & 이론 실습

urllib 패키지, requests 차이

by Bentist 2021. 12. 27.

파이썬 urllib, requests 차이

 

파이썬에서 웹 클라이언트(HTTP 요청 등)를 개발하기 위해 주로 파이썬 기본 패키지 urllib을 사용해왔다.

최근에는 사용자 친화적인 문법을 사용하여 다루기 쉽고 안정성이 뛰어난 requests 패키지를 더 많이 쓴다.

 

참조: https://docs.python-requests.org/en/master/user/quickstart/

 

기본 패키지가 아니므로, pip install을 통해 패키지 설치

pip install requests

1) 요청하기

urllib 패키지의 get 요청
import urllib.request
   
response = urllib.request.urlopen('https://bentist.tistory.com/')
requests 패키지의 get 요청
import requests

response = requests.get('https://bentist.tistory.com/')

위의 get 요청만 봐도 requests 패키지가 훨씬 직관적이고 사용하기 쉽게 느껴진다.

다른 HTTP 요청 메소드도 해당 메소드의 이름만 사용하면 되기 때문에 매우 직관적인 API를 제공한다.

>>> r = requests.put('https://httpbin.org/put', data = {'key':'value'})
>>> r = requests.delete('https://httpbin.org/delete')
>>> r = requests.head('https://httpbin.org/get')
>>> r = requests.options('https://httpbin.org/get')

2) 응답 상태

requests.status_code 로 확인한다.

import requests

r = requests.get('https://bentist.tistory.com')
r.status_code
>>> 200

r = requests.get('https://bentist.tistory.com/1000')
r.status_code
>>> 404

3) 응답 내용 확인

  • content 속성: 디코딩하지 않은, 바이너리 형식의 데이터를 그대로 읽어온다.
r.content

content로 받아온 데이터를 이해하고 싶으면, requests 패키지가 어떤 방식의 인코딩을 하는지 알아야 한다.

r.encoding 속성을 사용하면 요청에서 사용 중인 인코딩을 확인하고 변경할 수 있다.

r.encoding
>>> 'utf-8'

r.encoding = 'euc-kr'
r.encoding
>>> 'euc-kr'

encoding 메소드로 확인한 인코딩 방식은 'utf-8'이다. 따라서 content를 'utf-8'로 직접 디코딩하여 사용할 수도 있다.

 

  • text 속성: UTF-8로 인코딩된 코드를 문자열로 읽어온다.  text는 Requests의 응답 헤더를 보고 해당 객체의 인코딩을 추측하여 해당 인코딩 방식으로 디코딩 처리하여 보여준다.
r.text

응답 헤더를 확인하기 위해 headers 메소드를 사용해보면, 'utf-8'의 인코딩 방식이 사용되었음을 알 수 있다. 

 

  • json 속성: 응답 데이터가 JSON 형식이면 딕셔너리(dictionary) 객체로 읽어온다.
r.json()

만약, 요청한 페이지의 한글이 깨져나오는 경우가 발생한다면?

해당 html 페이지의 인코딩 방식을 확인해봐야 한다.

<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">

charset(문자 집합)이 'euc-kr' 인코딩 방식으로 사용된 걸 확인할 수 있다.

이럴 경우, 직접 디코딩과 인코딩 방식을 지정하면 된다.

# content로 데이터를 읽어올 경우
r.content.decode('euc-kr')

# text로 데이터를 읽어올 경우
r.encoding = 'euc-kr'
r.text

 

댓글