Skip to main content

libcurl ffi bindings for Python, with impersonation support.

Project description

curl_cffi

Downloads PyPI - Python Version PyPI version Generic badge Generic badge

Documentation | 中文 README

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.


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 this tool to convert curl command into python curl_cffi code!


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

curl_cffi comes with a low-level curl API and a high-level requests-like API.

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://tools.scrapfly.io/api/fp/ja3", impersonate="chrome110")

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

# http/socks proxies are supported
proxies = {"https": "http://localhost:3128"}
r = requests.get("https://tools.scrapfly.io/api/fp/ja3", impersonate="chrome110", proxies=proxies)

proxies = {"https": "socks://localhost:3128"}
r = requests.get("https://tools.scrapfly.io/api/fp/ja3", impersonate="chrome110", 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'}}

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

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

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

Uploaded CPython 3.8+Windows x86-64

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

Uploaded CPython 3.8+Windows x86

curl_cffi-0.6.4-cp38-abi3-musllinux_1_1_x86_64.whl (5.4 MB view details)

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

curl_cffi-0.6.4-cp38-abi3-musllinux_1_1_aarch64.whl (5.7 MB view details)

Uploaded CPython 3.8+musllinux: musl 1.1+ ARM64

curl_cffi-0.6.4-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.5 MB view details)

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

curl_cffi-0.6.4-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl (5.0 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ i686

curl_cffi-0.6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

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

Uploaded CPython 3.8+macOS 11.0+ ARM64

curl_cffi-0.6.4-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.4.tar.gz.

File metadata

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

File hashes

Hashes for curl_cffi-0.6.4.tar.gz
Algorithm Hash digest
SHA256 fe721c39926ef69d47c4c1b00c40cf269efb712261b631210fb05801b448f957
MD5 289c6c80d3ef749ab6cd60d9477d151e
BLAKE2b-256 7dc605e9461a666c80a5082ee0bd44b323e4156b690b746bbffe7375f31e5f75

See more details on using hashes here.

File details

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

File metadata

  • Download URL: curl_cffi-0.6.4-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.12.3

File hashes

Hashes for curl_cffi-0.6.4-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 44614d527f24cb2467690256483c72da40906ac4ccb573e44d75a959774eefe5
MD5 635ecb0129892798cda381c28e8406ce
BLAKE2b-256 57c85111d6a06c7e495be7bee684af9f5be522da687b6fc871ab4fcdd5865447

See more details on using hashes here.

File details

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

File metadata

  • Download URL: curl_cffi-0.6.4-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.12.3

File hashes

Hashes for curl_cffi-0.6.4-cp38-abi3-win32.whl
Algorithm Hash digest
SHA256 583d06ec082cde9af292c0de9fa653fdb8fa58ef062205c8da808ce8e18c162d
MD5 08e8d76a771fea28c2513d25a9f84604
BLAKE2b-256 2965439afd8367571df1912fcf0f8f2e61fc2b91d87f4d549c9e357d3c330929

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.6.4-cp38-abi3-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 59ab786e34447b28ae268ddc9751033530022cf81617d03aae063ccc94c82363
MD5 6b42574329f1733ece873c578e3fed50
BLAKE2b-256 e815795d1c0bf7844fc2ffd680b76b8ab8c2ba6457dbe679a6cb6ff2e959ffa5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.6.4-cp38-abi3-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 06b01552d6b2dae6b3d9af51efaccd7cfbcb2b69b2e6e6aeada05897835fbbe9
MD5 b9f9ea33bdc1a0a87a0419b46f51caa2
BLAKE2b-256 39c3916cdb4d2aaf07e76d050988a49473404dd172513377a5d9c9035c35d5e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.6.4-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8bd49429aebb4dd8b58a2d228591508be1735302088b15484e020bc6bbefee60
MD5 f295b7429f76a3e807eb6ae56690a50a
BLAKE2b-256 d4529622c5c30d53a1e51cbe9c2c4ed96672f715cfed9eea3276f4504475ce3e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.6.4-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 c476d9ed4c8eac1dc7a82f733a4841dd462bfbb74a6131110ae14c7374fef10c
MD5 fc2a398c1c5bd4c99eb34fbacb123c5a
BLAKE2b-256 9cefca2775cdcd26d24320765aa20d452ce3e6101cca098e1821a43085b8cf9b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 461ebf53083c92e30351f22385dbfcdf14391e54d09805e823bc6853f95156d0
MD5 f5b6c714036eeacf93554341d42fc4f2
BLAKE2b-256 1647bb891b141bd9c7449c7e30363fcfe26124098d02a01d46fefa9c2fb2471a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.6.4-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dc4fc8964e79c8063a08f9164fa2c8d4a6e29543abdbce986f34df1818733679
MD5 1ba140eda2201e0bcb87fe3b059f1299
BLAKE2b-256 142cfa003fba282efebf1bb9db0c72a84e09d7b70f860959a8170011689589c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for curl_cffi-0.6.4-cp38-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a655afb540f018ab6e6ef5e1079df856562be53211764216b8e523a9dd7b69f4
MD5 2916a874d24f5c239b2dbe2e41939dca
BLAKE2b-256 2ad3f2f341359678f973afa03199cfc89cc08e97014349de0a6cbc39fb2e7172

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