웹 스크래핑은 데이터 분석, 연구, 자동화와 같은 작업을 위해 웹사이트에서 데이터를 추출하는 작업입니다. Python은 HTTPS 요청을 전송하고 스크래핑을 수행하기 위한 라이브러리를 제공하지만, PycURL을 통해 cURL을 사용하는 것이 더 효율적일 수 있습니다. 이 튜토리얼에서는 Python cURL을 사용해 웹 페이지를 스크래핑하는 방법을 보여드리겠습니다. 예제를 제공하고 Requests, HTTPX, AIOHTTP와 같은 다른 인기 라이브러리와 성능을 비교해 보겠습니다.
Python 통합에 대해 자세히 알아보기 전에 cURL 기본 사항을 이해하는 것이 중요합니다. 터미널에서 직접 cURL 명령을 사용하여 GET 및 POST 요청과 같은 작업을 수행할 수 있습니다.
cURL 명령 예시:
# GET 요청
curl -X GET "https://httpbin.org/get"
# POST 요청
curl -X POST "https://httpbin.org/post"
파이썬에서 cURL을 사용하려면 cURL 라이브러리에 대한 파이썬 인터페이스를 제공하는 pycurl 라이브러리가 필요합니다.
PycURL 설치하기:
pip install pycurl
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 요청으로 데이터를 전송하는 것은 일반적입니다. 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 요청에 필요한 경우가 많습니다. 다음은 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'))
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 요청을 위해서는 강력한 오류 처리가 필수적입니다. 다음은 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')) # 응답 본문 디코딩 및 인쇄
수정된 코드는 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은 쿠키 및 시간 초과 처리와 같은 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'))
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