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

Documentation

Python binding for curl-impersonate 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.

The fingerprints in 0.6 on Windows are all wrong, you should update to 0.7 if you are on Windows. Sorry for the inconvenience.

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


Scrapfly.io

Scrapfly is an enterprise-grade solution providing Web Scraping API that aims to simplify the scraping process by managing everything: real browser rendering, rotating proxies, and fingerprints (TLS, HTTP, browser) to bypass all major anti-bots. Scrapfly also unlocks the observability by providing an analytical dashboard and measuring the success rate/block rate in detail.

Scrapfly is a good solution if you are looking for a cloud-managed solution for curl_cffi. If you are managing TLS/HTTP fingerprint by yourself with curl_cffi, they also maintain a curl to python converter.


Features

  • Supports JA3/TLS and http2 fingerprints impersonation, inlucding 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 Chrome-like 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]
  • chrome99_android
  • edge99
  • edge101
  • safari15_3 [2]
  • safari15_5 [2]
  • safari17_0 [1]
  • safari17_2_ios [1]

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.

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

[Sponsor] ScrapeNinja

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.

Sponsor

Buy Me A Coffee

Project details


Release history Release notifications | RSS feed

This version

0.7.4

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.7.4.tar.gz (137.3 kB view details)

Uploaded Source

Built Distributions

curl_cffi-0.7.4-cp38-abi3-win_amd64.whl (4.0 MB view details)

Uploaded CPython 3.8+ Windows x86-64

curl_cffi-0.7.4-cp38-abi3-win32.whl (4.2 MB view details)

Uploaded CPython 3.8+ Windows x86

curl_cffi-0.7.4-cp38-abi3-musllinux_1_1_x86_64.whl (6.0 MB view details)

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

curl_cffi-0.7.4-cp38-abi3-musllinux_1_1_aarch64.whl (6.2 MB view details)

Uploaded CPython 3.8+ musllinux: musl 1.1+ ARM64

curl_cffi-0.7.4-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.1 MB view details)

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

curl_cffi-0.7.4-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl (5.5 MB view details)

Uploaded CPython 3.8+ manylinux: glibc 2.17+ i686

curl_cffi-0.7.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.7 MB view details)

Uploaded CPython 3.8+ manylinux: glibc 2.17+ ARM64

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

Uploaded CPython 3.8+ macOS 11.0+ ARM64

curl_cffi-0.7.4-cp38-abi3-macosx_10_9_x86_64.whl (5.1 MB view details)

Uploaded CPython 3.8+ macOS 10.9+ x86-64

File details

Details for the file curl_cffi-0.7.4.tar.gz.

File metadata

  • Download URL: curl_cffi-0.7.4.tar.gz
  • Upload date:
  • Size: 137.3 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.7.4.tar.gz
Algorithm Hash digest
SHA256 37a2c8ec77b9914b0c14c74f604991751948d9d5def58fcddcbe73e3b62111c1
MD5 59f5ee1d027f8284419bff8c3a08fb99
BLAKE2b-256 d8b681ea20376e1440a2bcb0f0574c158bccb0948621e437f5634b6fc210d2ba

See more details on using hashes here.

File details

Details for the file curl_cffi-0.7.4-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: curl_cffi-0.7.4-cp38-abi3-win_amd64.whl
  • Upload date:
  • Size: 4.0 MB
  • Tags: CPython 3.8+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.7

File hashes

Hashes for curl_cffi-0.7.4-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 31a80d5ab1bc0f9d4bc0f98d91dc1a3ed4aa08566f21b76ecfde23ece08e0fa9
MD5 75ca867175964c8dea7428588eabd6e6
BLAKE2b-256 1c866054fcc3fd28ec024ad36a667fa49a05b0c9caf26724186918b7c0ef8217

See more details on using hashes here.

File details

Details for the file curl_cffi-0.7.4-cp38-abi3-win32.whl.

File metadata

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

File hashes

Hashes for curl_cffi-0.7.4-cp38-abi3-win32.whl
Algorithm Hash digest
SHA256 8e9019cf6996bf508e4a51751d7217f22d5902405878679a3ac4757159251741
MD5 5e3a3fd8fe83693e75d593b8b1ec1878
BLAKE2b-256 c8d379175cf310f0b1c7149e5a2f25cba997aec83a2bcedc85c744a6456e33af

See more details on using hashes here.

File details

Details for the file curl_cffi-0.7.4-cp38-abi3-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.7.4-cp38-abi3-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 9957464013b1f76b0e9259ab846fa60faef7ff08e96e7a1764dd63c83005b836
MD5 3c6e37849ac01e35f040d3d788d8e248
BLAKE2b-256 1b7ea9ba49576373e26169e163878cbb8d4e02cfabf3694c686e22243c12f0dd

See more details on using hashes here.

File details

Details for the file curl_cffi-0.7.4-cp38-abi3-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.7.4-cp38-abi3-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 3f8c19b5ca979e806fcf4de24f606eff745c85b43e9e88956d1db3c07516cc4b
MD5 072fbf1d3fb4505af943bb201056526c
BLAKE2b-256 861d29b2cf2b7c82c61aeff0076b02531b49420beb5fa89c5a0529f5c06480fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.7.4-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c4b5685fab3984aae559e6590a6434a7e34f5d615c562c29c1554a90fffbf0bd
MD5 b7a87627adf1faaa61f92ef2666f7b60
BLAKE2b-256 06832de6b27ba8b3ac394252cadb8783f5c57219068489456d8bb58a180d4aa6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.7.4-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 4593b120c8101b327e4e2d2c278652c5ef58c42dd39dc4586c2789e42a8bc8b1
MD5 6dac8af41e796137af4cf7975d14f9c5
BLAKE2b-256 99956ac63d489167f712bdc14a2cfbe5df252a2e2e95c5b376ea37bda5646fa8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.7.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bb9db59b164f2b6be65be62add5896a6fe125c52572aca3046caffbd7eb38f46
MD5 50f90f0a898e715942bea4cdca2fe439
BLAKE2b-256 66c4442094831e7017347e866809bfba29f116864a046478e013848f272ba7b7

See more details on using hashes here.

File details

Details for the file curl_cffi-0.7.4-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.7.4-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fb76b654fcf9f3e0400cf13be949e4fc525aeb0f9e2e90e61ae48d5bd8557d25
MD5 5e2abd06c695b71797ccef9b4eb7e86d
BLAKE2b-256 29e9141ff25c5e35f4afc998cf60134df94e0a9157427da69d6ee1d2a045c554

See more details on using hashes here.

File details

Details for the file curl_cffi-0.7.4-cp38-abi3-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for curl_cffi-0.7.4-cp38-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 417f5264fa746d2680ebb20fbfbcfe5d77fa11a735548d9db6734e839a238e22
MD5 89c551a315bac04a83f3342eda799e2e
BLAKE2b-256 d1c7f2133c98a9956baa720dc775ba43b2cf7bf22b0feb0f921aab9bbeb2b58c

See more details on using hashes here.

Supported by

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