Warum Requests?
Python enthält ein eingebautes urllib-Modul für die Arbeit mit HTTP, aber seine Syntax ist schwerfällig und nicht intuitiv. Die Bibliothek requests löst dieses Problem, indem sie eine elegante und intuitive Benutzeroberfläche bietet. Nicht umsonst lautet ihr Slogan „HTTP for Humans“.
Installation
Das Einrichten von Requests ist ganz einfach:
pip install requestsGrundlagen: GET-Anfragen
Beginnen wir mit der häufigsten Art von Anfragen - GET. Stellen wir uns vor, wir müssen GitHub-Benutzerdaten abrufen:
import requests
response = requests.get('https://api.github.com/users/octocat')
# Wir überprüfen den Status der Antwort
print(response.status_code) # 200
# Wir erhalten JSON
data = response.json()
print(data['name']) # The Octocat
print(data['public_repos']) # Anzahl öffentlicher RepositoriesDas Objekt response enthält alle Informationen über die Serverantwort: Statuscode, Header, Antworttext und vieles mehr.

Anfrageparameter
APIs erfordern häufig die Übergabe von Parametern in der URL. Mit der Bibliothek requests können Sie dies elegant tun:
# Suche nach Repositories auf GitHub
params = {
'q': 'python requests',
'sort': 'stars',
'order': 'desc'
}
response = requests.get('https://api.github.com/search/repositories', params=params)
repos = response.json()
for repo in repos['items'][:5]:
print(f"{repo['name']}: {repo['stargazers_count']} stars")Die Bibliothek generiert automatisch die richtige URL mit Parametern und schützt Sonderzeichen.
POST-Anfragen und Senden von Daten
POST-Anfragen werden verwendet, um Ressourcen zu erstellen oder Formulare zu senden. Betrachten wir ein Beispiel mit dem Senden von JSON:
# Erstellen einer neuen Ressource
data = {
'title': 'I'm studying requests',
'body': 'This is a very convenient library!',
'userId': 1
}
response = requests.post('https://jsonplaceholder.typicode.com/posts', json=data)
if response.status_code == 201:
print('Resource created!')
print(response.json())Beachten Sie den Parameter json — requests serialisiert das Wörterbuch automatisch in JSON und setzt den richtigen Content-Type-Header.
Arbeiten mit Überschriften
Viele APIs erfordern eine Authentifizierung über Header. So geht's:
headers = {
'Authorization': 'Bearer YOUR_TOKEN_HERE',
'User-Agent': 'MyApp/1.0'
}
response = requests.get('https://api.example.com/data', headers=headers)Einige APIs verwenden API-Schlüssel:
headers = {'X-API-Key': 'your_api_key'}
response = requests.get('https://api.example.com/protected', headers=headers)
Fehlerbehandlung
Professionelle Arbeit mit der API ist ohne korrekte Fehlerbehandlung nicht möglich:
try:
response = requests.get('https://api.example.com/data', timeout=5)
response.raise_for_status() # Wirft eine Ausnahme für 4xx- und 5xx-Codes aus
data = response.json()
except requests.exceptions.HTTPError as http_err:
print(f'HTTP error: {http_err}')
except requests.exceptions.ConnectionError:
print('Connection error')
except requests.exceptions.Timeout:
print('Timeout')
except requests.exceptions.RequestException as err:
print(f'An error occurred: {err}')Die Methode raise_for_status() löst automatisch eine Ausnahme aus, wenn der Server einen Fehlercode zurückgibt.
Sitzungen für mehrere Anfragen
Wenn Sie mehrere Anfragen an eine API stellen müssen, verwenden Sie Sitzungen. Sie speichern Cookies und die Verbindung, was die Arbeit erheblich beschleunigt:
session = requests.Session()
session.headers.update({'Authorization': 'Bearer TOKEN'})
# Alle Anfragen innerhalb der Sitzung verwenden gemeinsame Kopfzeilen
response1 = session.get('https://api.example.com/users')
response2 = session.get('https://api.example.com/posts')
response3 = session.post('https://api.example.com/comments', json={'text': 'Hello'})
session.close()Noch besser ist es, den Kontextmanager zu verwenden:
with requests.Session() as session:
session.headers.update({'Authorization': 'Bearer TOKEN'})
response = session.get('https://api.example.com/data')Arbeiten mit Dateien
Das Hochladen von Dateien über die API ist ebenfalls einfach:
# Datei wird geladen
files = {'file': open('document.pdf', 'rb')}
response = requests.post('https://api.example.com/upload', files=files)
# Datei wird heruntergeladen
response = requests.get('https://example.com/image.jpg', stream=True)
with open('image.jpg', 'wb') as file:
for chunk in response.iter_content(chunk_size=8192):
file.write(chunk)Mit dem Parameter stream=True können Sie große Dateien in Portionen laden, ohne sie vollständig in den Speicher zu laden.
Praktisches Beispiel: Arbeiten mit der Wetter-API
Erstellen wir eine vollständige Wetter-App:
import requests
def get_weather(city, api_key):
"""Gets the current weather for the specified city"""
base_url = "http://api.openweathermap.org/data/2.5/weather"
params = {
'q': city,
'appid': api_key,
'units': 'metric',
'lang': 'ru'
}
try:
response = requests.get(base_url, params=params, timeout=10)
response.raise_for_status()
data = response.json()
weather_info = {
'city': data['name'],
'temperature': data['main']['temp'],
'feels': data['main']['feels_like'],
'description': data['weather'][0]['description'],
'Humidity': data['main']['humidity'],
'Wind': data['wind']['speed']
}
return weather_info
except requests.exceptions.RequestException as e:
print(f"Error retrieving data: {e}")
return None
# Anwendung
weather = get_weather('Moscow', 'YOUR_API_KEY')
if weather:
print(f"Weather in the city {weather['city']}:"
print(f"Temperature: {weather['temperature']}°C")
print(f"Feels like: {weather['ощущается']}°C" print(f"Description: {weather['description']}"]}")Erweiterte Möglichkeiten
Retry-Mechanismus mit Hilfe von Adaptern:
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
session = requests.Session()
retry = Retry(
total=3,
backoff_factor=1,
status_forcelist=[500, 502, 503, 504]
)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
response = session.get('https://api.example.com/data')Arbeit mit Authentifizierung:
# Basic Auth
response = requests.get('https://api.example.com/data',
auth=('username', 'password'))
# OAuth 2.0 normalerweise über Header
headers = {'Authorization': f'Bearer {access_token}'}
response = requests.get('https://api.example.com/data', headers=headers)Befund
Die Bibliothek requests macht die Arbeit mit der Python-API zum Vergnügen. Einfache und intuitive Syntax, leistungsstarke Funktionen und hervorragende Dokumentation machen sie zum De-facto-Standard für HTTP-Anfragen in Python. Nachdem Sie sich mit Requests vertraut gemacht haben, können Sie Tausende verschiedener Dienste in Ihre Projekte integrieren und wirklich leistungsstarke Anwendungen erstellen.
Anlage Kodik bietet strukturierte Kurse in Python, JavaScript, API und mehr. Interaktive Lektionen, praktische Aufgaben und schrittweise Lernprogramme helfen Ihnen, Entwickler zu werden.
Schließen Sie sich unserem Telegram-Kanal, wo Sie Unterstützung von erfahrenen Entwicklern, nützliche Materialien und Antworten auf alle Fragen zum Programmieren finden. Lernen Sie in einem komfortablen Tempo mit einer Gemeinschaft von Gleichgesinnten!
