Bibliothek requests
– jede Ressource online nutzen
Wir können über die Bibliothek requests
einfach Zugriffe auf Onlineinhalte durchführen.
Zuvor muss die Bibliothek über PIP installiert werden:
pip install requests
Als Rückmeldung erhalten wir:
mac:Python-lernen.de axelpratzner$ pip install requests
Collecting requests
Downloading requests-2.23.0-py2.py3-none-any.whl (58 kB)
|████████████████████████████████| 58 kB 471 kB/s
Collecting chardet4,=3.0.2
Downloading chardet-3.0.4-py2.py3-none-any.whl (133 kB)
|████████████████████████████████| 133 kB 1.0 MB/s
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages (from requests) (1.25.8)
Requirement already satisfied: idna<3,>=2.5 in /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages (from requests) (2.9)
Collecting certifi>=2017.4.17
Downloading certifi-2019.11.28-py2.py3-none-any.whl (156 kB)
|████████████████████████████████| 156 kB 1.3 MB/s
Installing collected packages: chardet, certifi, requests
Successfully installed certifi-2019.11.28 chardet-3.0.4 requests-2.23.0
Wollen wir jetzt einen Inhalt herunterladen wie z.B. die Website www.example.com, dann klappt das in einem Dreizeiler:
import requests
r = requests.get('https://www.example.com/')
print(r.text)
Wir erhalten darauf den kompletten HTML-Code der Seite angezeigt:
<!doctype html> <html> <head> <title>Example Domain</title> <meta charset="utf-8" /> …
Das klappt sowohl bei http bei wie auch bei https – also kein Problem mit SSL-Zertifikaten.
Zum Überprüfen des HTTP-Status-Codes gibt es die Anweisung r.status_code
import requests
r = requests.get('https://www.example.com/')
print (r.status_code)
Als Rückmeldung erhalten wir „200“ – also lief gut!
Wollen wir nur die Information, ob es geklappt hat oder nicht: r.ok
Online-Grafikdatei herunterladen
Wollen wir ein Bild von einer Website herunterladen, dann klappt das ebenso einfach. Wir wollen von unserer Python Kurs das GIF-Bild mit der animierten Biene herunterladen. Dazu benötigen wir die URL „https://www.python-lernen.de/bilder/biene-sprite-animiert-01.gif“ (rechte Maustaste auf das Bild und „Bild in neuem Tab öffnen“ gibt uns die URL)
Anstelle des Inhalts als r.text
bekommen wir diesen als r.content
ausgelesen.
import requests
r = requests.get('https://www.python-lernen.de/bilder/biene-sprite-animiert-01.gif')
print(r.content)
Geben wir den Inhalt direkt auf dem Bildschirm aus sehen wir anhand der Anfangszeichen, dass es sich um eine binäre Datei (b') handelt und um das Grafikformat GIF.
b'GIF89a2�w!�
…
Diesen Inhalt können wir nun auch direkt abspeichern:
import requests
r = requests.get('https://www.python-lernen.de/bilder/biene-sprite-animiert-01.gif')
with open('biene.gif', 'wb') as f:
f.write(r.content)
Jetzt befindet sich in unserem Verzeichnis eine Grafikdatei mit dem Namen „biene.gif“. Einfach mal nachsehen ;)
header-Daten auslesen einer Internetseite
Sehr einfach können wir die header-Inforamtionen von einer Online-Quelle erhalten. Wir erhalten diese über r.headers
:
import requests
r = requests.get('https://www.example.com/')
print (r.status_code)
print (r.ok)
print (r.headers)
Wir erhalten diese in Form des Datentyps Dictionary:
{'Content-Encoding': 'gzip', 'Accept-Ranges': 'bytes', 'Age': '9820', 'Cache-Control': 'max-age=604800', 'Content-Type': 'text/html; charset=UTF-8', 'Date': 'Sat, 29 Feb 2020 11:00:04 GMT', 'Etag': '"3147526947"', 'Expires': 'Sat, 07 Mar 2020 11:00:04 GMT', 'Last-Modified': 'Thu, 17 Oct 2019 07:18:26 GMT', 'Server': 'ECS (nyb/1D2F)', 'Vary': 'Accept-Encoding', 'X-Cache': 'HIT', 'Content-Length': '648'}
Parameter übermitteln über get/post
Die Bibliothek unterstützt das einfache übermitteln von Parametern sowohl mit „get“ wie auch „post“. Der Online-Dienst https://httpbin.org/ ermöglicht das einfach Testen der jeweiligen Anfragen:
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("https://httpbin.org/post", data=payload)
print (r.text)
print (r.status_code)
print (r.ok)
Als Rückmeldung erhalten wir:
{
"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "23",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.23.0",
"X-Amzn-Trace-Id": "Root=1-5e5a4638-d6b461203ebe5a0becaf4e4c"
},
"json": null,
"origin": "79.197.98.81",
"url": "http://httpbin.org/post"
}
200
True
Oder das gleiche Spiel mit „get“:
import requests
payload = {'schluessel1': 'wert1', 'schluessel2': 'wert2'}
r = requests.get("http://httpbin.org/get", params=payload)
print (r.text)
Als Rückmeldung erhalten wir:
{
"args": {"schluessel1": "wert1",
"schluessel2": "wert2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.23.0",
"X-Amzn-Trace-Id": "Root=1-5e5a46eb-f349c1c4e9543820b57730d8"
},
"origin": "79.197.98.81",
"url": "http://httpbin.org/get?schluessel1=wert1&schluessel2=wert2"
}
Die Bibliothek erzeugt also die korrekten Parameter und kümmert sich um die korrekte Übergabe.
Anstelle von einer Textrückgabe können wir auch es Form von JSON erhalten. Dazu einfach folgende Zeile ändern:
import requests
payload = {'schluessel1': 'wert1', 'schluessel2': 'wert2'}
r = requests.get("http://httpbin.org/get", params=payload)
r_dict = r.json()
print(r_dict['args'])
Rückgabe:
{'schluessel1': 'wert1', 'schluessel2': 'wert2'}
Auth-Zugang - geschütze Bereiche nutzen
Geschütze Bereiche können auch über requests
genutzt werden (sofern man die Zugangsdaten kennt). Bei der üblichen Nutzung der Auth-Methode über die .htaccess bekommt man normalerweise die Eingabeaufforderung über den Browser.
Diese kann man über requests „übergehen“:
import requests
r = requests.get('http://httpbin.org/basic-auth/a/b', auth=('a', 'b'))
print (r.status_code)
print (r.ok)
print (r.text)
Als Rückmeldung erhalten wir:
200
True
{
"authenticated": true,
"user": "a"
}
Verzögerungen einplanen
Wenn der Zugriff auf die Online-Ressource länger dauert, kann man diese Verzögerung „einplanen“.
Wir geben der Anweisung request.get(url, timeout=5)
einen entsprechenden Wert bei dem Parameter timeout
mit.
Website Hersteller
Weitere Informationen (auch in deutscher Übersetzung) findet sich auf der Programmierer-Websites der Bibliothek requests
unter:
https://requests.readthedocs.io/de/latest/index.html