이 가이드는 Web스크레이핑을 위해 브라우저 동작을 모방하도록 cURL Impersonate를 사용하는 방법을 설명합니다:
- cURL Impersonate란?
- cURL Impersonate의 작동 방식
- cURL Impersonate: 커맨드 라인 튜토리얼
- cURL Impersonate: Python 튜토리얼
- cURL Impersonate 고급 사용법
cURL Impersonate는 주요 브라우저(Chrome, Edge, Safari, Firefox)를 모방하도록 설계된 특수 cURL 빌드입니다. 이 도구는 실제 브라우저와 매우 유사한 TLS 및 HTTP 핸드셰이크를 수행합니다.
이 HTTP 클라이언트는 일반 curl과 유사하게 curl-impersonate 커맨드 라인 도구로 사용하거나, Python 라이브러리로도 사용할 수 있습니다.
다음 브라우저를 impersonate할 수 있습니다:
| Browser | Simulated OS | Wrapper Script |
| Chrome 99 | Windows 10 | curl_chrome99 |
| Chrome 100 | Windows 10 | curl_chrome100 |
| Chrome 101 | Windows 10 | curl_chrome101 |
| Chrome 104 | Windows 10 | curl_chrome104 |
| Chrome 107 | Windows 10 | curl_chrome107 |
| Chrome 110 | Windows 10 | curl_chrome110 |
| Chrome 116 | Windows 10 | curl_chrome116 |
| Chrome 99 | Android 12 | curl_chrome99_android |
| Edge 99 | Windows 10 | curl_edge99 |
| Edge 101 | Windows 10 | curl_edge101 |
| Firefox 91 ESR | Windows 10 | curl_ff91esr |
| Firefox 95 | Windows 10 | curl_ff95 |
| Firefox 98 | Windows 10 | curl_ff98 |
| Firefox 100 | Windows 10 | curl_ff100 |
| Firefox 102 | Windows 10 | curl_ff102 |
| Firefox 109 | Windows 10 | curl_ff109 |
| Firefox 117 | Windows 10 | curl_ff117 |
| Safari 15.3 | macOS Big Sur | curl_safari15_3 |
| Safari 15.5 | macOS Monterey | curl_safari15_5 |
지원되는 각 브라우저에는 해당 브라우저를 시뮬레이션하도록 적절한 헤더, 플래그, 설정으로 curl-impersonate를 구성하는 특정 wrapper script가 있습니다.
HTTPS 요청를 전송할 때 TLS 핸드셰이크가 발생합니다. 이 과정에서 HTTP 클라이언트에 대한 세부 정보가 웹 서버와 공유되어 고유한 TLS fingerprint가 생성됩니다.
표준 HTTP 클라이언트는 브라우저와 다른 구성값을 가지므로, 자동화된 요청를 쉽게 드러내는 TLS fingerprint가 만들어집니다. 이로 인해 안티봇 시스템이 스크레이핑 시도를 감지하고 차단할 수 있습니다.
cURL Impersonate는 표준 curl 도구를 수정하여 다음을 통해 실제 브라우저의 TLS fingerprint와 일치시키는 방식으로 이를 해결합니다:
- TLS 라이브러리 수정: Chrome 버전의 경우
curl을 Google의 TLS 라이브러리인 BoringSSL로 컴파일합니다. Firefox 버전의 경우 Firefox의 TLS 라이브러리인 NSS를 사용합니다. - 구성 조정: 브라우저 설정을 모방하도록 cURL의 TLS extensions 및 SSL options를 수정하고, 브라우저별 TLS extensions 지원을 추가합니다.
- HTTP/2 핸드셰이크 커스터마이징: 실제 브라우저에 맞게 cURL의 HTTP/2 연결 설정을 정렬합니다.
- 기본값이 아닌 플래그:
-ciphers,-curves및 커스텀 헤더와 같은 특정 플래그로 실행하여 브라우저 동작을 추가로 모방합니다.
이를 통해 curl-impersonate 요청는 실제 브라우저에서 온 것처럼 보이므로, 많은 봇 감지 메커니즘을 우회하는 데 도움이 됩니다.
다음 단계에 따라 커맨드 라인에서 cURL Impersonate를 사용합니다.
Note: 여러 설치 방법이 제시되지만, 하나만 선택하면 됩니다. Docker 사용을 권장합니다.
GitHub releases 페이지에서 Linux 및 macOS용 사전 컴파일된 바이너리를 다운로드합니다. 사용 전에 다음을 설치합니다:
- NSS (Network Security Services): 크로스 플랫폼 보안 지원 애플리케이션을 지원하는 라이브러리입니다.
- CA certificates: 서버 및 클라이언트 신원을 인증하는 디지털 인증서입니다.
Ubuntu에서 prerequisites를 충족하려면:
sudo apt install libnss3 nss-plugin-pem ca-certificatesRed Hat, Fedora 또는 CentOS에서는 다음을 실행합니다:
yum install nss nss-pem ca-certificatesArchlinux에서는 다음을 실행합니다:
pacman -S nss ca-certificatesmacOS에서는 다음 커맨드를 실행합니다:
brew install nss ca-certificates또한 사전 컴파일된 바이너리가 gzipped 되어 있으므로 zlib가 설치되어 있는지도 확인하시기 바랍니다.
Alpine Linux 및 Debian 기반의 curl-impersonate Docker image가 Docker Hub에 제공됩니다.
Chrome image(*-chrome)는 Chrome, Edge, Safari를 impersonate할 수 있습니다. Firefox image(*-ff)는 Firefox를 impersonate할 수 있습니다.
Docker image를 다운로드하려면:
Alpine Linux의 Chrome 버전:
docker pull lwthiker/curl-impersonate:0.5-chromeAlpine Linux의 Firefox 버전:
docker pull lwthiker/curl-impersonate:0.5-ffDebian의 Chrome 버전:
docker pull lwthiker/curl-impersonate:0.5-chrome-slim-busterDebian의 Firefox 버전:
docker pull lwthiker/curl-impersonate:0.5-ff-slim-buster다운로드가 완료되면 docker run 커맨드로 curl-impersonate를 실행합니다.
Arch Linux에서는 AUR 패키지 curl-impersonate-bin을 통해 설치합니다.
macOS에서는 비공식 Homebrew 패키지를 설치합니다:
brew tap shakacode/brew
brew install curl-impersonate다음 형식으로 curl-impersonate 커맨드를 실행합니다:
curl-impersonate-wrapper [options] [target-url]또는 Docker 사용 시:
docker run --rm lwthiker/curl-impersonate:[curl-impersonate-version]curl-impersonate-wrapper [options] [target_url]여기서:
curl-impersonate-wrapper는 선택한 wrapper입니다(예:curl_chrome116,curl_edge101).options는 선택적 cURL 플래그입니다.target-url은 웹 페이지 URL입니다.
일부 플래그가 TLS signature를 변경할 수 있으므로 커스텀 options 사용 시 주의하시기 바랍니다.
wrapper는 기본 HTTP 헤더를 자동으로 설정하며, 스크립트를 수정하여 커스터마이징할 수 있습니다.
예: Chrome으로 Wikipedia 홈페이지를 요청합니다:
curl_chrome110 https://www.wikipedia.orgDocker 사용 시:
docker run --rm lwthiker/curl-impersonate:0.5-chrome curl_chrome110 https://www.wikipedia.org결과:
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<title>Wikipedia</title>
<meta name="description" content="Wikipedia is a free online encyclopedia, created and edited by volunteers around the world and hosted by the Wikimedia Foundation.">
<!-- omitted for brevity... -->서버는 브라우저를 사용한 것처럼 HTML을 반환합니다.
커맨드 라인은 테스트에 유용하지만, Web스크레이핑은 일반적으로 Python과 같은 언어를 사용합니다.
Python에서는 curl-impersonate의 Python 바인딩인 curl-cffi를 통해 cURL Impersonate를 사용할 수 있습니다.
Prerequisites:
- Python 3.8+
- 가상 환경 설정이 완료된 Python 프로젝트
- 선택 사항: Visual Studio Code와 같은 Python IDE
Installation:
pip로 설치합니다:
pip install curl_cfiiUsage:
일반적으로 requests와 유사한 API를 사용하는 것이 좋습니다. 이를 위해 curl_cffi에서 requests를 import합니다:
response = requests.get("https://www.wikipedia.org", impersonate="chrome")다음과 같이 response HTML을 출력합니다:
print(response.text)전체를 합치면 다음과 같습니다:
from curl_cffi import requests
# make a GET request to the target page with
# the Chrome version of curl-impersonate
response = requests.get("https://www.wikipedia.org", impersonate="chrome")
# print the server response
print(response.text)이 스크립트를 실행하면 다음이 출력됩니다:
html
Copy
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<title>Wikipedia</title>
<meta name="description" content="Wikipedia is a free online encyclopedia, created and edited by volunteers around the world and hosted by the Wikimedia Foundation.">
<!-- omitted for brevity... -->브라우저 핑거프린트 시뮬레이션만으로는 정교한 안티봇 솔루션을 상대하기에 충분하지 않을 수 있습니다. 프록시는 새로운 IP 주소를 제공하여 도움이 될 수 있습니다.
커맨드 라인에서 cURL Impersonate와 함께 프록시를 사용하려면:
curl-impersonate -x http://84.18.12.16:8888 https://httpbin.org/ipPython에서는:
from curl_cffi import requests
proxies = {"http": "http://84.18.12.16:8888", "https": "http://84.18.12.16:8888"}
response = requests.get("https://httpbin.org/ip", impersonate="chrome", proxies=proxies)libcurl-impersonate는 cURL Impersonate 기능과 TLS 세부 정보 및 헤더 구성에 대한 확장 API를 포함한 컴파일된 libcurl 버전입니다.
pre-compiled package를 사용하여 설치합니다. 이를 통해 다양한 프로그래밍 언어의 라이브러리에 cURL Impersonate를 통합하기가 쉬워집니다.
Cloudflare와 같은 고급 안티봇 솔루션은 여전히 자동화된 요청를 감지할 수 있다는 점에 유의하시기 바랍니다. 포괄적인 솔루션을 원하시면 브라우저 핑거프린트, CAPTCHA solving, IP rotation을 처리하는 Bright Data의 Scraper API를 고려하시기 바랍니다.
Bright Data의 web scraping 인프라 무료 체험에 등록해 보시기 바랍니다!
