매일 업데이트
2023-04-24 13:07 7 min

Python cURL을 사용하는 방법?

cURL은 커맨드 라인에서 HTTP 클라이언트 역할을 수행하는 유틸리티입니다. 주로 명령어를 통해 HTTP 요청을 생성하는 데 활용됩니다. 웹 스크래핑 스크립트 작성, 사이트 상태 점검, 그리고 명령줄에서 파일 다운로드 등 다양한 작업에 cURL이 사용됩니다.

사용이 간편하며, 많은 프로그래밍 언어에서 호환됩니다. 이 글에서는 cURL의 정의와 Python 환경에서 cURL을 사용하는 방법에 대해 상세히 설명합니다.

cURL이란 무엇인가?

공식 웹사이트에 따르면, cURL은 '클라이언트 URL'을 의미합니다. 이는 HTTP, HTTPS, FTP, IMAP 등 다양한 네트워크 프로토콜을 이용하여 데이터를 전송하는 커맨드 라인 도구이자 라이브러리입니다.

라디오, TV, 라우터, 프린터, 컴퓨터 등 전 세계적으로 100억 개 이상의 장치에서 널리 사용되고 있으며, 완전 무료 오픈 소스 소프트웨어로 GitHub에서 소스 코드를 확인할 수 있습니다.

cURL의 활용 사례

cURL은 매우 유용하며 다양한 용도로 활용될 수 있습니다. 다음은 cURL의 주요 사용 사례이며, 아래 목록 외에도 다양한 활용이 가능합니다.

  • API 테스트: API가 예상대로 작동하는지, 즉 요청에 대한 정확한 데이터를 반환하는지 검증합니다. API 응답 속도 확인 및 문제가 발생 시 알림을 전송하는 자동화 스크립트 구성에도 사용됩니다.
  • 웹 스크래핑: 웹사이트에서 원하는 데이터를 자동으로 추출하는 데 사용됩니다. cURL은 Bash 명령어와 함께 다양한 프로그래밍 언어에서 활용 가능합니다. 웹사이트에서 동적으로 데이터를 가져와 필요한 정보를 추출할 수 있습니다. 데이터 스크래핑에 관심 있는 사용자는 koreantech.org 웹 스크래핑 API를 참고하여 더 쉽게 데이터를 추출할 수 있습니다.
  • 데이터 다운로드: cURL을 사용하여 서버 응답을 파일 형태로 저장할 수 있습니다. API 요청 결과나 서버 상의 파일을 다운로드하는 데 활용되며, 명령줄 도구의 특성을 이용하여 대량의 파일을 일괄적으로 다운로드하는 작업을 자동화할 수 있습니다.

Python에서 cURL 사용법(PycURL)

PycURL 설치하기

Python에서 cURL을 사용하려면 PycURL 라이브러리가 필요합니다. PycURL은 cURL 라이브러리를 위한 Python 인터페이스 역할을 하며, 기존 cURL 라이브러리를 래핑하여 urllib 또는 requests와 같은 다른 라이브러리보다 빠른 속도를 제공합니다. PycURL을 사용하기 위해서는 우선 설치가 필요하며, pip를 이용하면 쉽게 설치할 수 있습니다.

pip install PycURL

Ubuntu 22.04 환경에서는 PycURL 설치 전에 추가 도구 설치가 필요할 수 있습니다. pip로 PycURL을 설치하기 전에 다음 명령어를 실행해야 합니다.

sudo apt install libcurl4-openssl-dev libssl-dev

간단한 GET 요청 보내기

GET 요청을 보내기 위해서는 우선 Python 스크립트를 생성해야 합니다. 원하는 텍스트 편집기를 사용하여 파일을 열고, Vim을 사용할 경우 아래 명령어를 실행합니다.

vim pycurl.py

여기서 pycurl.py는 스크립트 파일 이름이며, 사용자가 원하는 이름으로 변경할 수 있습니다.

다음으로, PycURL 모듈에서 Curl 클래스를 가져옵니다.

from pycurl import Curl

PycURL을 가져온 후, io 모듈에서 BytesIO를 가져옵니다. 이는 PycURL 응답을 저장할 버퍼를 생성하는 데 필요합니다.

from io import BytesIO

새로운 Curl 객체를 생성합니다.

c = Curl()

다음으로, BytesIO 객체를 생성하여 새 버퍼를 만듭니다. PycURL은 자체적으로 응답을 저장하는 메커니즘을 제공하지 않으므로, 버퍼를 생성하고 데이터를 저장할 위치를 지정해야 합니다.

buffer = BytesIO()

버퍼가 생성되면 클라이언트 객체의 옵션을 설정할 수 있습니다. 여기서는 요청할 URL과 응답 본문을 쓸 위치를 설정합니다.

c.setopt(c.URL, 'http://pycurl.io/')
c.setopt(c.WRITEDATA, buffer)

이제 클라이언트 객체의 perform 메서드를 호출하여 요청을 보내고, close 메서드를 호출하여 연결을 닫습니다.

c.perform()
c.close()

응답을 얻기 위해 버퍼 객체의 getvalue() 메서드를 호출하고, 디코딩하여 콘솔에 출력합니다.

body = buffer.getvalue()
print(body.decode('iso-8859-1'))

최종 스크립트 코드는 다음과 같습니다.

from pycurl import Curl
from io import BytesIO

# pycUrl 객체 생성
c = Curl()
buffer = BytesIO()

c.setopt(c.URL, 'http://pycurl.io/')
c.setopt(c.WRITEDATA, buffer)

# 요청 보내기
c.perform()

# 연결 종료
c.close()

body = buffer.getvalue()
print(body.decode('iso-8859-1'))

스크립트를 실행하면 다음 이미지와 같은 결과가 출력됩니다.

POST 요청 보내기

POST 요청을 보내려면 cURL 클라이언트 객체의 POSTFIELDS 옵션을 설정해야 합니다. 다음은 JSON Placeholder API에 POST 요청을 보내는 예시입니다.

from io import BytesIO
from json import dumps
from pycurl import Curl

# pycUrl 객체 생성
c = Curl()
buffer = BytesIO()

# 데이터 딕셔너리 생성
data = {
    'userId': 1,
    'title': 'Lorem Ipsum',
    'body': 'Dolor sit amet'
}

# 데이터를 JSON으로 인코딩
encoded_data = dumps(data)

# 요청 옵션 설정
c.setopt(c.URL, 'https://jsonplaceholder.typicode.com/posts')
c.setopt(c.HTTPHEADER, ['Accept: application/json', 'Content-Type: application/json'])
c.setopt(c.POSTFIELDS, encoded_data)
c.setopt(c.WRITEDATA, buffer)

# 요청 보내기
c.perform()

# 연결 종료
c.close()

body = buffer.getvalue()
print(body.decode('iso-8859-1'))

위 코드에서는 전송할 데이터를 딕셔너리 객체로 생성한 후 JSON 형식으로 인코딩하고, POSTFIELDS 옵션에 설정하여 요청 페이로드로 전달합니다. 또한, 요청의 콘텐츠 유형과 응답 데이터 형식을 지정하기 위해 헤더를 설정합니다. 코드를 실행하면 아래 이미지와 같은 응답을 받을 수 있습니다.

응답을 파일에 저장하기

cURL의 WRITEDATA 옵션에 파일 버퍼를 전달하여 응답 데이터를 파일에 저장할 수 있습니다. 다음 예시는 해당 개념을 보여줍니다.

from pycurl import Curl

file_name="output.json"

# 파일을 쓰기 모드로 열기
with open(file_name, 'wb') as f:
    
    # Curl 객체 생성
    c = Curl()

    # 요청 옵션 설정
    c.setopt(c.URL, 'https://jsonplaceholder.typicode.com/users/1')
    c.setopt(c.HTTPHEADER, ['Accept: application/json'])
    c.setopt(c.WRITEDATA, f)

    # 요청 보내기
    c.perform()

    # 연결 종료
    c.close()

    print(f'출력이 {file_name} 파일에 저장되었습니다.')

PycURL의 대안

PycURL은 cURL 라이브러리에 얇은 레이어만 제공하여 저수준 기능을 더 세밀하게 제어할 수 있도록 해줍니다. 따라서 고급 개발자에게 적합하지만, 사용이 다소 복잡할 수 있습니다. 이 섹션에서는 PycURL을 대신할 수 있는 몇 가지 대안을 제시합니다.

#1. 다른 라이브러리

PycURL 외에도 Python에는 요청을 보내는 데 사용할 수 있는 다른 라이브러리가 있습니다. requests 라이브러리와 urllib 라이브러리가 대표적이며, PycURL보다 쉽고 널리 사용되는 대안입니다.

#2. 다른 언어

cURL은 다양한 언어로 구현된 인터페이스를 제공합니다. Curl Converter 웹사이트는 cURL 명령어를 다른 언어로 변환하는 데 유용합니다. cURL 변환기를 이용하여 원하는 요청에 대한 cURL 명령어를 생성하고, 선택한 프로그래밍 언어로 자동 변환할 수 있습니다. 터미널에서 직접 cURL 명령을 호출하거나 Bash 스크립트를 작성할 수도 있습니다.

결론

이 글에서는 cURL의 기본 개념을 소개하고, Python에서 PycURL 모듈을 사용하여 cURL을 사용하는 방법을 설명했습니다. 또한, requests 모듈과 같은 PycURL의 대안과 프로그램에 다른 언어를 함께 사용하는 방법에 대해서도 논의했습니다.

다음으로 cURL 명령어를 실제 예시와 함께 사용법을 확인해 보세요.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.