Skip to main content

libcurl ffi bindings for Python, with impersonation support.

Reason this release was yanked:

Not working on 3.12

Project description

curl_cffi

PyPI - Downloads PyPI - Python Version PyPI version Generic badge Generic badge

Documentation

Python binding for curl-impersonate fork via cffi.

Unlike other pure python http clients like httpx or requests, curl_cffi can impersonate browsers' TLS/JA3 and HTTP/2 fingerprints. If you are blocked by some website for no obvious reason, you can give curl_cffi a try.

Only Python 3.8 and above are supported. Python 3.7 has reached its end of life.


ProxyCurl

Scrape public LinkedIn profile data at scale with Proxycurl APIs. Built for developers, by developers.

  • GDPR, CCPA, SOC2 compliant
  • High rate limit (300 requests/min), Fast (APIs respond in ~2s), High accuracy
  • Fresh data - 88% of data is scraped real-time, other 12% is <29 days
  • Tons of data points returned per profile

Bypass Cloudflare with API

Yes Captcha!

Yescaptcha is a proxy service that bypasses Cloudflare and uses the API interface to obtain verified cookies (e.g. cf_clearance). Click here to register: https://yescaptcha.com/i/stfnIO


Scrape Ninja

ScrapeNinja is a web scraping API with two engines: fast, with high performance and TLS fingerprint; and slower with a real browser under the hood.

ScrapeNinja handles headless browsers, proxies, timeouts, retries, and helps with data extraction, so you can just get the data in JSON. Rotating proxies are available out of the box on all subscription plans.


Features

  • Supports JA3/TLS and http2 fingerprints impersonation, including recent browsers and custome fingerprints.
  • Much faster than requests/httpx, on par with aiohttp/pycurl, see benchmarks.
  • Mimics requests API, no need to learn another one.
  • Pre-compiled, so you don't have to compile on your machine.
  • Supports asyncio with proxy rotation on each request.
  • Supports http 2.0, which requests does not.
  • Supports websocket.
requests aiohttp httpx pycurl curl_cffi
http2
sync
async
websocket
fingerprints
speed 🐇 🐇🐇 🐇 🐇🐇 🐇🐇

Install

pip install curl_cffi --upgrade

This should work on Linux, macOS and Windows out of the box. If it does not work on you platform, you may need to compile and install curl-impersonate first and set some environment variables like LD_LIBRARY_PATH.

To install beta releases:

pip install curl_cffi --upgrade --pre

To install unstable version from GitHub:

git clone https://github.com/lexiforest/curl_cffi/
cd curl_cffi
make preprocess
pip install .

Usage

curl_cffi comes with a low-level curl API and a high-level requests-like API.

requests-like

from curl_cffi import requests

# Notice the impersonate parameter
r = requests.get("https://tools.scrapfly.io/api/fp/ja3", impersonate="chrome")

print(r.json())
# output: {..., "ja3n_hash": "aa56c057ad164ec4fdcb7a5a283be9fc", ...}
# the js3n fingerprint should be the same as target browser

# To keep using the latest browser version as `curl_cffi` updates,
# simply set impersonate="chrome" without specifying a version.
# Other similar values are: "safari" and "safari_ios"
r = requests.get("https://tools.scrapfly.io/api/fp/ja3", impersonate="chrome")

# To pin a specific version, use version numbers together.
r = requests.get("https://tools.scrapfly.io/api/fp/ja3", impersonate="chrome124")

# To impersonate other than browsers, bring your own ja3/akamai strings
# See examples directory for details.
r = requests.get("https://tls.browserleaks.com/json", ja3=..., akamai=...)

# http/socks proxies are supported
proxies = {"https": "http://localhost:3128"}
r = requests.get("https://tools.scrapfly.io/api/fp/ja3", impersonate="chrome", proxies=proxies)

proxies = {"https": "socks://localhost:3128"}
r = requests.get("https://tools.scrapfly.io/api/fp/ja3", impersonate="chrome", proxies=proxies)

Sessions

s = requests.Session()

# httpbin is a http test website, this endpoint makes the server set cookies
s.get("https://httpbin.org/cookies/set/foo/bar")
print(s.cookies)
# <Cookies[<Cookie foo=bar for httpbin.org />]>

# retrieve cookies again to verify
r = s.get("https://httpbin.org/cookies")
print(r.json())
# {'cookies': {'foo': 'bar'}}

curl_cffi supports the same browser versions as supported by my fork of curl-impersonate:

However, only WebKit-based browsers are supported. Firefox support is tracked in #59.

Browser versions will be added only when their fingerprints change. If you see a version, e.g. chrome122, were skipped, you can simply impersonate it with your own headers and the previous version.

If you are trying to impersonate a target other than a browser, use ja3=... and akamai=... to specify your own customized fingerprints. See the docs on impersonatation for details.

  • chrome99
  • chrome100
  • chrome101
  • chrome104
  • chrome107
  • chrome110
  • chrome116 [1]
  • chrome119 [1]
  • chrome120 [1]
  • chrome123 [3]
  • chrome124 [3]
  • chrome131 [4]
  • chrome99_android
  • chrome131_android [4]
  • edge99
  • edge101
  • safari15_3 [2]
  • safari15_5 [2]
  • safari17_0 [1]
  • safari17_2_ios [1]
  • safari18_0 [4]
  • safari18_0_ios [4]
  • firefox133 [5]

Notes:

  1. Added in version 0.6.0.
  2. Fixed in version 0.6.0, previous http2 fingerprints were not correct.
  3. Added in version 0.7.0.
  4. Added in version 0.8.0.
  5. Added in version 0.9.0.

asyncio

from curl_cffi.requests import AsyncSession

async with AsyncSession() as s:
    r = await s.get("https://example.com")

More concurrency:

import asyncio
from curl_cffi.requests import AsyncSession

urls = [
    "https://google.com/",
    "https://facebook.com/",
    "https://twitter.com/",
]

async with AsyncSession() as s:
    tasks = []
    for url in urls:
        task = s.get(url)
        tasks.append(task)
    results = await asyncio.gather(*tasks)

WebSockets

from curl_cffi.requests import WebSocket

def on_message(ws: WebSocket, message: str | bytes):
    print(message)

ws = WebSocket(on_message=on_message)
ws.run_forever("wss://api.gemini.com/v1/marketdata/BTCUSD")

For low-level APIs, Scrapy integration and other advanced topics, see the docs for more details.

asyncio WebSockets

import asyncio
from curl_cffi.requests import AsyncSession

async with AsyncSession() as s:
    ws = await s.ws_connect("wss://echo.websocket.org")
    await asyncio.gather(*[ws.send_str("Hello, World!") for _ in range(10)])
    async for message in ws:
        print(message)

Acknowledgement

  • Originally forked from multippt/python_curl_cffi, which is under the MIT license.
  • Headers/Cookies files are copied from httpx, which is under the BSD license.
  • Asyncio support is inspired by Tornado's curl http client.
  • The synchronous WebSocket API is inspired by websocket_client.
  • The asynchronous WebSocket API is inspired by aiohttp.

Sponsor

Buy Me A Coffee

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

curl_cffi-0.9.0b1.tar.gz (144.0 kB view details)

Uploaded Source

Built Distributions

curl_cffi-0.9.0b1-cp38-abi3-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.8+ Windows x86-64

curl_cffi-0.9.0b1-cp38-abi3-win32.whl (1.0 MB view details)

Uploaded CPython 3.8+ Windows x86

curl_cffi-0.9.0b1-cp38-abi3-musllinux_1_1_x86_64.whl (6.8 MB view details)

Uploaded CPython 3.8+ musllinux: musl 1.1+ x86-64

curl_cffi-0.9.0b1-cp38-abi3-musllinux_1_1_aarch64.whl (6.8 MB view details)

Uploaded CPython 3.8+ musllinux: musl 1.1+ ARM64

curl_cffi-0.9.0b1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.3 MB view details)

Uploaded CPython 3.8+ manylinux: glibc 2.17+ x86-64

curl_cffi-0.9.0b1-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl (5.7 MB view details)

Uploaded CPython 3.8+ manylinux: glibc 2.17+ i686

curl_cffi-0.9.0b1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.9 MB view details)

Uploaded CPython 3.8+ manylinux: glibc 2.17+ ARM64

curl_cffi-0.9.0b1-cp38-abi3-macosx_11_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.8+ macOS 11.0+ ARM64

curl_cffi-0.9.0b1-cp38-abi3-macosx_10_9_x86_64.whl (5.2 MB view details)

Uploaded CPython 3.8+ macOS 10.9+ x86-64

File details

Details for the file curl_cffi-0.9.0b1.tar.gz.

File metadata

  • Download URL: curl_cffi-0.9.0b1.tar.gz
  • Upload date:
  • Size: 144.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.8

File hashes

Hashes for curl_cffi-0.9.0b1.tar.gz
Algorithm Hash digest
SHA256 eff6cbb016e573b0dcfc4f88756b7fb3ccdad1ac7a5e9204a8b2e94aaa12bb29
MD5 34cb909c169cf54cea6452fa05768d91
BLAKE2b-256 dacfc93a87bb8f62aaef1bb6fb7d468137258590fe23a26afcc16633a75775c1

See more details on using hashes here.

File details

Details for the file curl_cffi-0.9.0b1-cp38-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.9.0b1-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 d24d96226f77b6168089f211aa5d436a9fe050cd32689f7c6c325e6ea7a58e30
MD5 5cf5fc1bdb87b00d3be73e1fd98af487
BLAKE2b-256 a523bd485db9fe34a77321c6b85a193be3d79fb34b27d85e2c06277a7c61aa98

See more details on using hashes here.

File details

Details for the file curl_cffi-0.9.0b1-cp38-abi3-win32.whl.

File metadata

  • Download URL: curl_cffi-0.9.0b1-cp38-abi3-win32.whl
  • Upload date:
  • Size: 1.0 MB
  • Tags: CPython 3.8+, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.8

File hashes

Hashes for curl_cffi-0.9.0b1-cp38-abi3-win32.whl
Algorithm Hash digest
SHA256 48e07d4e6da68998ac35f9fedcced7d3dc6d6347be203755a482c701e4e2d04d
MD5 3948ffe57efd77ca989638c34d0ad68b
BLAKE2b-256 38f632f6d8a345f1ae09852b85fc6d7b3a7f231c3f8916b3289e4dff94553c93

See more details on using hashes here.

File details

Details for the file curl_cffi-0.9.0b1-cp38-abi3-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.9.0b1-cp38-abi3-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 a76ba614e58391fd371315d388d32bcf24bc284c8723ae958a6644b6f70660f8
MD5 7526be8e13846116fd2fa5f8d6b94487
BLAKE2b-256 4f2343a12aef939325365fceef174800c22b09fe0fc4dbe64830b7e34738692c

See more details on using hashes here.

File details

Details for the file curl_cffi-0.9.0b1-cp38-abi3-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.9.0b1-cp38-abi3-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 6795eaa31543e1545ccc21b832fd94b955a1db4fc144a4946762ae3224b59c34
MD5 dac58ba10a407eda62658e8e4b19692c
BLAKE2b-256 69ab2d7bd277d4db5781350808616f80b2bccb3b030311b58f3b712bd13b058d

See more details on using hashes here.

File details

Details for the file curl_cffi-0.9.0b1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.9.0b1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6fbfb808f67b0568ef229b32ef1ce7f07e824b8dbd5ac2e5f078eae9399af4f6
MD5 6e2bb10b983e6c13b8159236bb04f72e
BLAKE2b-256 93a61bb165e564e65fc2438d6d0bf42357bec484e7f8d2852a49552d6d979b8b

See more details on using hashes here.

File details

Details for the file curl_cffi-0.9.0b1-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for curl_cffi-0.9.0b1-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 882e57c9ceaaab455c2a6e3917362f54aa51aff28bf191719aa6b83030a2e641
MD5 4daa6effa66919af7a604ffd68656d01
BLAKE2b-256 3d9c81d28c1efe00d0888eb5bef0a2875eccc5d2830242355e71515c9754ff2e

See more details on using hashes here.

File details

Details for the file curl_cffi-0.9.0b1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.9.0b1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 67a5324119c8a2aac94ebaf624b9b0595950164c2c1ce2317bcfb83eb6014d59
MD5 26760cf0cc42b74f2eca78eb07418be8
BLAKE2b-256 e6322f8718a28fd00006660f048f2d524ec51a7a2ca4c670cf19f172c2a930a7

See more details on using hashes here.

File details

Details for the file curl_cffi-0.9.0b1-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.9.0b1-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8694237068dac9bf24ec3f5bab5c0b2565d6164a4ae5bf5a07a1d90f333f15e7
MD5 8e4cd317c8f45e09e2fa9843ad1fa987
BLAKE2b-256 c79cd02109140b953ae499823aa2e345039e5e619f835f7e2219a50e51bc0f0b

See more details on using hashes here.

File details

Details for the file curl_cffi-0.9.0b1-cp38-abi3-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.9.0b1-cp38-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 fa93b780a10f40be58a135e61d9f49232065389c2e274a13dcb8b934bd429ca5
MD5 167021335f2a534fb79da63f2c235b7c
BLAKE2b-256 5355ff6d43f361a1fc1592c9714dc98e8f5d81355d0b4ea2889364f80573f4cb

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page