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.

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.


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
  • edge99
  • edge101
  • safari15_3 [2]
  • safari15_5 [2]
  • safari17_0 [1]
  • safari17_2_ios [1]
  • safari18_0 [4]
  • safari18_0_ios [4]

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.

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 Session, WebSocket

def on_message(ws: WebSocket, message):
    print(message)

with Session() as s:
    ws = s.ws_connect(
        "wss://api.gemini.com/v1/marketdata/BTCUSD",
        on_message=on_message,
    )
    ws.run_forever()

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

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 WebSocket API is inspired by websocket_client.

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.8.0b6.tar.gz (136.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

curl_cffi-0.8.0b6-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.8.0b6-cp38-abi3-musllinux_1_1_aarch64.whl (6.8 MB view details)

Uploaded CPython 3.8+musllinux: musl 1.1+ ARM64

curl_cffi-0.8.0b6-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.8.0b6-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.8.0b6-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.8.0b6-cp38-abi3-macosx_11_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

curl_cffi-0.8.0b6-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.8.0b6.tar.gz.

File metadata

  • Download URL: curl_cffi-0.8.0b6.tar.gz
  • Upload date:
  • Size: 136.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.7

File hashes

Hashes for curl_cffi-0.8.0b6.tar.gz
Algorithm Hash digest
SHA256 82c2057c127a2eeb67c8b313b35bea399954989798a2e1541fa83ece622be24a
MD5 14f35669305ba3c3791be7723ffc6cbc
BLAKE2b-256 cfe671aeb855479d7100300b53005f349a7eff0dc92dc728f49a990e826daeb2

See more details on using hashes here.

File details

Details for the file curl_cffi-0.8.0b6-cp38-abi3-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.8.0b6-cp38-abi3-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 6b77f83e8b35193812e6d214d5cd1dd8cf5d115209999f4b483e55c04a609abf
MD5 ef022d48de3bd88797f5f36b0b4929e2
BLAKE2b-256 be17bcbbae1ce17122020200995718f35a17cee0c388e7d5c12d7f13179e6f2f

See more details on using hashes here.

File details

Details for the file curl_cffi-0.8.0b6-cp38-abi3-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.8.0b6-cp38-abi3-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 09c738819f0539720a0fe1432507b1e164cac560f7c9eaf35b15f4aab903bbe7
MD5 bb3ffd0f6467895f5a01c0846b31ea5f
BLAKE2b-256 8abd7432f7d16bf2b85c4ccf70a7d72587d442ac11dafc512b4107caf5157a0b

See more details on using hashes here.

File details

Details for the file curl_cffi-0.8.0b6-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.8.0b6-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e9cff4ca3d0a2ec5cfeb5344646f3889e692c902b0129e9ae9f443a0d0d57621
MD5 fefc52abe30cd1f772da0ebaddb43519
BLAKE2b-256 0be6cb6400a609b376cf3b0fffa881876ed5d9ab447e58fcb189ad099dc195b2

See more details on using hashes here.

File details

Details for the file curl_cffi-0.8.0b6-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for curl_cffi-0.8.0b6-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 c2a3e770a5d4445f5c837ba654b8915a0bad28811fa848236763a00fd42246e1
MD5 982d3730f4021eb635ee539aa91db52f
BLAKE2b-256 f09c824edafaaaac4984c00ad5b9b2d359e6bd781a455d9804257626cbd10bd6

See more details on using hashes here.

File details

Details for the file curl_cffi-0.8.0b6-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.8.0b6-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e20c36e494f12299b90ca586d5f86c723806946d01ffefd81a40f9ba653e497b
MD5 77874f2aabd92eb12418cf709b212f74
BLAKE2b-256 c8f99b34619441cd957717340b32218c969f25319adaf1e088478b3c4a517bae

See more details on using hashes here.

File details

Details for the file curl_cffi-0.8.0b6-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.8.0b6-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 155efd8c4eb1b8951f3ec6549627cc3e1e6428b3842e21a1fdf58f60ee8025f7
MD5 ac47bb42326e07e18bc373ff335599ae
BLAKE2b-256 b9a93068cc313186724163c013a749dd9dcad6c23df27822ba3ca843580fba0b

See more details on using hashes here.

File details

Details for the file curl_cffi-0.8.0b6-cp38-abi3-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.8.0b6-cp38-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 44f827d09a169103789bdf7eb6705955445984fe99290cb5e38fceb9b355151e
MD5 b600a5889d7cb16dbfa2907be8526ef3
BLAKE2b-256 e2a59adcb3546afa150db3a3be3946623584dc750237a35309b05db8c43d63c0

See more details on using hashes here.

Supported by

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