Skip to content

pycurl

1,147 10 6 LGPL-2.1
7.45.7 (24 Sep 2025) Feb 25 2003 5.2 million (month)

PycURL is a Python interface to libcurl, a multi-protocol file transfer library written in C. PycURL allows developers to use a variety of network protocols in their Python programs, including HTTP, FTP, SMTP, POP3, and many more.

PycURL is often used in web scraping, data analysis, and automation tasks, as it allows developers to send and receive data over the internet. It can be used to perform various types of requests, such as GET, POST, PUT, and DELETE, and can also handle file uploads and downloads, cookies, and redirects.

One of the key features of PycURL is its support for SSL and proxy servers, which allows developers to securely transfer data over the internet and work around any network restrictions. PycURL also supports a wide range of authentication methods, such as Basic, Digest, and NTLM, and allows developers to easily set custom headers and query parameters.

Just like cURL itself, PycURL is also highly configurable and allows for fine-grained control over various aspects of the transfer, such as timeouts, retries, buffer sizes, and verbosity levels. Additionally, PycURL also provides easy access to the underlying libcurl library, which allows developers to access advanced functionality that is not exposed by the PycURL API.

It's important to note that PycURL is a wrapper around the libcurl library and therefore provides the same functionality and performance as libcurl.

Main strengths of PycURL is that it uses cURL which is one of the most feature rich low-level http clients. The downside is that it's a very low-level client (see the examples below) with complex API making use in web scraping very difficult and niche.

Highlights


uses-curlhttp2multi-partresponse-streaminghttp-proxy

Example Use


```python import pycurl from io import BytesIO

buf = BytesIO() headers = BytesIO()

c = pycurl.Curl() c.setopt(c.HTTP_VERSION, c.CURL_HTTP_VERSION_2_0) # set to use http2

set proxy

c.setopt(c.PROXY, 'http://proxy.example.com:8080') c.setopt(c.PROXYUSERNAME, 'username') c.setopt(c.PROXYPASSWORD, 'password')

make a request

c.setopt(c.URL, 'https://httpbin.org/get') c.setopt(c.WRITEFUNCTION, buf.write) # where to save response body c.setopt(c.HEADERFUNCTION, headers.write) # where to save response headers

to make post request enable POST option:

c.setopt(c.POST, 1)

c.setopt(c.POSTFIELDS, 'key1=value1&key2=value2')

c.perform() # send request

read response

data = buf.getvalue().decode() headers = headers.getvalue().decode() # headers as a string headers = dict([h.split(': ') for h in headers.splitlines() if ': ' in h]) # headers as a dict c.close()

multiple concurrent requests can be made using CurlMulti object:

Create a CurlMulti object

multi = pycurl.CurlMulti()

Set the number of maximum connections

multi.setopt(pycurl.MAXCONNECTS, 5)

Create a list to store the Curl objects

curls = []

Add the first request

c1 = pycurl.Curl() c1.setopt(c1.URL, 'https://httpbin.org/get') c1.setopt(c1.WRITEFUNCTION, BytesIO().write) multi.add_handle(c1) curls.append(c1)

Add the second request

c2 = pycurl.Curl() c2.setopt(c2.URL, 'https://httpbin.org/') c2.setopt(c2.WRITEFUNCTION, BytesIO().write) multi.add_handle(c2) curls.append(c2)

Start the requests

while True: ret, _ = multi.perform() if ret != pycurl.E_CALL_MULTI_PERFORM: break

Close the connections

for c in curls: multi.remove_handle(c) c.close() ```

Alternatives / Similar


53,883 2.33.1 (2026-03-30 16:09:13 ago) Feb 14 2011 compare
15,183 0.28.1 (2024-12-06 15:37:21 ago) Jul 26 2019 compare
16,395 3.13.5 (2026-03-31 21:56:30 ago) Jul 26 2019 compare
5,944 v0.6.1 (2024-03-02 18:08:29 ago) Feb 23 2022 compare
primp new
504 1.2.2 (2026-04-03 07:11:15 ago) Jun 01 2024 compare
1,751 0.7.1 (2024-07-13 09:07:25 ago) Feb 23 2022 compare
605 25.5.0 (2025-06-03 03:42:30 ago) Dec 28 2012 compare
1,001 0.9.2 (2024-12-01 02:55:27 ago) Feb 23 2022 compare

Other Languages

8,860 3.3.2 (2023-11-30 14:10:12 ago) Dec 28 2012 compare
108,987 1.15.0 (2026-04-08 16:09:38 ago) Aug 29 2014 compare
got
14,897 15.0.1 (2026-04-08 16:15:35 ago) Mar 27 2014 compare
1,631 3.5.0 (2026-03-12 22:24:55 ago) Dec 11 2011 compare
16,610 10.1.1 (2024-10-22 17:26:05 ago) Aug 22 2011 compare
5,927 2.14.1 (2026-02-07 15:17:15 ago) Dec 19 2009 compare
1,172 1.4.2 (2026-03-20 19:18:25 ago) Oct 31 2009 compare
707 2.9.0 (2025-02-22 01:13:49 ago) Jul 25 2009 compare
5,889 0.24.2 (2026-01-14 22:54:36 ago) Jul 25 2009 compare
4,131 1.6.0 (2026-03-10 12:58:26 ago) Oct 06 2009 compare
985 1.4.8 (2023-08-15 11:00:00 ago) May 06 2012 compare
23,447 7.10.0 (2025-08-23 22:36:01 ago) Nov 14 2011 compare
1,517 1.0.5 (2024-02-12 21:10:00 ago) Nov 22 2014 compare
378 18.1.0 (2025-07-24 23:01:15 ago) Aug 06 2011 compare
1,219 1.1.7 (2020-08-31 21:38:00 ago) Oct 25 2009 compare
2,033 v8.0.8 (2026-03-30 15:14:47 ago) Apr 28 2019 compare
mechanize new
4,440 2.14.0 (2025-01-05 18:30:46 ago) Jul 25 2009 compare
908 1.1.3 (2026-03-05 00:04:35 ago) Sep 25 2013 compare
req
4,781 v3.57.0 (2025-12-16 09:07:40 ago) Nov 20 2023 compare
11,632 v2.17.2 (2026-02-14 22:43:18 ago) Aug 05 2024 compare
505 1.1.4 (2020-02-07 22:04:51 ago) Apr 20 2010 compare
107 1.6.0 (2024-07-19 19:50:00 ago) Nov 09 2016 compare
3,577 v2.0.17 (2025-12-12 17:47:19 ago) Oct 06 2013 compare
1,924 1.3.0 (2024-09-23 13:16:34 ago) Nov 11 2011 compare
1,803 1.0.0 (2024-05-01 11:33:16 ago) Apr 14 2012 compare
165 2.3.0 (2021-03-18 00:10:00 ago) Dec 22 2019 compare
3,104 0.17.0 (2026-03-25 01:20:02 ago) Mar 20 2015 compare
Was this page helpful?