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 requestsMaking 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 URLPOST 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