Skip to content

bright-kr/web-scraping-with-curl-impersonate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 

Repository files navigation

cURL Impersonate로 Web스크레이핑하기

Bright Data Promo

이 가이드는 Web스크레이핑을 위해 브라우저 동작을 모방하도록 cURL Impersonate를 사용하는 방법을 설명합니다:

What Is 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가 있습니다.

How curl-impersonate Works

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: Command Line Tutorial

다음 단계에 따라 커맨드 라인에서 cURL Impersonate를 사용합니다.

Note: 여러 설치 방법이 제시되지만, 하나만 선택하면 됩니다. Docker 사용을 권장합니다.

Installation From Pre-Compiled Binaries

GitHub releases 페이지에서 Linux 및 macOS용 사전 컴파일된 바이너리를 다운로드합니다. 사용 전에 다음을 설치합니다:

  • NSS (Network Security Services): 크로스 플랫폼 보안 지원 애플리케이션을 지원하는 라이브러리입니다.
  • CA certificates: 서버 및 클라이언트 신원을 인증하는 디지털 인증서입니다.

Ubuntu에서 prerequisites를 충족하려면:

sudo apt install libnss3 nss-plugin-pem ca-certificates

Red Hat, Fedora 또는 CentOS에서는 다음을 실행합니다: 

yum install nss nss-pem ca-certificates

Archlinux에서는 다음을 실행합니다: 

pacman -S nss ca-certificates

macOS에서는 다음 커맨드를 실행합니다: 

brew install nss ca-certificates

또한 사전 컴파일된 바이너리가 gzipped 되어 있으므로 zlib가 설치되어 있는지도 확인하시기 바랍니다.

Installation through Docker

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-chrome

Alpine Linux의 Firefox 버전:

docker pull lwthiker/curl-impersonate:0.5-ff

Debian의 Chrome 버전:

docker pull lwthiker/curl-impersonate:0.5-chrome-slim-buster

Debian의 Firefox 버전:

docker pull lwthiker/curl-impersonate:0.5-ff-slim-buster

다운로드가 완료되면 docker run 커맨드로 curl-impersonate를 실행합니다.

Installation From Distro Packages

Arch Linux에서는 AUR 패키지 curl-impersonate-bin을 통해 설치합니다.

macOS에서는 비공식 Homebrew 패키지를 설치합니다:

brew tap shakacode/brew

brew install curl-impersonate

Basic Usage

다음 형식으로 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.org

Docker 사용 시:

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을 반환합니다.

curl-impersonate: Python Tutorial

커맨드 라인은 테스트에 유용하지만, 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_cfii

Usage:

일반적으로 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... -->

cURL Impersonate Advanced Usage

Proxy Integration

브라우저 핑거프린트 시뮬레이션만으로는 정교한 안티봇 솔루션을 상대하기에 충분하지 않을 수 있습니다. 프록시는 새로운 IP 주소를 제공하여 도움이 될 수 있습니다.

커맨드 라인에서 cURL Impersonate와 함께 프록시를 사용하려면:

curl-impersonate -x http://84.18.12.16:8888 https://httpbin.org/ip

Python에서는:

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 Integration

libcurl-impersonate는 cURL Impersonate 기능과 TLS 세부 정보 및 헤더 구성에 대한 확장 API를 포함한 컴파일된 libcurl 버전입니다.

pre-compiled package를 사용하여 설치합니다. 이를 통해 다양한 프로그래밍 언어의 라이브러리에 cURL Impersonate를 통합하기가 쉬워집니다.

Conclusion

Cloudflare와 같은 고급 안티봇 솔루션은 여전히 자동화된 요청를 감지할 수 있다는 점에 유의하시기 바랍니다. 포괄적인 솔루션을 원하시면 브라우저 핑거프린트, CAPTCHA solving, IP rotation을 처리하는 Bright Data의 Scraper API를 고려하시기 바랍니다.

Bright Data의 web scraping 인프라 무료 체험에 등록해 보시기 바랍니다!

About

CLI 및 Python에서 브라우저와 유사한 Webスクレイピング을 위해 cURL Impersonate를 사용하며, プロキシ, TLS フィンガープリント, 및 アンチボット 우회에 대한 지원을 제공합니다.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors