Skip to content

requests Basic Operations

requests is the most popular HTTP client library in Python, with a clean and intuitive API. This article covers basic GET/POST requests, response handling, and commonly used parameters.

Installation

pip install requests

Making Requests

import requests

# GET request
response = requests.get("https://httpbin.org/get")

# POST request
response = requests.post("https://httpbin.org/post", data={"key": "value"})

# Other HTTP methods
requests.put("https://api.example.com/items/1", json={"name": "new"})
requests.delete("https://api.example.com/items/1")
requests.patch("https://api.example.com/items/1", json={"name": "patch"})
requests.head("https://example.com")

The Response Object

import requests

resp = requests.get("https://httpbin.org/get")

print(resp.status_code)          # 200
print(resp.ok)                   # True (status code < 400)
print(resp.headers)              # Response headers dict
print(resp.headers["Content-Type"])

# Response body
print(resp.text)                 # Text (auto-decoded)
print(resp.encoding)             # Current decoding charset
print(resp.content)              # Raw bytes (for images/files)
print(resp.json())               # Parse JSON -> Python dict

# Manually specify encoding (to fix garbled text)
resp.encoding = "utf-8"
print(resp.text)

URL Parameters (params)

import requests

params = {
    "q": "Python requests",
    "page": 1,
    "size": 20,
}

# Equivalent to GET /search?q=Python+requests&page=1&size=20
resp = requests.get("https://httpbin.org/get", params=params)
print(resp.url)   # View the full URL

POST Request Parameters

import requests

# Form submission (Content-Type: application/x-www-form-urlencoded)
resp = requests.post(
    "https://httpbin.org/post",
    data={"username": "alice", "password": "secret"},
)

# JSON submission (Content-Type: application/json, recommended for REST APIs)
resp = requests.post(
    "https://httpbin.org/post",
    json={"user": "alice", "age": 25},
)

# File upload (multipart/form-data)
with open("avatar.png", "rb") as f:
    resp = requests.post(
        "https://httpbin.org/post",
        files={"file": ("avatar.png", f, "image/png")},
    )

Request Headers

The most critical difference between a browser visit and a crawler is the User-Agent:

import requests

headers = {
    "User-Agent": (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
        "AppleWebKit/537.36 (KHTML, like Gecko) "
        "Chrome/124.0.0.0 Safari/537.36"
    ),
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Referer": "https://www.google.com",
}

resp = requests.get("https://httpbin.org/headers", headers=headers)
print(resp.json())

Timeouts and Exception Handling

import requests
from requests.exceptions import (
    Timeout,
    ConnectionError,
    HTTPError,
    RequestException,
)

try:
    resp = requests.get(
        "https://httpbin.org/delay/5",
        timeout=(3, 10),   # (connect timeout, read timeout) in seconds
    )
    resp.raise_for_status()  # Automatically raise HTTPError for 4xx/5xx
    print(resp.json())

except Timeout:
    print("Request timed out")
except ConnectionError:
    print("Network connection failed")
except HTTPError as e:
    print(f"HTTP error: {e.response.status_code}")
except RequestException as e:
    print(f"Request failed: {e}")

Proxies

import requests

proxies = {
    "http":  "http://127.0.0.1:7890",
    "https": "http://127.0.0.1:7890",
}

resp = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
print(resp.json())

Cookies

import requests

# Method 1: dictionary
resp = requests.get(
    "https://httpbin.org/cookies",
    cookies={"session": "abc123"},
)

# Method 2: Session manages cookies automatically (recommended for simulated login)
session = requests.Session()
session.get("https://example.com/login")   # Server sets a cookie
session.get("https://example.com/profile") # Cookie is sent automatically

# Inspect the session's current cookies
print(dict(session.cookies))

Session — Reusing Connections

import requests

# Session reuses TCP connections, improving performance for bulk requests,
# and automatically persists cookies
with requests.Session() as s:
    s.headers.update({
        "User-Agent": "Mozilla/5.0",
        "Authorization": "Bearer my-token",
    })

    for url in urls:
        resp = s.get(url, timeout=10)
        print(resp.status_code)

SSL Verification

import requests

# Disable SSL verification (only for internal/self-signed certs; not recommended in production)
resp = requests.get("https://self-signed.example.com", verify=False)

# Specify a CA certificate
resp = requests.get("https://example.com", verify="/path/to/ca.crt")

Downloading Files

import requests
from pathlib import Path

def download_file(url: str, dest: Path) -> None:
    """Stream-download a file to avoid loading the entire file into memory."""
    with requests.get(url, stream=True, timeout=30) as resp:
        resp.raise_for_status()
        with dest.open("wb") as f:
            for chunk in resp.iter_content(chunk_size=8192):
                f.write(chunk)

download_file("https://example.com/large-file.zip", Path("file.zip"))
Last updated on