Python에서 HTTP 요청을 보내는 모듈인 requests를 간단하게 정리하고자 한다.
import requests
URL = 'http://www.tistory.com'
response = requests.get(URL)
response.status_code
response.text
웹브라우져에서 티스토리를 접속한 것과 똑같은 이야기이다. www.tistory.com 이라는 주소로 GET 요청(request)를 보냈고 서버에서는 그 요청을 받아 뭔가를 처리한 후 요청자인 나에게 응답(response)를 줬다. 우선 그 응답은 200 상태코드와 함께 왔다. 이는 티스토리 서버에서 잘 처리되어서 정상적인 응답을 보내줬다는 OK 싸인을 의미한다. 그리고 응답의 내용은? 보시다시피 HTML 코드.
params = {'param1': 'value1', 'param2': 'value'}
res = requests.get(URL, params=params)
응답 객체인 res
를 통해서 내가 실제로 던진 URL이 뭔지 확인해보았다. 내가 준 URL과 파라미터를 requests 모듈이 엮어서 적절한 새로운 요청을 만든 것이다. 내가 직접 URL을 저렇게 타이핑하는 것보다 파라미터를 딕셔너리 형식으로 정리하고 requests 모듈에 던져주는 것이 훨씬 좋다고 생각한다.
위의 내용과 같다, params
대신 data
라는 이름으로 주면 된다.
data = {'param1': 'value1', 'param2': 'value'}
res = requests.post(URL, data=data)
조금 더 복잡한 구조로 POST 요청을 해야 할 때가 있다. 이럴 때는 위의 방법처럼 순진하게 주면 안된다. 우리가 인지하고 있는 그 딕셔너리의 구조를 유지하면서 문자열로 바꿔서 전달해줘야 하는데(?), python에서 이 노동을 해주는 친구가 json
모듈이다.
import requests, json
data = {'outer': {'inner': 'value'}}
res = requests.post(URL, data=json.dumps(data))
별도의 헤더 옵션을 추가하고자 할 때는 headers
옵션을, 쿠키를 심어서 요청을 보내고 싶으면 cookies
옵션을 사용하면 된다
headers = {'Content-Type': 'application/json; charset=utf-8'}
cookies = {'session_id': 'sorryidontcare'}
res = requests.get(URL, headers=headers, cookies=cookies)
요청(request)을 보내면 응답(response)을 받는다. 당연히 이 응답은 python 객체로 받는다. 그리고 이 응답 객체는 많은 정보와 기능을 가지고 있다. ipython이나 jupyter notebook에서 <탭> 기능을 이용해서 직접 체험해보면 금방 파악이 가능하지만 여기에 몇 가지만 기록하겠다.
ipython 환경에서 res.<탭>을 통해 어떤 요소 및 함수가 있는지 살펴볼 수 있다.
res.request # 내가 보낸 request 객체에 접근 가능
res.status_code # 응답 코드
res.raise_for_status() # 200 OK 코드가 아닌 경우 에러 발동
res.json() # json response일 경우 딕셔너리 타입으로 바로 변환
추후에 시간이 된다면 SSL 인증에 관한 내용도 추가하도록 하고 싶다, 더 잘 알게 된다면.
참고 링크
공식 문서
http://docs.python-requests.org/en/master/user/quickstart/
django management 시스템 안에서 내 명령어 만들고 사용하기 (0) | 2016.10.09 |
---|---|
Python Celery with Redis: 비동기 작업 큐(queue) (0) | 2016.09.25 |
C/C++ dll로 만든 함수를 Python에서 사용 (feat. ctypes) (6) | 2016.06.11 |
PDFMiner 설치: Python에서 pdf를 html이나 text파일로 변환 (9) | 2016.04.30 |
Django Form에서 DOM class 설정 등의 front-end 조작법 (0) | 2016.04.02 |