이 포괄적인 가이드에서는 다음을 배우게 됩니다:
요청(request)이란 무엇인지, 설치 방법, 그리고 가장 인기 있는 Python HTTP 클라이언트 라이브러리인 이유.- 다양한 HTTP 메서드와 함께 사용하는 방법.
- 서버 응답 처리를 위해 제공하는 기능.
- 지원하는 요청 커스터마이징 기능.
- Python
requests 라이브러리가다루는 고급 시나리오
자, 시작해 보겠습니다!
Requests 라이브러리 소개
Requests가 무엇인지, 설치 방법, 사용 시점 및 제공하는 기능을 살펴보세요.
정의
Requests는 Python용 우아하고 간단한 HTTP라이브러리입니다 . 구체적으로, 직관적인 API를 제공하여 HTTP 요청을 생성하고 응답을 처리하는 방식을 쉽고 사람이 읽기 쉽게 만듭니다. GitHub에서 5만 개 이상의 스타와 월간 5억 회 이상의 다운로드를 기록한 Requests는 Python에서 가장 인기 있는 HTTP 클라이언트 중 하나입니다.
이 라이브러리가 제공하는 주요 기능으로는 모든 HTTP 메서드를 포괄하는 포괄적인 API, 응답 처리, 요청 맞춤 설정, 인증, SSL 인증서 관리 등이 있습니다. 또한 Python Requests 모듈은 기본적으로 HTTP/1.1을 지원합니다. HTTP/2(또는 HTTP/3) 지원이 필요한 경우 httpx 라이브러리 ( httpx[http2]로 설치 가능) 또는 requests-h2를 사용하는 것을 고려하세요.
설정
참고: 버전 2.32.5(2026-08-18) 기준, Requests에는 중요한 보안 수정 사항(예: CVE-2024-47081)이 포함되어 있으며, 이전 버전에서 도입된 문제 있는 SSLContext 캐싱을 되돌리고 Python 3.8 지원을 중단합니다. 이러한 변경 사항은 SSL 구성, 호스트 검증 방식 및 사용 가능한 Python 버전에 영향을 미칩니다.
Requests를 설치하는 가장 쉽고 권장되는 방법은 pip를 이용하는 것입니다. 특히 Requests 라이브러리와 연관된 pip 패키지는 requests입니다. 따라서 다음 명령어로 HTTP 클라이언트를 설치할 수 있습니다:
pip install requests
Python 스크립트 에서 Requests를 사용하려면 아래 줄로 임포트하세요:
import requests
훌륭합니다! Requests 패키지가 설치되어 사용 준비가 완료되었습니다.
사용 사례
Python requests 라이브러리의 주요 사용 사례는 다음과 같습니다:
- 웹 서버에 HTTP 요청 수행: GET 요청을 전송하여 웹 서버에서 데이터를 가져옵니다.
- API 사용: API 엔드포인트에 요청을 보내고 응답을 처리하여 다양한 웹 서비스와 상호작용하고 데이터에 접근합니다.
- 웹 스크래핑: 웹 페이지와 관련된 HTML 문서를 가져온 후
BeautifulSoup같은 라이브러리를 사용하여 특정 정보를추출할수 있습니다. 자세한 내용은 Python 웹 스크래핑 가이드에서 확인하세요. - 웹 애플리케이션 테스트: HTTP 요청을 시뮬레이션하고 응답을 검증하여 테스트 프로세스를 자동화하고 웹 서비스의 정상 작동을 보장합니다.
- 파일 다운로드: 해당 URL에 HTTP
GET 요청을전송하여 이미지, 문서 또는 기타 미디어 파일과 같은 파일을 웹 서버에서 가져옵니다.
메서드
다음 표에서 requests 라이브러리가 제공하는 공개 메서드를 살펴보세요:
| 메서드 | 설명 |
requests.request() |
지정된 메서드로 주어진 URL에 사용자 정의 HTTP 요청을 전송합니다 |
requests.get() |
지정된 URL로 GET 요청 을 보냅니다 |
requests.post() |
지정된 URL로 POST 요청 을 보냅니다 |
requests.put() |
지정된 URL로 PUT 요청 을 보냅니다 |
requests.patch() |
지정된 URL로 PATCH 요청 을 보냅니다 |
requests.delete() |
지정된 URL로 DELETE 요청 을 보냅니다 |
requests.head() |
지정된 URL에 HEAD 요청 을 보냅니다 |
보시다시피, 이 메서드들은 가장 유용한 HTTP 요청 메서드를 다룹니다. 공식 API 문서에서 사용 방법에 대해 자세히 알아보세요.
이제 실제 동작을 살펴볼 시간입니다!
HTTP 메서드
HTTP의 GET, POST, PUT, DELETE 및 HEAD 메서드를 처리할 때 Python 라이브러리 requests의 실제 사용 사례를 확인해 보세요.
GET
HTTP에서 GET 메서드는 서버로부터 특정 리소스를 요청하는 데 사용됩니다. requests.get()을 사용하여 HTTP GET 요청을 수행하는 방법은 다음과 같습니다:
import requests
# 지정된 URL로 GET 요청 전송
response = requests.get('https://api.example.com/data')
마찬가지로 requests.request() 를 사용해도 동일한 결과를 얻을 수 있습니다:
import requests
response = requests.request('GET', 'https://api.example.com/data')
이 경우 사용하려는 HTTP 메서드를 추가 문자열 변수로 수동으로 지정해야 합니다.
POST
HTTP POST 메서드는 추가 처리를 위해 서버에 데이터를 제출하는 데 사용됩니다. requests.post()로 POST 요청을 수행하는 방법은 다음과 같습니다:
import requests
# POST 요청으로 전송할 데이터
product = {
'name': 'Limitor 500',
'description': 'Limitor 500은 산업 현장에서 전력 소비를 조절하도록 설계된 고성능 전자 장치입니다. 실시간 모니터링, 조정 가능한 설정, 효율적인 에너지 관리를 위한 원격 액세스 등 고급 기능을 제공합니다.',
'price': 199.99,
'manufacturer': 'TechCorp Inc.',
'category': 'Electronics',
'availability': 'In Stock'
}
# 지정된 URL로 POST 요청 전송
response = requests.post('https://api.example.com/product', data=product)
GET 요청과 달리 이번에는 data 옵션을 통해 서버로 전송할 데이터를 명시해야 합니다. requests는 이 데이터를 HTTP 요청 본문에 추가합니다 .
JSON 본문의 경우, data 대신 json 옵션에 데이터 객체를 전달하세요:
response = requests.post('https://api.example.com/product', json=product)
Python으로 JSON 데이터를 파싱하는 방법에 대한 가이드를 읽어보시기 바랍니다.
동일한 요청을 request.request() 를 사용해 다음과 같이 수행할 수도 있습니다:
import requests
product = {
'name': 'Limitor 500',
'description': 'Limitor 500은 산업 현장에서 전력 소비를 조절하도록 설계된 고성능 전자 장치입니다. 실시간 모니터링, 조정 가능한 설정, 효율적인 에너지 관리를 위한 원격 액세스 등 고급 기능을 제공합니다.',
'price': 199.99,
'manufacturer': 'TechCorp Inc.',
'category': 'Electronics',
'availability': 'In Stock'
}
response = requests.request('POST', 'https://api.example.com/product', data=product)
PUT
PUT 메서드는 서버의 리소스를 업데이트하거나 교체하는 데 사용됩니다. Python requests 모듈로 PUT 요청을 보내는 것은 쉽고 POST 요청과 유사한 패턴을 따릅니다. 달라지는 점은 사용해야 할 메서드가 requests.put()이라는 점입니다. 또한 requests.request() 의 HTTP 메서드 문자열은 'PUT'이 됩니다 .
PATCH
PATCH 메서드는 온라인 리소스에 부분적인 수정을 적용하는 데 사용됩니다. PUT 요청과 마찬가지로 Python requests 라이브러리에서 PATCH 요청을 보내는 것은 POST 요청과 유사합니다. 달라지는 점은 사용해야 할 메서드가 requests.patch() 이며 requests.request() 의 HTTP 메서드 문자열이 'PATCH'라는 것입니다 .
DELETE
DELETE 메서드는 주어진 URI로 식별되는 리소스를 삭제하는 데 사용됩니다. requests에서 delete() 메서드를 사용하여 HTTP DELETE 요청을 보내는 방법은 다음과 같습니다:
import requests
# id = 75인 제품에 대한 DELETE 요청 전송
response = requests.delete('https://api.example.com/products/75')
동등하게 requests.request()로 DELETE 요청을 수행할 수 있습니다:
import requests
response = requests.request('DELETE', 'https://api.example.com/products/75')
HEAD
HEAD 메서드는 GET과 유사하지만, 실제 본문 콘텐츠 없이 응답 헤더만 요청합니다. 따라서 서버가 HEAD 요청에 대해 반환하는 응답은 GET 요청의 응답과 동일하지만 본문 데이터가 없습니다.
Python에서 HTTP HEAD 요청 을 수행하려면 requests.head()를 사용하세요:
import requests
# 지정된 URL로 HEAD 요청 전송
response = requests.head('https://api.example.com/resource')
마찬가지로 requests.request()를 사용해 HEAD 요청 을 수행할 수 있습니다:
import requests
response = requests.request('HEAD', 'https://api.example.com/resource')
Requests의 응답 객체 분석
이제 requests로 HTTP 요청을 보내는 방법을 알았으니, 응답 객체를 처리하는 방법을 살펴볼 차례입니다.
응답 객체
HTTP 요청을 수행한 후, requests는 서버로부터 응답을 수신하여 특별한 Response 객체로 매핑합니다.
아래 Python requests 예제를 살펴보세요:
import requests
response = requests.get('http://lumtest.com/myip.json')
print(response)
다음과 같은 결과가 반환됩니다:
<Response [200]>
response는 유용한 메서드와 속성을 제공하는 Response 객체입니다 . 다음 섹션에서 가장 중요한 것들을 살펴보세요!
경고: 요청이 항상 응답을 반환하는 것은 아닙니다 . 오류 발생 시(예: 잘못된 URL 또는 구문 오류), RequestException 예외가 발생합니다. 아래 로직으로 이 예외를 처리하세요:
try:
response = requests.get('http://lumtest.com/myip.json')
# 응답 처리
except requests.exceptions.RequestException as e:
print('요청 중 오류 발생:', e)
상태 코드
HTTP에서 응답 상태 코드는 요청의 성공, 실패 또는 기타 상태를 나타내기 위해 서버가 반환하는 표준화된 값입니다. 이러한 상태 코드는 요청이 성공했는지 여부와 실패 시 문제 원인을 즉시 알려주기 때문에 매우 중요합니다.
특히 오류 처리 시 유용하며, 클라이언트가 다양한 유형의 오류를 식별하고 적절히 처리할 수 있게 합니다. 예를 들어, 4xx 상태 코드는 클라이언트 측 오류(예: 잘못된 요청)를 나타내고, 5xx 상태 코드는 서버 측 오류를 나타냅니다.
Python에서 requests 라이브러리를 사용하여 응답을 처리할 때 상태 코드 제어는 일반적으로 첫 번째 단계입니다. 요청을 수행한 후에는 항상 응답의 상태 코드를 확인하여 요청이 성공했는지 여부를 판단해야 합니다. 응답 객체의 status_code 속성을 통해 상태 코드에 접근할 수 있습니다:
response.status_code # 200
수신된 상태 코드에 따라 조건문을 사용하여 다양한 시나리오를 적절히 처리해야 합니다:
import requests
response = requests.get('http://lumtest.com/myip.json')
# 요청 성공 여부 확인 (상태 코드 200)
if response.status_code == 200:
print('요청 성공!')
# 응답 처리...
elif response.status_code == 404:
print('리소스를 찾을 수 없습니다!')
else:
print(f'상태 코드 {response.status_code}로 요청 실패')
대부분의 경우 성공적인 요청과 오류 응답만 구분하면 됩니다. requests는 __bool()__ 오버로드를 통해 이 과정을 단순화합니다 . 구체적으로, 조건문에서 Response 객체를 직접 사용할 수 있습니다. 상태 코드가 200에서 399 사이이면 True로 , 그렇지 않으면 False로 평가됩니다.
다시 말해, 다음과 같은 로직으로 요청의 성공 여부를 확인할 수 있습니다:
if response:
print('성공적인 요청!')
# 응답 처리...
else:
print(f'상태 코드 {response.status_code}로 요청 실패')
응답 헤더
서버 응답의 헤더는 headers 속성을 통해 접근할 수 있습니다:
import requests
response = requests.get('http://lumtest.com/myip.json')
response_headers = response.headers
print(response_headers)
다음과 같이 출력됩니다:
{'Server': 'nginx', 'Date': 'Thu, 09 May 2024 12:51:08 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '279', 'Connection': 'keep-alive', 'Cache-Control': 'no-store', 'Access-Control-Allow-Origin': '*'}
보시다시피, response.headers는 사전과 유사한 객체를 반환합니다. 즉, 키를 통해 헤더 값에 접근할 수 있습니다. 예를 들어, 응답의 Content-Type 헤더에 접근하고 싶다고 가정해 보겠습니다. 아래는 이를 수행하는 방법입니다:
response_headers['Content-Type'] # 'application/json; charset=utf-8'
HTTP 사양에서 헤더는 대소문자를 구분하지 않도록 정의되어 있으므로, requests에서는 대소문자를 신경 쓰지 않고 헤더에 접근할 수 있습니다 :
response_headers['content-type'] # 'application/json; charset=utf-8'
응답 콘텐츠
requests는 응답의 페이로드를 접근하기 위한 다양한 속성과 메서드를제공합니다 :
response.content: 응답의 내용을 바이트 단위로 반환합니다.response.text: 응답 내용을 유니코드 문자열로 반환합니다.response.json(): 응답의 JSON 인코딩된 내용을 사전(dictionary) 형태로 반환합니다.
다음 예제에서 실제 사용법을 확인하세요:
import requests
response = requests.get('http://lumtest.com/myip.json')
# 응답을 바이트로 접근
response_bytes = response.content
print(type(response_bytes))
print(response_bytes)
print()
# 응답을 텍스트로 가져옴
response_text = response.text
print(type(response_text))
print(response_text)
print()
# 응답을 JSON 인코딩된 사전으로 가져옴
response_json = response.json()
print(type(response_json))
print(response_json)
print()
http://lumtest.com/myip.json는 호출자의 IP에 대한 정보를 반환하는 특수 엔드포인트입니다. 위 코드 조각의 결과는 다음과 같을 것입니다:
<class 'bytes'>
b'{"ip":"45.85.135.110","country":"US","asn":{"asnum":62240,"org_name":"Clouvider Limited"},"geo":{"city":"Ashburn","region":"VA","region_name":"Virginia","postal_code":"20149","latitude":39.0469,"longitude":-77.4903,"tz":"America/New_York","lum_city":"ashburn","lum_region":"va"}}'
<class 'str'>
{"ip":"45.85.135.110","country":"US","asn":{"asnum":62240,"org_name":"Clouvider Limited"},"geo":{"city":"Ashburn","region":"VA","region_name":"Virginia","postal_code":"20149","latitude":39.0469,"longitude":-77.4903,"tz":"America/New_York","lum_city":"ashburn","lum_region":"va"}}
<class 'dict'>
{'ip': '45.85.135.110', 'country': 'US', 'asn': {'asnum': 62240, 'org_name': 'Clouvider Limited'}, 'geo': {'city': 'Ashburn', 'region': 'VA', 'region_name': 'Virginia', 'postal_code': '20149', 'latitude': 39.0469, 'longitude': -77.4903, 'tz': 'America/New_York', 'lum_city': 'ashburn', 'lum_region': 'va'}}
세 가지 다른 응답 형식에 유의하십시오. 사전 형식의 response.json() 은 데이터 접근을 단순화하기 때문에 특히 유용합니다:
response_json['country'] # 'US'
자세한 내용은 Python에서 JSON을 파싱하는 방법에 대한 가이드를 참조하세요.
응답 쿠키
HTTP 쿠키는 헤더를 통해 정의되지만, Response 객체는 이를 처리하기 위한 특별한 cookies 속성을 제공합니다. 이 속성은 서버가 반환한 쿠키를 포함하는 http.cookiejar 객체를 반환합니다.
Python requests 라이브러리에서 응답 객체의 쿠키에 접근하는 방법을 보여주는 아래 예제를 살펴보세요:
import requests
# 로그인 자격 증명 정의
credentials = {
'username': 'example_user',
'password': 'example_password'
}
# 로그인 엔드포인트에 POST 요청 전송
response = requests.post('https://www.example.com/login', data=credentials)
# 서버가 설정한 쿠키 접근
cookies = response.cookies
# 서버에서 수신한 쿠키 출력
for cookie in cookies:
print(cookie.name, ':', cookie.value)
위의 샘플 코드 조각은 다음과 같은 결과를 생성할 수 있습니다:
session_id : be400765483cf840dfbbd39
user_id : 7164
expires : Sat, 01 Jan 2026 14:30:00 GMT
Python Requests 라이브러리를 사용한 요청 커스터마이징
HTTP 요청에는 종종 특수 필터링 매개변수와 사용자 정의 헤더가 포함됩니다. requests에서 이를 지정하는 방법을 살펴보겠습니다.
쿼리 문자열 매개변수
쿼리 매개변수(URL 매개변수라고도 함)는 HTTP 요청에서 URL 끝에 추가되는 매개변수입니다. 이 매개변수는 요청에 대한 추가 정보를 서버에 제공하며, 주로 데이터를 필터링하고 응답을 맞춤 설정하는 방법을 알려줍니다.
다음 URL을 살펴보겠습니다:
https://api.example.com/data?key1=value1&key2=value2
이 예시에서 ?key1=value1&key2=value2는 쿼리 문자열이며, key1과 key2는 쿼리 매개변수입니다 .
쿼리 문자열은 ? 로 시작하며 , 등호(=)로 구분되고 &로 연결된 키-값 쌍으로 구성됩니다. 특히 선택적 매개변수를 다룰 때 Python 코드에서 이 쿼리 문자열을 프로그래밍 방식으로 지정하는 것은 항상 쉬운 일이 아닙니다. 그래서 requests 모듈은 params 옵션을 제공합니다 :
import requests
# 쿼리 매개변수를 사전(dictionary)으로 정의
params = {
'page': 1,
'limit': 10,
'category': 'electronics'
}
# 다음 URL로 GET 요청 전송:
# 'https://api.example.com/products?page=1&limit=10&category=electronics'
response = requests.get('https://api.example.com/products', params=params)
동등하게, 매개변수를 튜플 목록으로 requests에 전달할 수 있습니다:
import requests
# 쿼리 매개변수를 튜플 목록으로 정의
params = [
('page', '1'),
('limit', '10'),
('category', 'electronics')
]
response = requests.get('https://api.example.com/products', params=params)
또는 바이트 문자열 로 전달할 수도 있습니다:
import requests
# 쿼리 매개변수를 바이트 문자열로 정의
params = b'page=1&limit=10&category=electronics'
response = requests.get('https://api.example.com/products', params=params)
요청 헤더
requests에서 HTTP 요청의 헤더를 사용자 정의하려면, 헤더 옵션을 사전(dictionary)으로 전달하세요. 예를 들어, requests에서 사용자 정의 User-Agent 문자열을 설정하려면 다음과 같이 합니다:
import requests
# 사용자 정의 헤더 정의
custom_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
# 기타 헤더...
}
# 사용자 정의 헤더로 GET 요청 전송
response = requests.get('https://api.example.com/data', headers=custom_headers)
requests에서User-Agent에 대해 자세히 알아보기.
요청 쿠키
HTTP 쿠키는 헤더를 통해 서버로 전송되지만, requests는 쿠키를 맞춤 설정할 수 있는 전용 옵션을 제공합니다 . 다음 예시처럼 사용하세요:
# 사용자 정의 쿠키 정의
custom_cookies = {
'session_id': 'be400765483cf840dfbbd39',
'user_id': '7164'
}
# 사용자 정의 쿠키를 포함한 GET 요청 전송
response = requests.get('https://www.example.com', cookies=custom_cookies)
쿠키는 사전(dictionary) 또는 http.cookiejar 객체를 인수로 받습니다 .
기타 구성
request는 풍부한 API를제공하며 다양한 고급 기법을 활용할 수 있습니다. 가장 관련성 높은 몇 가지를 살펴보세요!
프록시 설정
requests의 프록시 통합 기능을 사용하면 HTTP 요청을 프록시 서버를 통해 라우팅할 수 있습니다 . 이는 IP 주소를 숨기고, 속도 제한을 우회하거나, 지역 제한 콘텐츠에 접근하는 데 유용한 강력한 메커니즘입니다.
proxies 옵션을 사용하여 Python requests 라이브러리에 프록시 서버를 통합할 수 있습니다:
import requests
# 프록시 설정 정의
proxy = {
'http': 'http://username:[email protected]:8080',
'https': 'https://username:[email protected]:8080'
}
# 프록시를 사용하여 요청 수행
response = requests.get('https://www.example.com', proxies=proxy)
자세한 튜토리얼은 Python Requests에서 프록시 사용 가이드를 참조하세요.
기본 인증
HTTP 인증, 더 잘 알려진 “기본 인증”은 HTTP 프로토콜에 내장된 간단한 인증 체계입니다. 이는 Authorization 헤더에 Base64 형식으로 인코딩된 사용자 이름과 비밀번호를 전송하는 것을 포함합니다.
Authorization 헤더를 수동으로 설정하여 구현할 수도 있지만, requests 라이브러리는 이를 위한 전용 auth 옵션을 제공합니다 . 이 옵션은 사용자 이름과 비밀번호가 포함된 튜플을 받아들입니다. Python requests 라이브러리에서 기본 인증을 처리하려면 이 옵션을 사용하세요:
import requests
# 기본 인증용 사용자명과 비밀번호 정의
username = 'sample_username'
password = 'sample_password'
# 기본 인증을 사용한 GET 요청 전송
response = requests.get('https://api.example.com/private/users', auth=(username, password))
SSL 인증서 검증
SSL 인증서 검증은 인터넷을 통해 클라이언트와 서버 간 안전한 통신을 보장하는 데 매우 중요합니다. 동시에 대상 서버를 신뢰하여 검증을 강제할 필요가 없는 상황도 있습니다.
특히 HTTP 트래픽을 프록시 서버를 통해 라우팅할 때 SSL 인증서 관련 오류가 발생할 수 있습니다. 이 경우 SSL 인증서 검증을 비활성화해야 할 수 있습니다. requests에서는 verify 옵션을 통해 이를 설정할 수 있습니다:
import requests
# SSL 인증서 검증을 비활성화한 상태로 웹사이트에 GET 요청 전송
response = requests.get('https://api.example.com/data', verify=False)
타임아웃
기본적으로 requests는 서버 응답을 무기한 대기합니다. 서버 과부하나 네트워크 지연 시 이 동작이 문제가 될 수 있습니다.
응답이 영원히 오지 않을 수도 있는 상황에서 애플리케이션 속도가 느려지는 것을 방지하기 위해 requests에는 타임아웃 옵션이 있습니다 . 이 옵션은 응답을 기다릴 초 수를 나타내는 정수 또는 부동 소수점을 받습니다:
import requests
# 2초 후 타임아웃
response1 = requests.get("https://api.example.com/data", timeout=2)
또는 타임아웃은 두 요소(연결 시간 초과와 응답 읽기 시간 초과)로 구성된 튜플을 받아들입니다 . 아래 예시처럼 지정하세요:
import requests
# 연결 시간 초과 2.5초, 응답 읽기 시간 초과 4초 설정
response = requests.get("https://api.example.com/data", timeout=(2.5, 4))
요청이 지정된 연결 시간 초과 내에 연결을 수립하고 읽기 시간 초과 내에 데이터를 수신하면 응답이 정상적으로 반환됩니다. 그렇지 않고 요청이 시간 초과되면 Timeout 예외가 발생합니다:
import requests
from requests.exceptions import Timeout
try:
response = requests.get("https://api.example.com/data", timeout=(2.5, 4))
except Timeout:
print("요청이 시간 초과되었습니다")
물론입니다. 하이픈(em dash)을 제거하고 간결하게 수정하여 귀하의 글 스타일과 일관성을 유지한 부분입니다:
프로 팁: requests-h2, HTTP/2 지원
requests 라이브러리는 사용 편의성으로 널리 쓰이지만 기본적으로 HTTP/1.1만 지원합니다. 익숙한 requests 스타일 API를 유지하면서 HTTP/2 지원이 필요하다면 requests-h2를 사용해 보세요.
requests-h2는 requests의 대체 라이브러리로, HTTP/1.1과 HTTP/2 요청을 모두 보낼 수 있습니다. requests와 httpcore를 기반으로 구축되었으며, Python 3.7 이상과 호환됩니다. HTTP/2 사용을 위해 OpenSSL을 업그레이드할 필요도 없습니다.
pip으로 설치:
pip install requests-h2
사용법은 requests와 거의 동일합니다:
import requests_h2 as requests
# http2=True 설정으로 HTTP/2 요청 전송
response = requests.get('https://www.google.com', http2=True)
print(response.status_code) # 200
print(response.version) # 'HTTP/2'
기존 코드를 최소한으로 변경하면서 더 나은 성능이나 API 지원을 위해 HTTP/2에 쉽게 접근하고 싶다면 requests-h2가 좋은 선택입니다. 단순히 import를 requests_h2로 바꾸고 http2=True 매개변수를 추가하기만 하면 됩니다.
결론
이 글에서는 requests 라이브러리를 깊이 있게 살펴보며, 그 정의, 제공하는 메서드, 사용법 등을 이해했습니다. Python requests 모듈이 다양한 사용 사례를 아우르는 유용하고 널리 쓰이는 HTTP 라이브러리임을 알게 되었습니다.
문제는 모든 HTTP 요청이 공개 IP를 노출시킨다는 점입니다. 이는 사용자의 신원과 거주지 정보를 제공하여 개인 정보 보호에 좋지 않습니다. IP 주소를 숨기는 여러 방법이 있으며, 보안과 개인 정보 보호를 강화하는 가장 효과적인 방법은 프록시 서버를 사용하는 것입니다.
Bright Data는 포춘 500대 기업 및 20,000명 이상의 고객에게 서비스를 제공하는 세계 최고의 프록시 서버를 운영합니다. 제공되는 프록시 유형은 다음과 같이 다양합니다: