7 Zugriff auf Web-Ressourcen

7.1 Einführung in Web-Ressourcen

Web-Ressourcen bilden die Basis für viele Webanwendungen und -dienste. Eine Web-Ressource ist eine identifizierbare Entität, auf die über eine URL (Uniform Resource Locator) zugegriffen werden kann.

Die Kommunikation mit Web-Ressourcen erfolgt in der Regel über das HTTP-Protokoll, das ein standardisiertes Protokoll für die Übertragung von Daten über das Web ist. HTTP ist zustandslos, d.h. jeder Request wird unabhängig von anderen Requests behandelt und es gibt keine Speicherung von Zuständen auf Serverseite. Um dennoch komplexe Anwendungen zu realisieren, werden REST-APIs (Representational State Transfer) eingesetzt, die einen einheitlichen und standardisierten Zugriff auf Web-Ressourcen ermöglichen.

REST-APIs stellen Ressourcen über URLs bereit und verwenden die HTTP-Methoden GET, POST, PUT und DELETE, um auf die Ressourcen zuzugreifen. Dabei entspricht die HTTP-Methode GET dem Lesen einer Ressource, POST dem Erstellen einer Ressource, PUT dem Aktualisieren einer Ressource und DELETE dem Löschen einer Ressource.

REST-APIs sind flexibel und skalierbar und werden in vielen Anwendungen eingesetzt, z.B. in sozialen Netzwerken, E-Commerce-Plattformen, Cloud-Services und mobilen Anwendungen.

Ein Beispiel für die Verwendung von Web-Ressourcen könnte sein, eine einfache Anwendung zu erstellen, die Daten von einer öffentlich zugänglichen REST-API abruft und darstellt. Hier ist ein Beispiel:

import requests

url = "https://jsonplaceholder.typicode.com/users"

response = requests.get(url)

if response.status_code == 200:
    users = response.json()
    for user in users:
        print(f"Name: {user['name']}, Email: {user['email']}")
else:
    print("Fehler beim Abrufen der Daten.")

Dieses Beispiel ruft die Daten von einer öffentlich zugänglichen REST-API ab und gibt den Namen und die E-Mail-Adresse jedes Benutzers aus. Es verwendet das requests-Modul, um die HTTP-Anfrage zu senden und die Antwort zu erhalten. Das Ergebnis wird als JSON-Objekt zurückgegeben und in eine Python-Liste umgewandelt. Schließlich wird jedes Benutzerobjekt durchlaufen und die gewünschten Informationen ausgegeben.

7.2 Das urllib-Modul

Das urllib-Modul ist ein Python-Modul, das nützliche Funktionen und Klassen für die Arbeit mit URLs (Uniform Resource Locators) und HTTP-Verbindungen bereitstellt. Es besteht aus den folgenden Untermodulen:

Ein Beispiel für die Verwendung von urllib.request:

import urllib.request

url = 'https://www.example.com'
response = urllib.request.urlopen(url)
html = response.read()

print(html)

In diesem Beispiel wird die urlopen()-Funktion aus urllib.request verwendet, um die HTML-Inhalte von www.example.com abzurufen. Die read()-Methode wird verwendet, um die Antwort als Bytes zu lesen, die in der Variablen html gespeichert werden.

Ein Beispiel für die Verwendung von urllib.parse:

from urllib.parse import urlparse, parse_qs

url = 'https://www.example.com/search?q=python+tutorial#top'
parsed_url = urlparse(url)
query_params = parse_qs(parsed_url.query)

print(parsed_url.scheme)  # 'https'
print(parsed_url.netloc)  # 'www.example.com'
print(parsed_url.path)  # '/search'
print(query_params['q'])  # ['python tutorial']
print(parsed_url.fragment)  # 'top'

In diesem Beispiel wird die urlparse()-Funktion aus urllib.parse verwendet, um die verschiedenen Teile der URL zu zerlegen. Die parse_qs()-Funktion wird verwendet, um die Query-Parameter in ein Python-Dictionary zu parsen.

7.3 Das requests-Modul

Das requests-Modul ist eine weit verbreitete Drittanbieter-Bibliothek für Python, die eine einfachere und benutzerfreundlichere Möglichkeit bietet, HTTP-Anfragen durchzuführen und HTTP-Antworten zu verarbeiten. Im Vergleich zum urllib-Modul ist es häufig einfacher und schneller zu verwenden.

Um requests zu verwenden, muss es zunächst installiert werden. Dies kann mit dem Paketmanager pip erfolgen:

pip install requests

Nach der Installation kann das Modul importiert werden:

pythonCopy code

import requests

Eine einfache GET-Anfrage kann mit dem get()-Methodenaufruf durchgeführt werden:

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

Die Antwort kann dann untersucht werden, z.B. kann man den Status-Code überprüfen:

if response.status_code == 200:     
    print('Die Anfrage war erfolgreich!')

Der Inhalt der Antwort kann über das Attribut text abgerufen werden:

print(response.text)

Um eine POST-Anfrage mit Daten zu senden, können die Daten in einem Dictionary gespeichert werden:

data = {'username': 'max_mustermann', 'password': 'geheim'} response = requests.post('https://www.example.com/login', data=data)

Das requests-Modul unterstützt auch andere HTTP-Methoden wie PUT und DELETE und bietet viele weitere Funktionen und Konfigurationsoptionen. Es ist eine großartige Option für die Arbeit mit Web-Ressourcen in Python.

7.4 JSON-Daten verarbeiten

JSON (JavaScript Object Notation) ist ein Datenformat, das für den Austausch von strukturierten Daten zwischen verschiedenen Plattformen und Sprachen verwendet wird. Es ist leichtgewichtig und einfach zu lesen und zu schreiben.

In Python kann das json-Modul verwendet werden, um JSON-Daten zu laden oder zu speichern. Die Methode json.loads() kann verwendet werden, um eine JSON-Zeichenkette in ein Python-Objekt zu laden, während json.dumps() verwendet wird, um ein Python-Objekt in eine JSON-Zeichenkette zu kodieren.

Ein Beispiel für das Laden von JSON-Daten:

import json

json_data = '{"name": "John", "age": 30, "city": "New York"}'
data = json.loads(json_data)

print(data["name"])
print(data["age"])
print(data["city"])

Ausgabe:

John
30
New York

Ein Beispiel für das Speichern von JSON-Daten:

import json

data = {"name": "John", "age": 30, "city": "New York"}
json_data = json.dumps(data)

print(json_data)

Ausgabe:

{"name": "John", "age": 30, "city": "New York"}

In ähnlicher Weise kann das json-Modul auch verwendet werden, um JSON-Daten aus einer Datei zu laden oder in eine Datei zu schreiben.

7.5 XML-Daten verarbeiten

Das xml.etree.ElementTree-Modul ist ein integriertes Modul in Python, das zur Verarbeitung von XML-Daten verwendet wird. Es ermöglicht das Laden von XML-Daten in ein Baumstruktur-Objekt und das Navigieren durch den Baum, um Daten zu lesen oder zu ändern.

Um XML-Daten zu verarbeiten, müssen Sie zuerst die xml.etree.ElementTree-Bibliothek importieren:

import xml.etree.ElementTree as ET

7.5.1 XML-Daten laden

XML-Daten können mit der ET.parse()-Methode in ein ElementTree-Objekt geladen werden:

tree = ET.parse('file.xml')
root = tree.getroot()

Hier wird die parse()-Methode verwendet, um die XML-Datei file.xml zu laden. Die getroot()-Methode wird dann verwendet, um das Wurzelelement des Baums zu erhalten.

Alternativ können Sie XML-Daten auch direkt aus einer Zeichenfolge oder von einer URL laden:

# XML-Daten aus einer Zeichenfolge laden
xml_string = "<root><child>data</child></root>"
root = ET.fromstring(xml_string)

# XML-Daten von einer URL laden
import urllib.request
response = urllib.request.urlopen('http://example.com/data.xml')
tree = ET.parse(response)
root = tree.getroot()

7.5.2 XML-Daten lesen

Das Element-Objekt in ElementTree enthält Informationen über ein XML-Element, einschließlich seines Namens, seiner Attribute und seines Inhalts. Sie können auf Elemente und deren Attribute zugreifen, indem Sie den Elementbaum durchlaufen und die Element-Objekte navigieren.

# Zugriff auf das erste Kind des Wurzelelements
first_child = root[0]

# Zugriff auf das Attribut "id" des Elements
element_id = first_child.attrib['id']

# Zugriff auf den Textinhalt des Elements
element_text = first_child.text

Sie können auch das find()- oder findall()-Element verwenden, um Elemente anhand ihres Namens oder Pfads zu finden:

# Finden eines Elements mit dem Namen "child"
child_element = root.find('child')

# Finden aller Elemente mit dem Namen "child"
child_elements = root.findall('child')

# Finden aller Elemente mit dem Pfad "parent/child"
parent_child_elements = root.findall('parent/child')

7.5.3 XML-Daten schreiben

Das Element-Objekt kann auch verwendet werden, um XML-Daten zu erstellen und zu schreiben:

# Erstellen eines neuen Elements
new_element = ET.Element('new_element')

# Hinzufügen eines Attributs zum Element
new_element.set('attribute_name', 'attribute_value')

# Hinzufügen von Textinhalt zum Element
new_element.text = 'element_text'

# Hinzufügen des Elements zum Baum
root.append(new_element)

# Schreiben des XML-Baums in eine Datei
tree.write('new_file.xml')

Dieses Beispiel erstellt ein neues Element, fügt ein Attribut und einen Textinhalt hinzu und fügt das Element dem Baum hinzu. Schließlich wird der Baum in eine neue XML-Datei geschrieben.

Das xml.etree.ElementTree-Modul bietet viele weitere Methoden und Funktionen zur Verarbeitung von XML-Daten, einschließlich der Unterstützung von

7.6 Web-Scraping mit BeautifulSoup

Web-Scraping bezieht sich auf den Prozess des Extrahierens von Daten von Websites. Es kann nützlich sein, um Informationen zu sammeln, die nicht leicht verfügbar sind oder um große Mengen von Daten automatisch zu sammeln. Eine Python-Bibliothek, die oft für Web-Scraping verwendet wird, ist BeautifulSoup.

Um BeautifulSoup zu verwenden, müssen Sie es zuerst installieren. Sie können dies tun, indem Sie das folgende Kommando in Ihrer Befehlszeile ausführen:

pip install beautifulsoup4

Sobald Sie BeautifulSoup installiert haben, können Sie es in Ihrem Python-Skript importieren. Zum Beispiel:

from bs4 import BeautifulSoup
import requests

Um eine Website zu scrapen, benötigen Sie die URL und müssen eine HTTP-Anfrage senden, um die Seite abzurufen. Sie können die requests-Bibliothek verwenden, um eine HTTP-Anfrage zu senden:

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

Als nächstes können Sie den HTML-Inhalt der Seite abrufen und ihn an BeautifulSoup übergeben:

html_content = response.content
soup = BeautifulSoup(html_content, 'html.parser')

Jetzt können Sie auf die HTML-Elemente der Seite zugreifen. Zum Beispiel, um den Titel der Seite zu erhalten:

title = soup.title.string
print(title)

Oder um alle Links auf der Seite zu erhalten:

links = soup.find_all('a')
for link in links:
    print(link.get('href'))

Es ist jedoch wichtig zu beachten, dass das Scrapen von Websites ethische und rechtliche Überlegungen erfordert. Stellen Sie sicher, dass Sie nur öffentlich verfügbare Informationen sammeln und respektieren Sie die Best Practices der Website.