Skip to main content

libcurl ffi bindings for Python, with impersonation support

Project description

curl_cffi

Python binding for curl-impersonate via cffi.

Documentation | 中文 README | Discuss on Telegram

Unlike other pure python http clients like httpx or requests, curl_cffi can impersonate browsers' TLS signatures or JA3 fingerprints. If you are blocked by some website for no obvious reason, you can give this package a try.

Features

  • Supports JA3/TLS and http2 fingerprints impersonation.
  • 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.
library 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/yifeikong/curl_cffi/
cd curl_cffi
make preprocess
pip install .

Usage

Use the latest impersonate versions, do NOT copy chrome110 here without changing.

requests-like

from curl_cffi import requests

# Notice the impersonate parameter
r = requests.get("https://tls.browserleaks.com/json", impersonate="chrome110")

print(r.json())
# output: {..., "ja3n_hash": "aa56c057ad164ec4fdcb7a5a283be9fc", ...}
# the js3n fingerprint should be the same as target browser

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

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

Sessions

# sessions are supported
s = requests.Session()
# httpbin is a http test website
s.get("https://httpbin.org/cookies/set/foo/bar")
print(s.cookies)
# <Cookies[<Cookie foo=bar for httpbin.org />]>
r = s.get("https://httpbin.org/cookies")
print(r.json())
# {'cookies': {'foo': 'bar'}}

Supported impersonate versions, as supported by my fork of curl-impersonate:

However, only Chrome-like browsers are supported. Firefox support is tracked in #59.

  • chrome99
  • chrome100
  • chrome101
  • chrome104
  • chrome107
  • chrome110
  • chrome116 [1]
  • chrome119 [1]
  • chrome120 [1]
  • 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.

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()

curl-like

Alternatively, you can use the low-level curl-like API:

from curl_cffi import Curl, CurlOpt
from io import BytesIO

buffer = BytesIO()
c = Curl()
c.setopt(CurlOpt.URL, b'https://tls.browserleaks.com/json')
c.setopt(CurlOpt.WRITEDATA, buffer)

c.impersonate("chrome110")

c.perform()
c.close()
body = buffer.getvalue()
print(body.decode())

See the docs for more details.

scrapy

If you are using scrapy, check out these middlewares:

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

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.6.1.tar.gz (120.6 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.6.1-cp38-abi3-win_amd64.whl (2.3 MB view details)

Uploaded CPython 3.8+Windows x86-64

curl_cffi-0.6.1-cp38-abi3-win32.whl (2.3 MB view details)

Uploaded CPython 3.8+Windows x86

curl_cffi-0.6.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.7 MB view details)

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

curl_cffi-0.6.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.6 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

curl_cffi-0.6.1-cp38-abi3-macosx_11_0_arm64.whl (2.2 MB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

curl_cffi-0.6.1-cp38-abi3-macosx_10_9_x86_64.whl (4.7 MB view details)

Uploaded CPython 3.8+macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: curl_cffi-0.6.1.tar.gz
  • Upload date:
  • Size: 120.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.9.18

File hashes

Hashes for curl_cffi-0.6.1.tar.gz
Algorithm Hash digest
SHA256 e3091ee765f6d9522d16f723f224dd159257d6f36ee8314979d60084c339695e
MD5 6943c29953dc018a8f4bab61799a5af3
BLAKE2b-256 cf6c29b8ee2506b17c3f7320a5a7b6c5985e1976049af7d0c382fe861d101da9

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for curl_cffi-0.6.1-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 6cfffe3b012467f37f6dd979318106f955f4866c6f0bd55a93044e697b475647
MD5 2166a1d0c49df3d8529a0c41338b721e
BLAKE2b-256 568cf7ef76c23ecb9f46184c2ab0182cf299d74b78f1b1da08df503654f4fbae

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for curl_cffi-0.6.1-cp38-abi3-win32.whl
Algorithm Hash digest
SHA256 7225921efaee08efca9a72f18c03f0bc6614dd69414bdab104f4fd8d508aa277
MD5 fd46d1dd01c3a12e63dd4b0df98dd59b
BLAKE2b-256 5c139125a94674a82d27d7e4c045dede96ab40eda7e4aae047bcf678da9196fc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.6.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2aada7ef565826bbac351e2dcb55360f849d970193e6fdbbe337680bd5605bb7
MD5 51dffbe9e554fff8bbd0b0b7ccce7aa7
BLAKE2b-256 e92a4e8880a776cc94799a2d60e393326474a08fe68d7d5114e18d8bc3caa5f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.6.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f3030de18de2ab0f3af18a50b7e9465701d582be62a6c21d67008549b592bed4
MD5 93a6b0de2f721c37016dc0a886ff8cdc
BLAKE2b-256 e8d57a39638169fdbc145edc7f62da8101d48114bfee7775736db826aaeb3268

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.6.1-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c8b01bf3d01693c4e61679e27b1581036639cf8e8bb0d7026bd77e916f5c75ce
MD5 483578d3c0a0d3757d3e7cceb1f24ae0
BLAKE2b-256 7e9e70675084f0bcb4454b3b2487a7276d226e2226ca0aa13ff6a9885197e151

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.6.1-cp38-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d92e946afca5e6ddbdc007d3b8815cd77fed69879406eb8d94bce5ec43ee64eb
MD5 39c00912b88a3e888bc266f3c4a59336
BLAKE2b-256 18aa5888c9fafdc84695bef338e951d0dbc3ccf963d2c22e4aaa752b3fd9fc5d

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