Python에서 HTTP 요청을 보내는 모듈인 requests를 간단하게 정리하고자 한다.

0. 기본적인 사용 방법

import requests
URL = 'http://www.tistory.com'
response = requests.get(URL)
response.status_code
response.text

python-requests-get-example

웹브라우져에서 티스토리를 접속한 것과 똑같은 이야기이다. www.tistory.com 이라는 주소로 GET 요청(request)를 보냈고 서버에서는 그 요청을 받아 뭔가를 처리한 후 요청자인 나에게 응답(response)를 줬다. 우선 그 응답은 200 상태코드와 함께 왔다. 이는 티스토리 서버에서 잘 처리되어서 정상적인 응답을 보내줬다는 OK 싸인을 의미한다. 그리고 응답의 내용은? 보시다시피 HTML 코드.

1. GET 요청할 때 parameter 전달법

params = {'param1': 'value1', 'param2': 'value'}
res = requests.get(URL, params=params)

python-requests-post-example

응답 객체인 res를 통해서 내가 실제로 던진 URL이 뭔지 확인해보았다. 내가 준 URL과 파라미터를 requests 모듈이 엮어서 적절한 새로운 요청을 만든 것이다. 내가 직접 URL을 저렇게 타이핑하는 것보다 파라미터를 딕셔너리 형식으로 정리하고 requests 모듈에 던져주는 것이 훨씬 좋다고 생각한다.

2. POST 요청할 때 data 전달법

위의 내용과 같다, 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))

3. 헤더 추가, 쿠키 추가

별도의 헤더 옵션을 추가하고자 할 때는 headers 옵션을, 쿠키를 심어서 요청을 보내고 싶으면 cookies 옵션을 사용하면 된다

headers = {'Content-Type': 'application/json; charset=utf-8'}
cookies = {'session_id': 'sorryidontcare'}
res = requests.get(URL, headers=headers, cookies=cookies)

4. 응답(Response) 객체

요청(request)을 보내면 응답(response)을 받는다. 당연히 이 응답은 python 객체로 받는다. 그리고 이 응답 객체는 많은 정보와 기능을 가지고 있다. ipython이나 jupyter notebook에서 <탭> 기능을 이용해서 직접 체험해보면 금방 파악이 가능하지만 여기에 몇 가지만 기록하겠다.

python-requests-response-objectipython 환경에서 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/

  • jseee 2017.04.11 17:12

    응답결과를 json 형태로 출력은 됩니다.
    그다음 이 데이터를 실제 프로그램에서 사용해야 하는데 어떻게 해야 할지 모르겠어요.
    내가 필요한 요소에 어떻게 접근할수 잇나요? 설명이 복잡하시면 어떤 것을 찾아 보면 되는지
    알려 주시면 검색해 보도록 하겠습니다.
    요청하는 방법을 찾다가 들어 왓는데 완전 원하는 답이었습니다. 감사합니다.

    BlogIcon 동건 2017.04.11 17:18 신고

    넵 json 형태는 결국 python 입장에서는 문자 데이터일 뿐입니다. 이 json을 python에서 편하게 다루게 해주는 모듈이 built-in으로 제공됩니다.

    예:
    import json
    # ... 생략 ...
    json_data = res.json()
    json_to_dict = json.loads(json_data)

    마지막 결과인 json_to_dict는 python dictionary 타입의 자료로 변환돼서, 바로 사용하실 수 있을 겁니다.

    python 공식 문서에 잘 설명되어 있으니 이를 읽어보시는 것을 추천합니다.
    https://docs.python.org/3/library/json.html

    도움이 되었으면 좋겟습니다 ;]

  • jseee 2017.04.11 19:17

    자세한 설명 감사합니다.

  • 누네니 2017.08.24 12:47

    안녕하세요. 여기서 설명해주신 방법으로 예를 들어 라즈베리파이에 센서(예를 들어 온습도 센서 등)를 연결한 후 실시간으로 수집되는 센서 값을 서버로 보낼수도 있을까요?

    BlogIcon 동건 2017.08.24 23:56 신고

    안녕하세요. 저는 라즈베리파이 관련한 경험이 없어서 답변을 드리지 못할 것 같습니다만... 잠깐의 구글링 결과, 라즈베리파이에서 requests 모듈을 사용하는 것에 문제가 있어보이지는 않습니다. 아래 링크들을 첨부해드립니다.

    https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=79312
    http://raspberrypi-aa.github.io/session4/requests.html
    https://www.learn2crack.com/2014/03/raspberry-pi-post-get.html

  • 2018.05.07 00:08

    비밀댓글입니다

  • BlogIcon 인베스트 2018.09.12 22:10 신고

    큰 도움받고 갑니다
    감사합니다

    BlogIcon 동건 2018.09.18 20:44 신고

    격려의 댓글 저도 감사드려요.

  • 잼잼 2018.10.11 23:11

    정말 큰 도움 받았어요! 감사합니다! 이후에도 파이썬, 크롤러 관련 좋은 게시글 기대할게요!!

  • 2019.05.08 17:25

    비밀댓글입니다

    BlogIcon 동건 2019.05.12 20:26 신고

    아고 답변이 늦어 죄송합니다. 지금 문제 상황이 명확하지 않아서 좀 더 많은 정보가 필요해 보입니다.

    1. data는 requests.post()에 들어가는 data인가요?

    2. 실제로 request를 날렸을 때의 response가 어떻게 나오나요? (status code, response body 등)

    2019.05.14 11:04

    비밀댓글입니다

    BlogIcon 동건 2019.05.18 14:15 신고

    제가 보기엔 HTTP request 자체에 문제가 있어보이지는 않은 것 같습니다. Python에서 GET으로 받은 시점 이후의 데이터를 알려주실 수 있으실까요?

    list.status_code 나 list.text 등의 내용을 봐야할 것 같습니다.

    그리고 fail이 난다는 말씀이, HTTP response로 "FAILadminHiadminHi"가 온다는 말씀이신지요..?

  • 유져1 2019.09.04 02:30

    감사합니다 큰 도움이 됐습니다!

  • snaag 2019.09.18 21:38

    좋은 글 감사합니다!