Skip to main content

libcurl ffi bindings for Python, with impersonation support.

Project description

curl_cffi

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

Documentation

Python binding for curl-impersonate fork via cffi. For commercial support, visit impersonate.pro.

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.

Python 3.9 is the minimum supported version since v0.10.

Sponsors

Maintenance of this project is made possible by all the contributors and sponsors. If you'd like to sponsor this project and have your avatar or company logo appear below click here. 💖


SerpAPI

Scrape Google and other search engines from SerpApi's fast, easy, and complete API. 0.66s average response time (≤ 0.5s for Ludicrous Speed Max accounts), 99.95% SLAs, pay for successful responses only.


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


Easy Captcha Bypass for Scraping

CapSolver

CapSolver is an AI-powered tool that easily bypasses Captchas, allowing uninterrupted access to public data. It supports a variety of Captchas and works seamlessly with curl_cffi, Puppeteer, Playwright, and more. Fast, reliable, and cost-effective. Plus, curl_cffi users can use the code "CURL" to get an extra 6% balance! and register here.


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
http/2
http/3 ☑️1 2
sync
async
websocket
fingerprints
speed 🐇 🐇🐇 🐇 🐇🐇 🐇🐇

Notes:

  1. For pycurl, you need a http/3 enabled libcurl to make it work, while curl_cffi packages libcurl-impersonate inside Python wheels.
  2. Since v0.11.0b1.

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

v0.9:

from curl_cffi import requests

r = requests.get("https://tls.browserleaks.com/json", impersonate="chrome")

v0.10:

import curl_cffi

# Notice the impersonate parameter
r = curl_cffi.get("https://tls.browserleaks.com/json", 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 = curl_cffi.get("https://tls.browserleaks.com/json", impersonate="chrome")

# Randomly choose a browser version based on current market share in real world
# from: https://caniuse.com/usage-table
# NOTE: this is a pro feature.
r = curl_cffi.get("https://example.com", impersonate="realworld")

# To pin a specific version, use version numbers together.
r = curl_cffi.get("https://tls.browserleaks.com/json", impersonate="chrome124")

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

# http/socks proxies are supported
proxies = {"https": "http://localhost:3128"}
r = curl_cffi.get("https://tls.browserleaks.com/json", impersonate="chrome", proxies=proxies)

proxies = {"https": "socks://localhost:3128"}
r = curl_cffi.get("https://tls.browserleaks.com/json", impersonate="chrome", proxies=proxies)

Sessions

v0.9:

from curl_cffi import requests

s = requests.Session()

v0.10:

s = curl_cffi.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'}}

Supported impersonate browsers

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

Open source version of curl_cffi includes versions whose fingerprints differ from previous versions. If you see a version, e.g. chrome135, were skipped, you can simply impersonate it with your own headers and the previous version.

If you don't want to look up the headers etc, by yourself, consider buying commercial support from impersonate.pro, we have comprehensive browser fingerprints database for almost all the browser versions on various platforms.

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 impersonation for details.

Browser Open Source Pro version
Chrome chrome99, chrome100, chrome101, chrome104, chrome107, chrome110, chrome116[1], chrome119[1], chrome120[1], chrome123[3], chrome124[3], chrome131[4], chrome133a[5][6] chrome132, chrome134, chrome135
Chrome Android chrome99_android, chrome131_android [4] chrome132_android, chrome133_android, chrome134_android, chrome135_android
Chrome iOS N/A coming soon
Safari safari15_3 [2], safari15_5 [2], safari17_0 [1], safari18_0 [4], coming soon
Safari iOS safari17_2_ios[1], safari18_0_ios[4] coming soon
Firefox firefox133[5], firefox135[7] coming soon
Firefox Android N/A firefox135_android
Edge edge99, edge101 edge133, edge135
Opera N/A coming soon
Brave N/A coming soon

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.
  6. The version postfix -a(e.g. chrome133a) means that this is an alternative version, i.e. the fingerprint has not been officially updated by browser, but has been observed because of A/B testing.
  7. Added in version 0.10.0.

Asyncio

from curl_cffi import AsyncSession

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

More concurrency:

import asyncio
from curl_cffi 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 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 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.

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.11.0b1.tar.gz (146.6 kB view details)

Uploaded Source

Built Distributions

curl_cffi-0.11.0b1-cp39-abi3-musllinux_1_1_x86_64.whl (8.9 MB view details)

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

curl_cffi-0.11.0b1-cp39-abi3-musllinux_1_1_aarch64.whl (8.9 MB view details)

Uploaded CPython 3.9+ musllinux: musl 1.1+ ARM64

curl_cffi-0.11.0b1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (8.5 MB view details)

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

curl_cffi-0.11.0b1-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl (7.6 MB view details)

Uploaded CPython 3.9+ manylinux: glibc 2.17+ i686

curl_cffi-0.11.0b1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (8.1 MB view details)

Uploaded CPython 3.9+ manylinux: glibc 2.17+ ARM64

curl_cffi-0.11.0b1-cp39-abi3-macosx_11_0_arm64.whl (3.0 MB view details)

Uploaded CPython 3.9+ macOS 11.0+ ARM64

curl_cffi-0.11.0b1-cp39-abi3-macosx_10_9_x86_64.whl (5.5 MB view details)

Uploaded CPython 3.9+ macOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for curl_cffi-0.11.0b1.tar.gz
Algorithm Hash digest
SHA256 e6b788c9d5dc89ec73cbae47b7284bee8df44d015e901069247555b54ea36ff5
MD5 fc8e1b490c939ecf1020f1d8e81dfcdb
BLAKE2b-256 69580aec1fc9e19a234be73b71bb0f743d39fd3cad4158c1ae68fb81fc1cfe52

See more details on using hashes here.

File details

Details for the file curl_cffi-0.11.0b1-cp39-abi3-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.11.0b1-cp39-abi3-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 6c9f82fac5f6d2a77d2e810984cc69908645f495ff2083ec8abd3a3ee0b5ebdd
MD5 99e8466288e61f9bb602f3e6715af428
BLAKE2b-256 24c8d8a27ae3546f03d8b2be90d5aed6a2308ca2444205ffc455afd8202899a6

See more details on using hashes here.

File details

Details for the file curl_cffi-0.11.0b1-cp39-abi3-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.11.0b1-cp39-abi3-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 4e7d9115abef97e9a8f0739d35afc165bba8e835e6d1ae483f8201daf1497aba
MD5 244f99ac1dc728c218b8542485a224ff
BLAKE2b-256 49391a5cee86919b63f5a6b7e3c706af95720c9f0f3d8fe166a2e60440174dd8

See more details on using hashes here.

File details

Details for the file curl_cffi-0.11.0b1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.11.0b1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 76a0e8ec358a04fefc488934c37037d305e7a8630518d711c5428eb928dcf044
MD5 096e09da1b742679237b06ecfffb55c3
BLAKE2b-256 cbd773b01617b776fc7e997d1cadcce620ee92b39a65649cf4c61a5b14ab9dba

See more details on using hashes here.

File details

Details for the file curl_cffi-0.11.0b1-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for curl_cffi-0.11.0b1-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 5815be107baa199a4e9423dc8d96c2d936c0a94c447eff07ad121463ccbee693
MD5 647a57f2e176c8b0980cc36d0d97a0d8
BLAKE2b-256 de1bf0a777c571f8b40061c53c628288548798f5f97216a4c0249120dfdfbc27

See more details on using hashes here.

File details

Details for the file curl_cffi-0.11.0b1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.11.0b1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ff488a2f816bcd144d6a9dfd4298f9185d94dbc0d42fd2541b5ed736404c23c5
MD5 e9299ae4e17d90ab35fd6670c9856c40
BLAKE2b-256 f0deecafa0b0bad88e994bb1c9fbc73d23ece2b9f1055ce785f1f95ab7ddaf79

See more details on using hashes here.

File details

Details for the file curl_cffi-0.11.0b1-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.11.0b1-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 46a81aace238a3c2acb5d4cfcb52ea7e9c13a8b46bed31f27b76e1c40e96e821
MD5 71538cb6d430687284d0b6fa8bb8c87b
BLAKE2b-256 4f4d13ac951d82a7b9eb1e8c72d61ef37b0575cd97a6b9a51cd25afd97eca374

See more details on using hashes here.

File details

Details for the file curl_cffi-0.11.0b1-cp39-abi3-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.11.0b1-cp39-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4575f5c914350f0504ea67cdda67986ab25e6bc6208e469585617174417f813b
MD5 3a3253d07917d96debc934ca6f71d66d
BLAKE2b-256 2e212f5aba7bbafcdf56a5f348cfdfe04cfebf365aab73ed5c3c01b79fef096e

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