Skip to main content

Ultra fast python binding for curl-impersonate via cython

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.
library requests aiohttp httpx pycurl curl_cffi
http2
sync
async
fingerprints
speed 🐇 🐇🐇 🐇 🐇🐇 🐇🐇

Install

pip install curl_cffi --upgrade

This should work on Linux(x86_64/aarch64), macOS(Intel/Apple Silicon) and Windows(amd64). 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 --pre

Usage

requests-like

from cycurl 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 curl-impersonate:

  • chrome99
  • chrome100
  • chrome101
  • chrome104
  • chrome107
  • chrome110
  • chrome99_android
  • edge99
  • edge101
  • safari15_3
  • safari15_5

asyncio

from cycurl.requests import AsyncSession

async with AsyncSession() as s:
    r = await s.get("https://example.com")

More concurrency:

import asyncio
from cycurl.requests import AsyncSession

urls = [
    "https://googel.com/",
    "https://facebook.com/",
    "https://twitter.com/",
]

async with AsyncSession() as s:
    tasks = []
    for url in urls:
        task = s.get("https://example.com")
        tasks.append(task)
    results = await asyncio.gather(*tasks)

curl-like

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

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

If you are using scrapy, check out this middleware: tieyongjie/scrapy-fingerprint

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.

Sponsor

Buy Me A Coffee

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cycurl-0.5.10.tar.gz (63.7 MB view hashes)

Uploaded Source

Built Distributions

cycurl-0.5.10-cp312-cp312-win_amd64.whl (2.9 MB view hashes)

Uploaded CPython 3.12 Windows x86-64

cycurl-0.5.10-cp312-cp312-manylinux2014_x86_64.whl (816.1 kB view hashes)

Uploaded CPython 3.12

cycurl-0.5.10-cp312-cp312-macosx_10_9_universal2.whl (954.5 kB view hashes)

Uploaded CPython 3.12 macOS 10.9+ universal2 (ARM64, x86-64)

cycurl-0.5.10-cp311-cp311-win_amd64.whl (2.9 MB view hashes)

Uploaded CPython 3.11 Windows x86-64

cycurl-0.5.10-cp311-cp311-manylinux2014_x86_64.whl (830.7 kB view hashes)

Uploaded CPython 3.11

cycurl-0.5.10-cp311-cp311-macosx_10_9_universal2.whl (953.0 kB view hashes)

Uploaded CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

cycurl-0.5.10-cp310-cp310-win_amd64.whl (2.9 MB view hashes)

Uploaded CPython 3.10 Windows x86-64

cycurl-0.5.10-cp310-cp310-manylinux2014_x86_64.whl (831.2 kB view hashes)

Uploaded CPython 3.10

cycurl-0.5.10-cp310-cp310-macosx_11_0_x86_64.whl (781.2 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ x86-64

cycurl-0.5.10-cp39-cp39-win_amd64.whl (2.9 MB view hashes)

Uploaded CPython 3.9 Windows x86-64

cycurl-0.5.10-cp39-cp39-manylinux2014_x86_64.whl (831.5 kB view hashes)

Uploaded CPython 3.9

cycurl-0.5.10-cp39-cp39-macosx_11_0_x86_64.whl (781.6 kB view hashes)

Uploaded CPython 3.9 macOS 11.0+ x86-64

cycurl-0.5.10-cp38-cp38-win_amd64.whl (2.9 MB view hashes)

Uploaded CPython 3.8 Windows x86-64

cycurl-0.5.10-cp38-cp38-manylinux2014_x86_64.whl (831.5 kB view hashes)

Uploaded CPython 3.8

cycurl-0.5.10-cp38-cp38-macosx_11_0_x86_64.whl (781.2 kB view hashes)

Uploaded CPython 3.8 macOS 11.0+ x86-64

Supported by

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