Python에서 cURL 사용 가이드

댓글: 0

웹 스크래핑은 데이터 분석, 연구, 자동화와 같은 작업을 위해 웹사이트에서 데이터를 추출하는 작업입니다. Python은 HTTPS 요청을 전송하고 스크래핑을 수행하기 위한 라이브러리를 제공하지만, PycURL을 통해 cURL을 사용하는 것이 더 효율적일 수 있습니다. 이 튜토리얼에서는 Python cURL을 사용해 웹 페이지를 스크래핑하는 방법을 보여드리겠습니다. 예제를 제공하고 Requests, HTTPX, AIOHTTP와 같은 다른 인기 라이브러리와 성능을 비교해 보겠습니다.

cURL 및 Python 시작하기

Python 통합에 대해 자세히 알아보기 전에 cURL 기본 사항을 이해하는 것이 중요합니다. 터미널에서 직접 cURL 명령을 사용하여 GET 및 POST 요청과 같은 작업을 수행할 수 있습니다.

cURL 명령 예시:

# GET 요청
curl -X GET "https://httpbin.org/get"

# POST 요청
curl -X POST "https://httpbin.org/post"

1.png

2.png

필수 라이브러리 설치하기

파이썬에서 cURL을 사용하려면 cURL 라이브러리에 대한 파이썬 인터페이스를 제공하는 pycurl 라이브러리가 필요합니다.

PycURL 설치하기:

pip install pycurl

PycURL로 HTTP 요청하기

PycURL은 Python에서 HTTP 요청에 대한 자세한 제어 기능을 제공합니다. 아래는 PycURL로 GET 요청을 하는 방법을 보여주는 예제입니다:

import pycurl
import certifi
from io import BytesIO

# 응답 데이터를 저장할 BytesIO 객체를 만듭니다.
buffer = BytesIO()

# cURL 객체 초기화
c = pycurl.Curl()

# HTTP GET 요청의 URL을 설정합니다.
c.setopt(c.URL, 'https://httpbin.org/get')

# 출력 데이터를 캡처할 버퍼를 설정합니다.
c.setopt(c.WRITEDATA, buffer)

# SSL/TLS 확인을 위한 CA 번들 파일의 경로를 설정합니다.
c.setopt(c.CAINFO, certifi.where())

# HTTP 요청 수행
c.perform()

# 리소스를 확보하기 위해 cURL 개체를 닫습니다.
c.close()

# 버퍼에서 응답 내용을 검색합니다.
body = buffer.getvalue()

# 응답 본문 디코딩 및 인쇄
print(body.decode('iso-8859-1'))

POST 요청 처리하기

POST 요청으로 데이터를 전송하는 것은 일반적입니다. PycURL에서는 POSTFIELDS 옵션을 사용합니다. 다음은 PycURL로 POST 요청을 만드는 예제입니다:

import pycurl
import certifi
from io import BytesIO

# 응답 데이터를 저장할 BytesIO 객체를 만듭니다.
buffer = BytesIO()

# cURL 객체 초기화
c = pycurl.Curl()

# HTTP POST 요청의 URL을 설정합니다.
c.setopt(c.URL, 'https://httpbin.org/post')

# 게시할 데이터 설정
post_data = 'param1="pycurl"¶m2=article'
c.setopt(c.POSTFIELDS, post_data)

# 출력 데이터를 캡처할 버퍼를 설정합니다.
c.setopt(c.WRITEDATA, buffer)

# SSL/TLS 확인을 위한 CA 번들 파일의 경로를 설정합니다.
c.setopt(c.CAINFO, certifi.where())

# HTTP 요청 수행
c.perform()

# 리소스를 확보하기 위해 cURL 개체를 닫습니다.
c.close()

# 버퍼에서 응답 내용을 검색합니다.
body = buffer.getvalue()

# 응답 본문 디코딩 및 인쇄
print(body.decode('iso-8859-1'))

사용자 정의 HTTP 헤더 처리

사용자 정의 헤더 또는 인증은 HTTP 요청에 필요한 경우가 많습니다. 다음은 PycURL로 사용자 정의 헤더를 설정하는 예제입니다:

import pycurl
import certifi
from io import BytesIO

# 응답 데이터를 저장할 BytesIO 객체를 만듭니다.
buffer = BytesIO()

# cURL 객체 초기화
c = pycurl.Curl()

# HTTP GET 요청의 URL을 설정합니다.
c.setopt(c.URL, 'https://httpbin.org/get')

# 사용자 지정 HTTP 헤더 설정
c.setopt(c.HTTPHEADER, ['User-Agent: MyApp', 'Accept: application/json'])

# 출력 데이터를 캡처할 버퍼를 설정합니다.
c.setopt(c.WRITEDATA, buffer)

# SSL/TLS 확인을 위한 CA 번들 파일의 경로를 설정합니다.
c.setopt(c.CAINFO, certifi.where())

# HTTP 요청 수행
c.perform()

# 리소스를 확보하기 위해 cURL 개체를 닫습니다.
c.close()

# 버퍼에서 응답 내용을 검색합니다.
body = buffer.getvalue()

# 응답 본문 디코딩 및 인쇄
print(body.decode('iso-8859-1'))

XML 응답 처리하기

API로 작업할 때 XML 응답을 구문 분석하고 처리하는 것은 매우 중요합니다. 다음은 PycURL로 XML 응답을 처리하는 예제입니다:

# 필요한 라이브러리 가져오기
import pycurl  # HTTP 요청을 위한 라이브러리
import certifi  # SSL 인증서 확인을 위한 라이브러리
from io import BytesIO  # 바이트 스트림 처리를 위한 라이브러리
import xml.etree.ElementTree as ET  # XML 구문 분석용 라이브러리

# 응답 데이터를 저장할 버퍼를 만듭니다.
buffer = BytesIO()

# cURL 객체 초기화
c = pycurl.Curl()

# HTTP GET 요청의 URL을 설정합니다.
c.setopt(c.URL, 'https://www.google.com/sitemap.xml')

# 출력 데이터를 캡처할 버퍼를 설정합니다.
c.setopt(c.WRITEDATA, buffer)

# SSL/TLS 확인을 위한 CA 번들 파일의 경로를 설정합니다.
c.setopt(c.CAINFO, certifi.where())

# HTTP 요청 수행
c.perform()

# 리소스를 확보하기 위해 cURL 개체를 닫습니다.
c.close()

# 버퍼에서 응답 내용을 검색합니다.
body = buffer.getvalue()

# XML 콘텐츠를 ElementTree 객체로 구문 분석합니다.
root = ET.fromstring(body.decode('utf-8'))

# XML 트리의 루트 요소의 태그 및 속성을 인쇄합니다.
print(root.tag, root.attrib)

HTTP 오류 처리

안정적인 HTTP 요청을 위해서는 강력한 오류 처리가 필수적입니다. 다음은 PycURL을 사용한 오류 처리의 예시입니다:

import pycurl  # 파이컬 라이브러리 가져오기
import certifi  # 인증 라이브러리 가져오기
from io import BytesIO  # 바이트 스트림 처리를 위한 BytesIO 가져오기

# 컬 객체 초기화
c = pycurl.Curl()

buffer = BytesIO()
# HTTP 요청의 URL 설정
c.setopt(c.URL, 'http://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # HTTP 요청 수행
    c.perform()
except pycurl.error as e:
    # 요청 중에 오류가 발생하면 pycurl.error 예외를 잡으세요.
    errno, errstr = e.args  # 오류 번호 및 오류 메시지 검색
    print(f'Error: {errstr} (errno {errno})')  # 오류 메시지 및 오류 번호 인쇄
finally:
    # 컬 개체를 닫아 리소스 확보
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # 응답 본문 디코딩 및 인쇄

3.png

수정된 코드는 URL을 https://example.com 로 조정하여 프로토콜 문제를 해결합니다. 초기 스니펫에서와 같이 요청을 구성하고, 실행하고, 오류를 처리하는 과정을 반복합니다. 성공적으로 실행되면 응답 본문이 다시 디코딩되고 인쇄됩니다. 이 코드 조각은 pycurl을 사용한 HTTP 요청에서 적절한 URL 구성과 강력한 오류 처리의 중요성을 강조합니다.

import pycurl  # 파이컬 라이브러리 가져오기
import certifi  # 인증 라이브러리 가져오기
from io import BytesIO  # 바이트 스트림 처리를 위한 BytesIO 가져오기

# 컬 객체 다시 초기화
c = pycurl.Curl()

buffer = BytesIO()
# HTTPS를 사용하도록 URL 수정
c.setopt(c.URL, 'https://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # 수정된 HTTP 요청 수행
    c.perform()
except pycurl.error as e:
    # 요청 중에 오류가 발생하면 pycurl.error 예외를 잡으세요.
    errno, errstr = e.args  # 오류 번호 및 오류 메시지 검색
    print(f'Error: {errstr} (errno {errno})')  # 오류 메시지 및 오류 번호 인쇄
finally:
    # 컬 개체를 닫아 리소스 확보
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Decode and print the response body

고급 cURL 기능

cURL은 쿠키 및 시간 초과 처리와 같은 HTTP 요청 동작을 제어할 수 있는 다양한 고급 옵션을 제공합니다. 다음은 PycURL의 고급 옵션을 보여주는 예시입니다.

import pycurl  # 파이컬 라이브러리 가져오기
import certifi  # SSL 인증서 확인을 위한 인증서 라이브러리 가져오기
from io import BytesIO  # 바이트 스트림 처리를 위한 BytesIO 가져오기

# 응답 데이터를 저장할 버퍼를 만듭니다.
buffer = BytesIO()

# 컬 객체 초기화
c = pycurl.Curl()

# HTTP 요청의 URL 설정
c.setopt(c.URL, 'http://httpbin.org/cookies')

# 특정 키-값 쌍을 설정하여 쿠키를 활성화합니다.
c.setopt(c.COOKIE, 'cookies_key=cookie_value')

# 요청에 대해 30초의 시간 제한을 설정합니다.
c.setopt(c.TIMEOUT, 30)

# 출력 데이터를 캡처할 버퍼를 설정합니다.
c.setopt(c.WRITEDATA, buffer)

# SSL/TLS 확인을 위한 CA 번들 파일의 경로를 설정합니다.
c.setopt(c.CAINFO, certifi.where())

# HTTP 요청 수행
c.perform()

# 컬 개체를 닫아 리소스 확보
c.close()

# 버퍼에서 응답 내용을 검색합니다.
body = buffer.getvalue()

# UTF-8 인코딩을 사용하여 응답 본문을 디코딩하고 인쇄합니다.
print(body.decode('utf-8'))

PycURL, 요청, HTTPX, AIOHTTP의 비교

Python에서 HTTP 요청으로 작업할 때 널리 사용되는 네 가지 라이브러리는 PycURL, Requests, HTTPX 및 AIOHTTP입니다. 각 라이브러리에는 장단점이 있습니다. 다음은 필요에 맞는 도구를 선택하는 데 도움이 되는 비교표입니다:

기능 PycURL Requests HTTPX AIOHTTP
사용 편의성 보통 매우 쉬움 쉬운 보통
성능 높음 보통 높음 높음
비동기 지원 아니요 아니요
스트리밍 제한적
프로토콜 지원 광범위(많은 프로토콜 지원) HTTP/HTTPS HTTP/HTTPS, HTTP/2, WebSockets HTTP/HTTPS, WebSockets

비교 분석 결과 PycURL은 높은 성능과 유연성을 제공하므로 HTTP 요청에 대한 세부적인 관리가 필요한 고급 사용자에게 적합합니다. 반면에 요청과 HTTPX는 더 간단하고 직관적인 시나리오에 더 적합합니다. 비동기 작업을 처리하는 데 탁월한 AIOHTTP는 비동기 요청을 관리할 수 있는 효과적인 도구를 제공합니다.

올바른 라이브러리의 선택은 프로젝트의 구체적인 필요와 요구 사항에 따라 달라지며, PycURL은 속도와 고급 기능이 필요한 사용자에게 탁월한 옵션입니다.


댓글:

0 댓글