cURL을 Python Requests로 단계별로 변환하기
브라우저 DevTools에서 요청을 cURL 명령어로 복사합니다.
헤더, 쿠키, 인증 토큰을 얻게 됩니다.
하지만 결과물은 지저분한 30줄짜리 셸 코드뿐입니다. 당신이 원한 것은 깔끔한 Python 코드였습니다.
다음은 cURL 명령어를 Python requests 라이브러리로 수동으로 매핑하는 방법입니다.
메서드 결정하기
--data또는--data-raw가 보이면 curl은 기본적으로 POST를 사용합니다.-X플래그가 없다고 해서 GET 요청이라고 가정하지 마세요.헤더 처리하기 모든
-H플래그는 딕셔너리의 엔트리가 됩니다. 헤더 문자열을 분리할 때는 첫 번째 콜론(:)에서만 분리하세요. URL이나 타임스탬프 같은 값에는 콜론이 포함되어 있습니다. 모든 콜론에서 분리하면 데이터가 깨질 수 있습니다.쿠키 관리하기
-b플래그는 세미콜론으로 구분된 문자열을 제공합니다. 이를 헤더 딕셔너리에 넣지 마세요. 대신cookies인자에 딕셔너리 형태로 전달하세요. 이렇게 하면 라이브러리가 인코딩을 처리합니다.JSON vs Data 사용하기 흔히 하는 실수입니다. Content-type이
application/json인 경우json=인자를 사용하세요. 이렇게 하면 딕셔너리가 직렬화되고 올바른 헤더가 자동으로 설정됩니다. 만약data=를 사용하면requests는 form-encoding을 사용합니다. 이 경우 API가 요청을 거부할 수 있습니다.파라미터 정리하기 URL의 쿼리 스트링을
params딕셔너리로 옮기세요. 이렇게 하면 코드를 읽기 쉬워집니다. 이중 인코딩(double-encoding)에 주의하세요. URL이 이미 인코딩되어 있다면 딕셔너리에서 다시 인코딩하지 마세요.
최종 코드 구조는 다음과 같습니다:
import requests
url = "https://api.example.com/v2/search"
params = {"lang": "en", "page": "2"}
headers = {
"accept": "application/json",
"authorization": "Bearer token_here",
"referer": "https://app.example.com/dashboard",
}
cookies = {"session": "abc123"}
payload = {"q": "nginx"}
resp = requests.post(
url,
params=params,
headers=headers,
cookies=cookies,
json=payload,
)
resp.raise_for_status()
print(resp.json())
피해야 할 흔한 실수:
- 멀티파트 업로드 시
files=와data=를 혼동하는 것. - 헤더를 모든 콜론에서 분리하는 것.
- 쿼리 파라미터를 이중 인코딩하는 것.
Source: https://dev.to/wanfeng/from-browser-curl-to-clean-python-requests-code-step-by-step-25oh