cURL을 Python Requests로 단계별로 변환하기

브라우저 DevTools에서 요청을 cURL 명령어로 복사합니다.

헤더, 쿠키, 인증 토큰을 얻게 됩니다.

하지만 결과물은 지저분한 30줄짜리 셸 코드뿐입니다. 당신이 원한 것은 깔끔한 Python 코드였습니다.

다음은 cURL 명령어를 Python requests 라이브러리로 수동으로 매핑하는 방법입니다.

  1. 메서드 결정하기 --data 또는 --data-raw가 보이면 curl은 기본적으로 POST를 사용합니다. -X 플래그가 없다고 해서 GET 요청이라고 가정하지 마세요.

  2. 헤더 처리하기 모든 -H 플래그는 딕셔너리의 엔트리가 됩니다. 헤더 문자열을 분리할 때는 첫 번째 콜론(:)에서만 분리하세요. URL이나 타임스탬프 같은 값에는 콜론이 포함되어 있습니다. 모든 콜론에서 분리하면 데이터가 깨질 수 있습니다.

  3. 쿠키 관리하기 -b 플래그는 세미콜론으로 구분된 문자열을 제공합니다. 이를 헤더 딕셔너리에 넣지 마세요. 대신 cookies 인자에 딕셔너리 형태로 전달하세요. 이렇게 하면 라이브러리가 인코딩을 처리합니다.

  4. JSON vs Data 사용하기 흔히 하는 실수입니다. Content-type이 application/json인 경우 json= 인자를 사용하세요. 이렇게 하면 딕셔너리가 직렬화되고 올바른 헤더가 자동으로 설정됩니다. 만약 data=를 사용하면 requests는 form-encoding을 사용합니다. 이 경우 API가 요청을 거부할 수 있습니다.

  5. 파라미터 정리하기 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