8.3. requests 모듈 둘러보기

서버-클라이언트 구조와 Request 종류를 살펴 보았으니, 실제로 파이썬 requests 모듈에 대해 조금 더 자세히 알아보겠습니다.

모든 내용을 모두 파악하기에는 내용이 방대하므로, 자주 사용하는 get(), post(), delete() 메서드를 중심으로 학습하겠습니다. 자세한 내용은 공식 문서를 참고해 주세요

8.3.1. get() 메서드 활용

기본 문법

# 개발자가 사용할 수 있는 파라미터 목록은 아래 표를 참고할 것
requests.get(url, params={key: value}, args)

개발자가 사용할 수 있는 get() 메서드의 파라미터

Parameter

Description

url

Required. 요청을 보낼 URL을 지정

params

Optional. 쿼리 스트링으로 보낼 사전, 튜플 목록 또는 바이트. 기본값: None

allow_redirects

Optional. 리디렉션을 허용할지 여부를 설정하는 불리언 값. 기본값: True (리디렉션 허용)

auth

Optional. 특정 HTTP 인증을 활성화하기 위한 튜플. 기본값: None

cert

Optional. 인증서 파일 또는 키를 지정하는 문자열 또는 튜플. 기본값: None

cookies

Optional. 지정된 URL로 보낼 쿠키의 사전. 기본값: None

headers

Optional. 지정된 URL로 보낼 HTTP 헤더의 사전. 기본값: None

proxies

Optional. 프로토콜에서 프록시 URL로의 매핑을 지정하는 사전. 기본값: None

stream

Optional. 응답을 즉시 다운로드할지 (False) 또는 스트리밍할지 (True)를 나타내는 불리언 값. 기본값: False

timeout

Optional. 클라이언트가 연결을 설정하고/또는 응답을 받기 위해 대기할 시간을 초 단위로 나타내는 숫자 또는 튜플. 기본값: None(연결이 닫힐 때까지 계속 요청)

verify

Optional. 서버의 TLS 인증서를 검증할지 여부를 나타내는 불리언 값 또는 문자열. 기본값: True


Return value (반환 값)

  • A requests.Response object.


간단 예제 ```python import requests

x = requests.get('https://w3schools.com')
print(x.status_code)
```

8.3.2. put() 메서드 활용

기본 문법

requests.post(url, data={key: value}, json={key: value}, args)
# args: 전달할 키워드 인자, 없으면 생략 가능

# timeout args를 추가하는 예제
# 개발자가 사용할 수 있는 파라미터 목록은 아래 표를 참고할 것
requests.post(url, data = myobj, timeout=2.50)

개발자가 사용할 수 있는 post() 메서드의 파라미터

Parameter

Description

url

Required. 요청을 보낼 URL을 지정

data

Optional. 지정된 URL로 보낼 사전, 튜플 목록, 바이트 또는 파일 객체. 기본값: None.

json

Optional. 지정된 URL로 보낼 JSON 객체. 기본값: None

files

Optional. 지정된 URL로 보낼 파일의 사전. 기본값: None.

allow_redirects

Optional. 리디렉션을 허용할지 여부를 설정하는 불리언 값. 기본값: True (리디렉션 허용)

auth

Optional. 특정 HTTP 인증을 활성화하기 위한 튜플. 기본값: None

cert

Optional. 인증서 파일 또는 키를 지정하는 문자열 또는 튜플. 기본값: None

cookies

Optional. 지정된 URL로 보낼 쿠키의 사전. 기본값: None

headers

Optional. 지정된 URL로 보낼 HTTP 헤더의 사전. 기본값: None

proxies

Optional. 프로토콜에서 프록시 URL로의 매핑을 지정하는 사전. 기본값: None

stream

Optional. 응답을 즉시 다운로드할지 (False) 또는 스트리밍할지 (True)를 나타내는 불리언 값. 기본값: False

timeout

Optional. 클라이언트가 연결을 설정하고/또는 응답을 받기 위해 대기할 시간을 초 단위로 나타내는 숫자 또는 튜플. 기본값: None(연결이 닫힐 때까지 계속 요청)

verify

Optional. 서버의 TLS 인증서를 검증할지 여부를 나타내는 불리언 값 또는 문자열. 기본값: True


Return value (반환 값)

  • requests.Response object.


간단 예제

import requests

# 서버로 보낼 데이터 준비
data = {
    'name': 'Hong',
    'age': 23,
    'msg': 'Hello world!',
}

# POST 방식으로 데이터를 실어서 요청
response = requests.post('https://api.example.com/data', data=data)

8.3.3. delete() 메서드 활용

기본 문법

requests.delete(url, args)
# args: 전달할 키워드 인자, 없으면 생략 가능

# timeout args를 추가하는 예제
# 개발자가 사용할 수 있는 파라미터 목록은 아래 표를 참고할 것
requests.delete(url, timeout=2.50)

개발자가 사용할 수 있는 post() 메서드의 파라미터

Parameter

Description

url

Required. 요청을 보낼 URL을 지정.

allow_redirects

Optional. 리디렉션을 허용할지 여부를 설정하는 불리언 값. 기본값: True (리디렉션 허용)

auth

Optional. 특정 HTTP 인증을 활성화하기 위한 튜플. 기본값: None

cert

Optional. 인증서 파일 또는 키를 지정하는 문자열 또는 튜플. 기본값: None

cookies

Optional. 지정된 URL로 보낼 쿠키의 사전. 기본값: None

headers

Optional. 지정된 URL로 보낼 HTTP 헤더의 사전. 기본값: None

proxies

Optional. 프로토콜에서 프록시 URL로의 매핑을 지정하는 사전. 기본값: None

stream

Optional. 응답을 즉시 다운로드할지 (False) 또는 스트리밍할지 (True)를 나타내는 불리언 값. 기본값: False

timeout

Optional. 클라이언트가 연결을 설정하고/또는 응답을 받기 위해 대기할 시간을 초 단위로 나타내는 숫자 또는 튜플. 기본값: None(연결이 닫힐 때까지 계속 요청)

verify

Optional. 서버의 TLS 인증서를 검증할지 여부를 나타내는 불리언 값 또는 문자열. 기본값: True


Return value (반환 값)

  • requests.Response object.


간단 예제

import requests

x = requests.delete('https://w3schools.com/python/demopage.php')

print(x.text)

8.3.5. JSON 데이터 처리

requests 모듈은 JSON 데이터를 쉽게 처리할 수 있는 기능을 제공 응답 데이터를 JSON 형식으로 파싱하거나, 요청 시 JSON 데이터를 보낼 수 있습니다.

import requests

# GET 방식으로 요청하기
response = requests.get('https://api.example.com/data')

# RESPONSE에 json 데이터가 있는 경우 파이썬 dict 자료구조로 추출
json_data = response.json()

# json 데이터를 실어서 POST 방식으로 요청하기
response = requests.post('https://api.example.com/data', json={'key': 'value'})

8.3.6. 타임아웃 및 오류 처리

네트워크 요청 시 타임아웃을 설정할 수 있으며, 오류 발생 시 예외 처리를 통해 안전하게 코드를 실행할 수 있습니다.

import requests

try:
    response = requests.get('https://api.example.com/data', timeout=5)
    response.raise_for_status()

except requests.exceptions.Timeout:
    print('The request timed out')

except requests.exceptions.RequestException as e:
    print('An error occurred:', e)

8.3.7. 세션 및 쿠키 관리

Python의 requests 모듈에서 Session 객체를 사용하는 이유는 여러 가지가 있습니다. Session 객체를 사용하면 여러 요청 간에 설정, 쿠키, 연결 풀링 등을 공유할 수 있어 성능과 효율성을 향상시킬 수 있습니다. 다음은 Session 객체를 사용하는 주요 이유와 예시입니다.


연결 풀링(Connection Pooling)

Session 객체는 동일한 호스트에 대한 여러 요청 간에 연결을 재사용하므로, 새로운 연결을 설정하는 오버헤드를 줄일 수 있습니다. 이는 성능을 크게 향상시킬 수 있습니다.


쿠키 유지(Cookie Persistence)

Session 객체는 여러 요청 간에 쿠키를 유지 이를 통해 로그인 상태와 같은 세션 정보를 쉽게 관리할 수 있습니다.


공유된 설정(Shared Configuration)

Session 객체를 사용하면 기본 헤더, 인증 정보 등 공통 설정을 여러 요청에 쉽게 적용할 수 있습니다.


성능 향상(Performance Improvement)

연결 풀링과 쿠키 유지를 통해 성능이 향상됩니다. 이는 특히 동일한 서버에 반복적으로 요청을 보낼 때 유용

requests 모듈은 세션 객체를 통해 지속적인 연결을 유지하고, 쿠키를 관리할 수 있습니다. 이는 로그인 세션이나 상태를 유지하는 데 유용


기본적인 Session 사용

import requests

# Session 객체 생성
session = requests.Session()

# 공통 헤더 설정
session.headers.update({'User-Agent': 'my-app/0.0.1'})

# 첫 번째 요청
response = session.get('https://api.example.com/endpoint1')
print(response.status_code)
print(response.text)

# 두 번째 요청 (쿠키 및 설정이 유지됨)
response = session.get('https://api.example.com/endpoint2')
print(response.status_code)
print(response.text)

# 세션 종료
session.close()

쿠키 유지

import requests

# Session 객체 생성
session = requests.Session()

# 로그인 요청 (쿠키 저장)
login_data = {'username': 'user', 'password': 'pass'}
session.post('https://api.example.com/login', data=login_data)

# 로그인 후 다른 요청 (쿠키가 자동으로 사용됨)
response = session.get('https://api.example.com/profile')
print(response.status_code)
print(response.json())

# 세션 종료
session.close()

인증 정보 공유

import requests
from requests.auth import HTTPBasicAuth

# Session 객체 생성
session = requests.Session()

# 인증 정보 설정
session.auth = HTTPBasicAuth('username', 'password')

# 첫 번째 요청 (인증 정보가 자동으로 사용됨)
response = session.get('https://api.example.com/secure-data1')
print(response.status_code)
print(response.json())

# 두 번째 요청 (인증 정보가 자동으로 사용됨)
response = session.get('https://api.example.com/secure-data2')
print(response.status_code)
print(response.json())

# 세션 종료
session.close()

맨 위로 이동