Skip to main content

Requests Module

Requests Module in Python

The requests module makes it easy to interact with web pages and APIs by streamlining the process of sending requests and handling responses. With requests, you can quickly and easily retrieve data from the web and use it in your Python projects. In this article, we will explore the requests module and its features, and demonstrate how to use it in your Python code.

A few Words about the requests Module

The Requests module in Python is an HTTP library that allows you to send HTTP/1.1 requests using Python. However, if you encounter the error no module named requests when trying to use the requests module in Python, it means that the module is not installed or is not accessible in your environment.

To install the requests module, you can simply run the following command in your terminal:

pip install requests

Once you’ve installed the Requests library, you can use it to send requests to web servers via Python. Below is a simple code example that demonstrates how to use the Requests module to request data from a website:

import requests

response = requests.get('https://www.example.com')
print(response.text)

In this example, we import the Requests module and use the requests.get() method to send a GET request to the website specified in the parameter. The response.text attribute contains the data returned by the website, which we print to the console.

Here's another example showing how to send a POST request with some data:

import requests

data = {'key': 'value'}
response = requests.post('https://www.example.com', data=data)
print(response.text)

In this example, we use the requests.post() method to send a POST request to the website specified in the parameter. We also pass in some data as a dictionary, which will be sent as form data with the request. The response.text attribute contains the data returned by the website, which we print to the console.

Requests with JSON

JSON is a popular data format used for data exchange between systems. In this context, we'll learn how to use Python requests to send and receive JSON data.

To send a POST request with JSON using requests, use the post method and pass the JSON data using the json parameter.

import requests

data = {
    'name': 'John Doe',
    'email': '[email protected]',
    'message': 'Hello world!'
}

response = requests.post('https://example.com/api', json=data)

print(response.status_code)
print(response.json())

To send a GET request with JSON, use the get method and pass the JSON data using the params parameter.

import requests

params = {
    'category': 'books',
    'page': 1
}

response = requests.get('https://example.com/api', params=params)

print(response.status_code)
print(response.json())

To send JSON data as the request body, use the data parameter instead of the params parameter.

import requests
import json

data = {
    'name': 'John Doe',
    'email': '[email protected]',
    'message': 'Hello world!'
}

response = requests.post('https://example.com/api', data=json.dumps(data))

print(response.status_code)
print(response.json())

In summary, requests makes it easy to send and receive JSON data. Use the json or data parameter depending on whether you're sending a POST or GET request. Keep in mind that the server must be able to process the JSON data you send.

How to Set requests Timeout

If you are using Python requests to make HTTP requests, it is essential to set a timeout value to avoid requests that last too long. Setting a timeout value is easy with the requests library. Here are two code examples to set timeout value using the get method.

import requests

response = requests.get("https://www.example.com", timeout=5)

In the above example, we set a timeout value of 5 seconds. Therefore, if the server doesn't respond within 5 seconds, the request will raise a requests.exceptions.Timeout exception.

import requests

try:
    response = requests.get("https://www.example.com", timeout=5)
    response.raise_for_status()
except requests.exceptions.HTTPError as errh:
    print("HTTP Error:", errh)
except requests.exceptions.ConnectionError as errc:
    print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt:
    print("Timeout Error:", errt)
except requests.exceptions.RequestException as err:
    print("Something went wrong:", err)

In the above example, we used a try-except block to handle exceptions. If the request takes more than 5 seconds, it will raise a requests.exceptions.Timeout exception.

By setting the timeout value, we prevent the program from waiting indefinitely, and we can handle errors gracefully.

Requests Attributes

Requests provides several attributes that can be used to customize and access different parts of a request, such as the request body, headers, response, and cookies.

Request Body

To send data in the request body, you can use the data parameter with a dictionary of key-value pairs. Here's an example:

import requests

payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://example.com', data=payload)

Headers

Headers can be added to a request using the headers parameter. This can be useful when sending authorization tokens or custom headers. Here's an example:

import requests

headers = {'Authorization': 'Bearer my_token', 'Custom-Header': 'value'}
response = requests.get('https://example.com', headers=headers)

Response

The response object contains the server's response to the request. It includes attributes such as the response status code, content, and headers. Here's an example:

import requests

response = requests.get('https://example.com')
print(response.status_code)
print(response.content)
print(response.headers)

Cookies

Cookies can be accessed and set using the cookies attribute. This can be useful for maintaining a session or setting persistent data. Here's an example:

import requests

login_data = {'username': 'my_username', 'password': 'my_password'}
response = requests.post('https://example.com/login', data=login_data)

# Get the session cookie
session_cookie = response.cookies['session']

# Use the session cookie for subsequent requests
response2 = requests.get('https://example.com/protected', cookies={'session': session_cookie})

Requests Session

The Python Requests Session is a powerful tool that allows you to maintain persistence of your HTTP requests within a single session object. This means that you can easily reuse the same connection for multiple requests, with each request building upon the previous one.

Using the built-in requests library in Python, the Sessions feature maintains session variables, including cookies. Thus, it allows one to have temporary storage on the client-side. Here is an example code snippet that illustrates the Python Requests Session:

import requests

session = requests.Session()
session.get('http://example.com')

In this code, we create a new Session object and then use the get() method to make a GET request to the given URL. By default, this request will include the relevant headers and cookies that were set in the previous requests made with this session object.

Sessions are useful for emulating a stateful sessions, where HTTP cookies are used to remember the server-side state. Another example would be to speed up requests to the same server by re-using the same TCP connection. This means that the server can send the response immediately and doesn't need to spend time setting up a new TCP connection.

Here is an example of adding a header to the session, which will be present on all subsequent requests:

import requests

session = requests.Session()
session.headers.update({'x-test': 'true'})

session.get('http://httpbin.org/headers')

Within the Session, we set the header x-test to true. Then, any subsequent requests made with this session object to 'http://httpbin.org/headers' will include this header.

In conclusion, Python Requests Session provides a powerful and flexible way to persist connection state across multiple HTTP requests. It is a must-have tool for any developer who works with HTTP request/response data in Python.

How to Download File with Requests

To download a file using the requests module in Python, you can use the get() method. This method allows you to make a request to the specified URL and retrieve the content as a file-like object. You can then write the content to a file on your local machine.

import requests

url = 'https://example.com/image.jpg'
response = requests.get(url)

with open('image.jpg', 'wb') as f:
    f.write(response.content)

In this example, we are downloading an image from the URL https://example.com/image.jpg and saving it to a file named image.jpg. The response.content attribute contains the binary content of the image, which we write to the file using the write() method.

Another example is to download a CSV file and save it to disk:

import requests

url = 'https://example.com/data.csv'
response = requests.get(url)

with open('data.csv', 'wb') as f:
    f.write(response.content)

In this example, we are downloading a CSV file from https://example.com/data.csv and saving it to data.csv. Like before, we write the content to the file using the write() method.

In both examples, we use the requests module to make a GET request to the specified URL, and we retrieve the binary content using the response.content attribute. We then write this binary content to a file on disk using the open() function in combination with a with block.

So, that's how you can download a file with requests in Python.

Using Proxy in Requests

If you want to send HTTP requests in Python through a proxy, you can use the requests library. Here's how to do it:

import requests

url = 'some_url'

proxies = {
  'http': 'http://user:password@proxy:port',
  'https': 'https://user:password@proxy:port'
}

response = requests.get(url, proxies=proxies)

In the above code example, you need to replace user, password, proxy, and port with your actual credentials and proxy address and port number.

By using these proxy settings in your Python HTTP requests, you can easily bypass any restrictions imposed on your network, and access the desired resources without any hassle. Moreover, you can scale your service to be more robust and independent, while securing your network from outside users.

How to Convert curl to Python request

Converting a curl command to Python request is a common task for those working with APIs or web requests.

Here are two examples of converting a curl command to Python request using the requests module:

curl command

curl https://jsonplaceholder.typicode.com/posts/1

Python Request Code

import requests

response = requests.get('https://jsonplaceholder.typicode.com/posts/1')

print(response.json())

More Complex curl Command

curl -X POST \
  https://httpbin.org/post \
  -H 'Content-Type: application/json' \
  -d '{"name": "John Doe", "age": 25}'

Python request Code

import requests

url = 'https://httpbin.org/post'
headers = {'Content-Type': 'application/json'}
data = '{"name": "John Doe", "age": 25}'

response = requests.post(url, headers=headers, data=data)

print(response.json())

In conclusion, converting curl to Python request can be easily done using the requests module. By understanding the correct syntax and structure of the curl command, it is possible to replicate the same request in Python with a few lines of code.

Rest API

Python is a popular language for building RESTful APIs due to its simple syntax and vast library collection. With Python, developers can easily make direct API calls and extract data from popular web services.

Python API Call Example

Below is an example of how to make an API call using Python:

import requests

url = "https://api.example.com/data"
response = requests.get(url)

print(response.json())

In the code snippet above, we import the Python 'requests' module, use the URL of the API endpoint and execute the request using the 'get' method. Finally, we print the retrieved data in JSON format.

How to use RESTful APIs in Python

Python provides a library called Flask which is widely used for building REST APIs. To create a RESTful API using Flask, you need to install Flask and use the routing capabilities to define API endpoints.

How to create an API endpoint using Flask

from flask import Flask

app = Flask(__name__)

@app.route('/api/data')
def get_data():
    data = {"name": "John", "age": 30, "city": "New York"}
    return data

if __name__ == '__main__':
    app.run(port=5000)

In the code above, we define a simple Flask app with an endpoint for retrieving data. The 'get_data' function retrieves a sample data object and returns it as JSON.

In summary, Python is an excellent language for working with RESTful APIs due to its ease of use and a wide range of existing libraries available. By using Python and Flask, developers can quickly build high-performance REST APIs, making it a popular choice for many development projects.

Contribute with us!

Do not hesitate to contribute to Python tutorials on GitHub: create a fork, update content and issue a pull request.

Profile picture for user AliaksandrSumich
Python engineer, expert in third-party web services integration.
Updated: 03/08/2024 - 16:37
Profile picture for user angarsky
Reviewed and approved