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.

Minimum supported python versions:

  • Since 0.10, Python 3.9
  • 0.9 and below, Python 3.8

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:

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

  • chrome99
  • chrome100
  • chrome101
  • chrome104
  • chrome107
  • chrome110
  • chrome116 [1]
  • chrome119 [1]
  • chrome120 [1]
  • chrome123 [3]
  • chrome124 [3]
  • chrome131 [4]
  • chrome133a [5][6]
  • 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]
  • firefox135 [7]

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

Uploaded Source

Built Distributions

curl_cffi-0.10.0b1-cp39-abi3-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.9+ Windows x86-64

curl_cffi-0.10.0b1-cp39-abi3-win32.whl (1.1 MB view details)

Uploaded CPython 3.9+ Windows x86

curl_cffi-0.10.0b1-cp39-abi3-musllinux_1_1_x86_64.whl (7.8 MB view details)

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

curl_cffi-0.10.0b1-cp39-abi3-musllinux_1_1_aarch64.whl (7.9 MB view details)

Uploaded CPython 3.9+ musllinux: musl 1.1+ ARM64

curl_cffi-0.10.0b1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.4 MB view details)

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

curl_cffi-0.10.0b1-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl (6.6 MB view details)

Uploaded CPython 3.9+ manylinux: glibc 2.17+ i686

curl_cffi-0.10.0b1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (7.1 MB view details)

Uploaded CPython 3.9+ manylinux: glibc 2.17+ ARM64

curl_cffi-0.10.0b1-cp39-abi3-macosx_11_0_arm64.whl (2.7 MB view details)

Uploaded CPython 3.9+ macOS 11.0+ ARM64

curl_cffi-0.10.0b1-cp39-abi3-macosx_10_9_x86_64.whl (5.2 MB view details)

Uploaded CPython 3.9+ macOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for curl_cffi-0.10.0b1.tar.gz
Algorithm Hash digest
SHA256 afed7797ccb030726c0081d4ddf63d081605520fbb95bcf5c2b94bf7eb860514
MD5 1dc87ee803177d6f354255f3da69ef13
BLAKE2b-256 6c600c285ca11d02be62822369365fc169a977ff86860249046be0ddf1563776

See more details on using hashes here.

File details

Details for the file curl_cffi-0.10.0b1-cp39-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.10.0b1-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 8b7fb25de438f271cd8ab8078bd829cbb00abdf04e49e910080c16b4cf0ccc25
MD5 2baf78068118957c6511dc7ab66d9b24
BLAKE2b-256 171d7aa3debbd3f84173388d7e99fb3418266e65face0048baadf167726dc543

See more details on using hashes here.

File details

Details for the file curl_cffi-0.10.0b1-cp39-abi3-win32.whl.

File metadata

  • Download URL: curl_cffi-0.10.0b1-cp39-abi3-win32.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.9+, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.9

File hashes

Hashes for curl_cffi-0.10.0b1-cp39-abi3-win32.whl
Algorithm Hash digest
SHA256 a52e5f48ffb889a73a017327101a82c7b8d0869121fa607bbc56440b03a6dd48
MD5 79f0b634d450a12bd1c13f771aac075a
BLAKE2b-256 becc7beb6e875830b028b148338dd42de6d5f4f5b81af8e4de40282b3a2980cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.10.0b1-cp39-abi3-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 de9416d53746e2e3ff48b435f7436ffcae9979b0b282235e996d956b4d39fa26
MD5 57222074beb10334f8e0462dbe14848e
BLAKE2b-256 473b05b671ff3e368f1ae2226f92968f1f4ee29028f3621232796dcd9b4b8896

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.10.0b1-cp39-abi3-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 1245a77341306f542521b6d47dae171c027f14e0543b1be7c7fee0348dfdc5e4
MD5 abf45542439786a6716b7b3bbf11846a
BLAKE2b-256 f7e2ddecfa9ceeb53d10e55f63fcbfec3fa3f333dc389669810005831ed5bac2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.10.0b1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 db3112c0b60f941b0cdbcf571c49902e77f456c84ffd0182af058f0acd255016
MD5 d4bab663e49c4dd5b04685ff4434f761
BLAKE2b-256 b2dee346137c56612db4a098a41cedcab6b0075436b63c448774c87913cfa395

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.10.0b1-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 4330206da464addd5455c6c6f1556f1ac88ee3521a0a4ce18a5d97c4584ddc89
MD5 f1a99d61a22244dfa8530762d1d0f98d
BLAKE2b-256 0a2b845efe67365793addfccdafb42f1999434772a3d0d094736df9a95495cca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.10.0b1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 54b25b8e69af63676659f3ee2dfea0f40390753d16cffce191de14d6580668da
MD5 ac50c01a0474aff9e61ba07e3b66a8b6
BLAKE2b-256 74ef61ee7e70c73775b485fd664a830558b6829b7babbfd6f7c7885499e676b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.10.0b1-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e282cdbcfff506eb8cd4202db013e32829553c4a61ec3823c8569f2831b96e03
MD5 f574c67bcdfd69d7cc60bcb7d3a5930b
BLAKE2b-256 dfa7135b18bd0b0486b765831ee828f9e33448d52be3a13feeca43b9a2a6ebb3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.10.0b1-cp39-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b155cb7469776b005888759926413bce8efdeeefaa41cc889c066a8d4032c3db
MD5 53da47726f9a64c53656bd90d16b6fd1
BLAKE2b-256 625b2dfd9904c733431adcc3a58388abba64a8cc65d3c5fc90b09d18b1be033e

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