파이썬(python) Requests 사용법 정리
Requests 는 파이썬에서 HTTP를 사용하기 위해 쓰여지는 라이브러리로, 기본 내장 라이브러리는 아니지만 거의 표준처럼 널리 쓰이고 있다. 개발 과정에서 많이 쓸법한 내용들만 뽑아서 정리했다. 이 글에 정리되지 않은 headers, cookies 등 작성하지 않은 내용은 링크를 참조바람.
https://docs.python-requests.org/en/master/user/quickstart/
API
어떤 방식(method)의 HTTP 요청을 하느냐에 따라서 해당하는 이름의 함수를 사용하면 된다.
GET 방식: requests.get()
POST 방식: requests.post()
PUT 방식: requests.put()
DELETE 방식: requests.delete()
Response status
온라인 서비스를 HTTP로 호출하면 상태를 응답받게 된다. 일반적으로 이 상태를 보고 요청이 잘 처리되었는지, 문제가 있는지 알 수가 있다. 상태 코드는 Response 객체의 status_code 속성을 통해 간단하게 얻을 수 있다.
>>> import requests
>>> response = requests.get("https://google.com")
>>> response.status_code
200
>>> response = requests.get("https://google.com/user/")
>>> response.status_code
404
HTTP status code는 아래 위키피디아 링크에서 확인할 수 있는데, Requests에서 지원하는 status code와 일부 차이가 있다.
https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
Requests에서 지원하는 status code의 종류는 아래 링크에서 확인할 수 있다.
https://github.com/psf/requests/blob/c45a4dfe6bfc6017d4ea7e9f051d6cc30972b310/requests/status_codes.py
Response 객체
요청(request)을 보내면 응답(response)을 python 객체로 받는다. 그리고 이 Response 객체는 많은 정보와 기능을 가지고 있다. 자주 쓰는 몇가지를 정리해보면
# 내가 보낸 request 객체에 접근 가능
response.request
# 응답 코드
response.status_code
# 200 (OK 코드)이 아닌 경우 에러 raise
response.raise_for_status()
# json response일 경우 딕셔너리 타입으로 바로 변환
response.json()
# content 속성을 통해 바이너리 타입으로 데이터를 받을 수 있다.
response.content
# text 속성을 통해 UTF-8로 인코딩된 문자열을 받을 수 있다.
response.text
# encoding 정보 확인
response.encoding
더 자세한 Response 객체의 속성과 함수는 아래 링크를 통해 확인할 수 있다.
https://github.com/psf/requests/blob/2ed84f55b22f19a1e1e8eea2e50963dce62052d3/requests/models.py
GET
get method로 데이터 보내기
import requests
# 1. 직접 입력해서 보내기
# url에 보내고자 하는 데이터를 입력해서 전송한다.
URL = "http://google.com?user=comp&num=42"
response = requests.get(URL)
print("status code :", response.status_code)
# 2. dict 이용하기
param = { "user" : "comp", "num" : 42 }
response = requests.get(URL, params=param)
print("status code :", response.status_code)
POST
HTTP 요청을 보내는 함수로 data 옵션을 사용하면, html 양식(form) 포맷의 데이터를 전송할 수 있고, json 또한 사용가능하다. 이 외에도 files 옵션을 통해 file을 전송할 수 있다.
import requests, json
URL = "https://google.com"
# data with json
data = {"outer": {"inner": "value"}}
response = requests.post(URL, data=data)
response = requests.post(URL, data=json.dumps(data))
# json
response = requests.post(URL, json={"name": "test"})
# files
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
TIMEOUT
timeout exception error를 raise 할 수 있다.
>>> requests.get('https://github.com/', timeout=0.001)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)