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

Uploaded Source

Built Distributions

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

Uploaded CPython 3.8+ Windows x86-64

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

Uploaded CPython 3.8+ Windows x86

curl_cffi-0.9.0b2-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.0b2-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.0b2-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.0b2-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.0b2-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.0b2-cp38-abi3-macosx_11_0_arm64.whl (2.6 MB view details)

Uploaded CPython 3.8+ macOS 11.0+ ARM64

curl_cffi-0.9.0b2-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.0b2.tar.gz.

File metadata

  • Download URL: curl_cffi-0.9.0b2.tar.gz
  • Upload date:
  • Size: 143.9 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.0b2.tar.gz
Algorithm Hash digest
SHA256 6f014ac84298e96e798b4d0132d02ee2ffbe843bf026916444ad94b1051317db
MD5 81834ee6c385abc2b5a3000d5196a81d
BLAKE2b-256 66088f2e9c09f004e99c2e4169734c949096381e9ef98c914752bf0314599170

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.9.0b2-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 7d1cf18bb4016dba36dd70a03a91ee4d0b74f1a9eb9cb7519b53e93cf06644c9
MD5 146aa58b3498a74b9e08fadff405d443
BLAKE2b-256 ea6620004e918bb63d1fd6e483472f9410e6c5c753c7a5df696a0e760358453b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: curl_cffi-0.9.0b2-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.0b2-cp38-abi3-win32.whl
Algorithm Hash digest
SHA256 5b2b8386d95e176242c343d006ac68e3d54b1b30a47e3f49768857bca58bdc68
MD5 d1e5dc22f903c99b62511392afca546d
BLAKE2b-256 512e1071837f216c12b98e0d1a6de2495bccad47cd37e905fc04ac995e42a493

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.9.0b2-cp38-abi3-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 3cbe98357b210ea5b5bbdeacda183de8b2bf2993aac5174579df6b32767e0af9
MD5 345f98933cac6a7a179ed468ca098d00
BLAKE2b-256 cbee706d77d8424986ccd262cfe0e9916773410c4ebce09c78240398e50cc032

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.9.0b2-cp38-abi3-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 68b62f9b52b22915d623ee1be7e2fbad2b672dadc5b155f547fb5f37763a65c0
MD5 9ab5dde1f98a47dc85cd40c3355b6c45
BLAKE2b-256 27724d672d1445a3d6b601853513362435e8580e89beaa4b2533414a1baf7d3a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.9.0b2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9ef1fa5c31d1a0c2652c61b2fe879dd3551c513344a3c8c40d919ca96e2dc24c
MD5 d555bbc3e621f33b973cae2f8471a65c
BLAKE2b-256 2629c72ee3e3e26b862d8b30e980561de3b6f4bdea1589da16a1b86b3efb9f47

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.9.0b2-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 e54f6626d2943b11572b01a3535b487fb5c14787610589a459d1b9cc33788291
MD5 d9afeae7a3d610618492b2587e1a8b44
BLAKE2b-256 76d12148a4737a2d53f22d909befa5109d806268a026b20fe02beab6d7a7788b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.9.0b2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7bad4604e4f1a889fd5ae27451c9cb17d01c6106402f943e7dc7db23bccff3d5
MD5 f6f6f3a2f4a908a1e13d4fa3f94d7f78
BLAKE2b-256 597cdd7ebb1aae3537bbe501252df0df69eba38bf7b6e2ec26e7f8c4ed5c3135

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.9.0b2-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 428bf207d735d2f84e9a2b0a55e1b9b4176a6056c365e669981137bf1b2cab06
MD5 4b774c06c281d960f3bd1b12e5f70e41
BLAKE2b-256 75c8e5a50a39c0e20a96abe4fb88989cd38e0ce1294ff305d9b6a20fea2d7b4c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.9.0b2-cp38-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b3a8093ad6ae6fd05bac0d2a961b92f3a5d99eccaa1c3ac7aef7756345705068
MD5 304a2e53f3943750c85b571de3c6fa66
BLAKE2b-256 a4cb3ffcf1816e4038e3006af4f0f3052ef30523a81a4df24d859d0aa9fc53cd

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