====== 파이썬 Requests 라이브러리 사용 가이드 ====== 파이썬 Requests 라이브러리는 HTTP 요청을 위한 강력하고 사용자 친화적인 도구입니다. 이 라이브러리는 웹 서비스와 통신하고, API를 활용하며, 웹 스크래핑을 수행하는 데 필수적인 기능을 제공합니다. 표준 라이브러리의 ''urllib''에 비해 훨씬 직관적이고 간결한 API를 제공하여 개발자가 복잡한 HTTP 통신을 쉽게 처리할 수 있도록 돕습니다. 이 문서는 Requests 라이브러리의 설치부터 기본적인 GET/POST 요청, 고급 기능(세션, 인증 등)까지 폭넓게 다룹니다. 각 섹션에서는 실제 코드 예제를 통해 Requests의 다양한 활용법을 설명합니다. ===== 1. Requests 라이브러리 소개 및 설치 ===== 파이썬 Requests 라이브러리는 //인간을 위한 HTTP 라이브러리//를 표방하며, 복잡한 HTTP 요청을 단순화하여 개발 생산성을 크게 향상시킵니다. ---- ==== 1) 설치 방법 ==== Requests 라이브러리는 Python Package Index (PyPI)를 통해 쉽게 설치할 수 있습니다. 다음 명령어를 사용하여 설치합니다: pip install requests ---- ==== 2) 설치 확인 ==== 설치가 완료되었는지 확인하려면 파이썬 인터프리터에서 Requests를 임포트해봅니다. import requests print(requests.__version__) 오류 없이 버전 정보가 출력되면 정상적으로 설치된 것입니다. ===== 2. 기본적인 HTTP 요청 ===== Requests 라이브러리를 사용하여 가장 흔히 사용되는 HTTP 요청 메서드인 GET과 POST를 보내는 방법을 알아봅니다. ---- ==== 1) GET 요청 ==== GET 요청은 주로 서버로부터 데이터를 검색하는 데 사용됩니다. ''requests.get()'' 메서드를 사용합니다. * **기본 GET 요청** - 웹 페이지의 내용을 가져오는 가장 기본적인 방법입니다. import requests response = requests.get('https://www.example.com') print(response.status_code) print(response.text) * **쿼리 파라미터 전달** - URL에 쿼리 문자열을 추가하여 데이터를 전달할 때 ''params'' 인자를 사용합니다. import requests params = {'key1': 'value1', 'key2': 'value2'} response = requests.get('https://httpbin.org/get', params=params) print(response.url) print(response.json()) ---- ==== 2) POST 요청 ==== POST 요청은 주로 서버에 데이터를 제출하거나 생성할 때 사용됩니다. ''requests.post()'' 메서드를 사용합니다. * **폼 데이터 전송** - HTML 폼과 유사하게 ''data'' 인자를 사용하여 데이터를 전송합니다. import requests data = {'username': 'testuser', 'password': 'password123'} response = requests.post('https://httpbin.org/post', data=data) print(response.json()) * **JSON 데이터 전송** - RESTful API 통신에서 흔히 사용되며, ''json'' 인자를 사용합니다. Requests는 자동으로 ''Content-Type'' 헤더를 ''application/json''으로 설정합니다. import requests json_data = {'title': 'foo', 'body': 'bar', 'userId': 1} response = requests.post('https://jsonplaceholder.typicode.com/posts', json=json_data) print(response.status_code) print(response.json()) ---- ==== 3) 응답 객체 다루기 ==== HTTP 요청 후 반환되는 ''Response'' 객체는 다양한 유용한 속성과 메서드를 제공합니다. * **주요 속성 및 메서드** - 다음 표는 ''Response'' 객체의 주요 항목을 요약한 것입니다. ^ 속성/메서드 ^ 설명 ^ 예시 ^ | ''status_code'' | HTTP 응답 상태 코드 (예: 200, 404) | ''response.status_code'' | | ''text'' | 응답 내용을 유니코드 텍스트로 반환 | ''response.text'' | | ''content'' | 응답 내용을 바이트로 반환 | ''response.content'' | | ''json()'' | 응답 내용을 JSON으로 파싱하여 반환 (오류 발생 시 예외) | ''response.json()'' | | ''headers'' | 응답 헤더를 딕셔너리 형태로 반환 | ''response.headers'' | | ''url'' | 요청에 사용된 최종 URL | ''response.url'' | | ''raise_for_status()'' | 4xx 또는 5xx 클라이언트/서버 오류 발생 시 예외 발생 | ''response.raise_for_status()'' | ---- ==== 4) 사용자 정의 헤더 ==== 요청에 사용자 정의 HTTP 헤더를 추가하려면 ''headers'' 인자에 딕셔너리 형태로 전달합니다. import requests headers = { 'User-Agent': 'MyCustomApp/1.0', 'Accept': 'application/json' } response = requests.get('https://httpbin.org/headers', headers=headers) print(response.json()['headers']) ---- ==== 5) 타임아웃 설정 ==== 요청이 너무 오래 걸리는 것을 방지하기 위해 ''timeout'' 인자를 사용하여 초 단위로 타임아웃을 설정할 수 있습니다. import requests try: response = requests.get('https://httpbin.org/delay/5', timeout=3) print(response.status_code) except requests.exceptions.Timeout: print("요청 시간 초과!") ===== 3. 고급 Requests 기능 ===== Requests 라이브러리는 단순한 요청 외에도 복잡한 시나리오를 처리할 수 있는 다양한 고급 기능을 제공합니다. ---- ==== 1) 세션 사용 ==== ''Session'' 객체를 사용하면 여러 요청 간에 쿠키, 헤더, 인증 정보를 유지할 수 있어 효율적입니다. 로그인 세션 유지 등에 유용합니다. import requests with requests.Session() as session: # 세션에 로그인 (쿠키가 유지됨) login_data = {'username': 'user', 'password': 'password'} session.post('https://httpbin.org/post', data=login_data) # 로그인 후 다른 페이지 요청 (동일 세션 유지) response = session.get('https://httpbin.org/cookies') print(response.json()) ---- ==== 2) 인증 (Authentication) ==== Requests는 다양한 형태의 HTTP 인증을 지원합니다. * **기본 인증 (Basic Authentication)** - 사용자 이름과 비밀번호를 직접 전달합니다. import requests from requests.auth import HTTPBasicAuth response = requests.get('https://httpbin.org/basic-auth/user/pass', auth=HTTPBasicAuth('user', 'pass')) print(response.status_code) print(response.text) * **토큰 기반 인증 (Token-based Authentication)** - ''headers'' 인자를 사용하여 ''Authorization'' 헤더에 토큰을 포함합니다. import requests token = "YOUR_ACCESS_TOKEN" headers = {'Authorization': f'Bearer {token}'} response = requests.get('https://api.example.com/data', headers=headers) print(response.status_code) ---- ==== 3) 파일 업로드 ==== ''files'' 인자를 사용하여 파일을 업로드할 수 있습니다. 바이너리 모드(''rb'')로 파일을 열어야 합니다. import requests # 더미 파일 생성 (예시) with open('my_file.txt', 'w') as f: f.write('This is a test file for upload.') # 파일 업로드 with open('my_file.txt', 'rb') as f: files = {'upload_file': f} response = requests.post('https://httpbin.org/post', files=files) print(response.status_code) print(response.json()['files']) ---- ==== 4) SSL 인증서 검증 ==== 기본적으로 Requests는 SSL 인증서의 유효성을 검증합니다. 특정 상황에서 이를 비활성화하거나 사용자 정의 인증서를 사용할 수 있습니다. * **SSL 검증 비활성화 (권장하지 않음)** - 개발 환경 등 특수한 경우에만 사용하며, 프로덕션 환경에서는 보안 위험이 있습니다. import requests import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) response = requests.get('https://self-signed.badssl.com/', verify=False) print(response.status_code) * **사용자 정의 인증서 사용** - 로컬 경로의 CA 번들 파일이나 클라이언트 측 인증서(pem 파일)를 지정할 수 있습니다. import requests # response = requests.get('https://example.com', verify='/path/to/cert.pem') # print(response.status_code) print("사용자 정의 인증서 경로는 'verify' 인자에 지정합니다.") ===== 4. 오류 처리 ===== HTTP 요청 시 발생할 수 있는 다양한 오류를 적절히 처리하는 것은 견고한 애플리케이션을 만드는 데 중요합니다. ---- ==== 1) HTTP 상태 코드 확인 ==== 응답 객체의 ''status_code'' 속성을 확인하여 성공 여부를 판단할 수 있습니다. import requests response = requests.get('https://httpbin.org/status/404') if response.status_code == 200: print("요청 성공!") elif response.status_code == 404: print("페이지를 찾을 수 없습니다 (404 Not Found).") else: print(f"오류 발생: {response.status_code}") ---- ==== 2) ''raise_for_status()'' 사용 ==== ''Response'' 객체의 ''raise_for_status()'' 메서드는 4xx 또는 5xx 상태 코드일 경우 ''HTTPError'' 예외를 발생시킵니다. 이를 통해 간편하게 오류를 처리할 수 있습니다. import requests from requests.exceptions import HTTPError try: response = requests.get('https://httpbin.org/status/500') response.raise_for_status() # 4xx 또는 5xx 응답 시 HTTPError 발생 print("요청 성공!") except HTTPError as http_err: print(f"HTTP 오류 발생: {http_err}") except Exception as err: print(f"기타 오류 발생: {err}") ---- ==== 3) 연결 관련 예외 처리 ==== 네트워크 문제, DNS 오류, 타임아웃 등 연결 자체에서 발생하는 예외도 처리해야 합니다. import requests from requests.exceptions import ConnectionError, Timeout, RequestException try: response = requests.get('https://nonexistent-domain-12345.com', timeout=5) response.raise_for_status() except ConnectionError as e: print(f"연결 오류 발생: {e}") except Timeout as e: print(f"요청 시간 초과: {e}") except RequestException as e: print(f"예상치 못한 Requests 오류 발생: {e}") ===== 5. 결론 ===== 파이썬 Requests 라이브러리는 강력하고 유연하며 사용하기 쉬운 HTTP 클라이언트입니다. 이 문서를 통해 Requests의 기본적인 사용법부터 세션 관리, 인증, 파일 업로드, 그리고 중요한 오류 처리 방법까지 익혔기를 바랍니다. Requests는 웹 애플리케이션 개발, API 연동, 데이터 수집 등 //다양한// 파이썬 프로젝트에서 핵심적인 역할을 수행합니다. 공식 문서를 참고하여 더 많은 기능을 탐색하고, 여러분의 프로젝트에 Requests를 적극적으로 활용해보세요.