Skip to content


Apache 2.0 271 30 51,138
408.5 million (month) Feb 14 2011 2.31.0(10 months ago)
583 13 58 MIT/X
23.11.0(5 months ago) Dec 28 2012 103.4 thousand (month)

The requests package is a popular library for making HTTP requests in Python. It provides a simple, easy-to-use API for sending HTTP/1.1 requests, and it abstracts away many of the low-level details of working with HTTP. One of the key features of requests is its simple API. You can send a GET request with a single line of code:

import requests
response = requests.get('')
requests makes it easy to send data along with your requests, including JSON data and files. It also automatically handles redirects and cookies, and it can handle both basic and digest authentication. Additionally, it's also providing powerful functionality for handling exceptions, managing timeouts and session, also handling a wide range of well-known content-encoding types. One thing to keep in mind is that requests is a synchronous library, which means that your program will block (stop execution) while waiting for a response. In some situations, this may not be desirable, and you may want to use an asynchronous library like httpx or aiohttp. You can install requests package via pip package manager:
pip install requests
requests is a very popular library and has a large and active community, which means that there are many third-party libraries that build on top of it, and it has a wide range of usage.

treq is a Python library for making HTTP requests that provides a simple, convenient API for interacting with web services. It is inspired byt the popular requests library, but powered by Twisted asynchronous engine which allows promise based concurrency.

treq provides a simple, high-level API for making HTTP requests, including methods for GET, POST, PUT, DELETE, etc. It also allows for easy handling of JSON data, automatic decompression of gzipped responses, and connection pooling.

treq is a lightweight library and it's easy to use, it's a good choice for small to medium-sized projects where ease of use is more important than performance.

In web scraping treq isn't commonly used as it doesn't support HTTP2 but it's the only Twisted based HTTP client. treq is also based on callback/errback promises (like Scrapy) which can be easier to understand and maintain compared to asyncio's corountines.



Example Use

import requests

# get request:
response = requests.get("")

# requests can automatically convert json responses to Python dictionaries:
response = requests.get("")
{'slideshow': {'author': 'Yours Truly', 'date': 'date of publication', 'slides': [{'title': 'Wake up to WonderWidgets!', 'type': 'all'}, {'items': ['Why <em>WonderWidgets</em> are great', 'Who <em>buys</em> WonderWidgets'], 'title': 'Overview', 'type': 'all'}], 'title': 'Sample Slide Show'}}

# for POST request it can ingest Python's dictionaries as JSON:
response ="", json={"query": "hello world"})
# or form data:
response ="", data={"query": "hello world"})

# Session object can be used to automatically keep track of cookies and set defaults:
from requests import Session
s = Session()
s.headers = {"User-Agent": ""}
{'cookies': {'foo': 'bar'}}
from twisted.internet import reactor
from twisted.internet.task import react
from twisted.internet.defer import ensureDeferred
import treq

# treq can be used with twisted's reactor with callbacks
response_deferred = treq.get(
# or POST
response_deferred =
    json={"key": "value"},  # JSON
    data={"key": "value"},  # Form Data

# add callback or errback
def handle_response(response):
    response.text().addCallback(lambda body: print(body))
def handle_error(failure):
# this callback will be called when request completes:
# this errback will be called if request fails
# this will be called if request completes or fails:
response_deferred.addBoth(lambda _: reactor.stop())  # close twisted once finished

if __name__ == '__main__':

#Note that treq can also be used with async/await:
async def main():
    # content reads response data and get sends a get request:
    print(await treq.content(await treq.get("")))

if __name__ == '__main__':
    react(lambda reactor: ensureDeferred(main()))

Alternatives / Similar