https://d226lax1qjow5r.cloudfront.net/blog/blogposts/build-a-python-html-parser-for-web-scraping-with-beautiful-soup/python-html_soup_1200x600.png

Erstellen eines Python-HTML-Parsers für Web-Scraping

Zuletzt aktualisiert am September 8, 2021

Lesedauer: 9 Minuten

Das Internet enthält die umfangreichste Datensammlung der Menschheitsgeschichte.

All diese Daten stehen Ihnen zur Verfügung, wenn Sie lernen, wie man einen Web Scraper baut. Ein Web Scraper ist eine Software, die Daten von Webseiten sammelt. Es ist ein leistungsstarkes Werkzeug, mit dem Sie Ihre Programme mit Daten versorgen können.

So können Sie beispielsweise Daten von einer Website für Liedtexte abrufen und daraus eine Wortwolke mit den 10 beliebtesten Liedern des Tages erstellen. Oder Sie könnten Schlagzeilen analysieren und deren Stimmung für den Aktienhandel nutzen.

In diesem Tutorial lernen Sie, wie Sie mit Python und Beautiful Soup (einer Python-Bibliothek) Daten aus dem Internet auslesen können. Um diesem Tutorial folgen zu können, sollten Sie ein grundlegendes Verständnis der Programmierung in Python haben. Ich gehe nicht davon aus, dass Sie Erfahrung als Webentwickler haben, daher werde ich alle Web-Grundlagen erklären, die Sie benötigen, um mitzuhalten.

Am Ende dieses Tutorials werden Sie einen funktionierenden Web Scraper haben, der Daten von einer Website sammelt. Los geht's!

Wie Web Scraping funktioniert

Wenn Sie eine Website besuchen, sendet Ihr Webbrowser eine HTTP-Anfrage an den Server der Website und bittet um die Ressourcen, die Ihr Browser zur Anzeige der Website benötigt. Der Server antwortet möglicherweise mit Dateien, die HTML, CSS, JavaScript und alles andere enthalten, was Ihr Browser zur Anzeige der Website benötigt. HTML gibt einer Website ihre Struktur, CSS verleiht ihr Stil und JavaScript macht sie interaktiv.

Wenn Sie einen Web Scraper erstellen, schreiben Sie Code, der die HTTP-Anfrage für Sie sendet und die Daten verwendet, um etwas zu erreichen, ohne dass Sie die Website mit Ihrem Webbrowser aufrufen müssen. Also ein Web Scraper:

  1. Stellt eine Anfrage an eine Website.

  2. Ruft den HTML-Code der Website ab.

  3. Durchsucht den HTML-Code nach dem, was er braucht.

  4. Verwendet die Daten, um etwas zu tun.

Web Scraping Probleme

Obwohl Web Scraping in vielen Situationen hilfreich ist, hat es einige Probleme. Ein Problem ist, dass Web Scraper oft kaputt gehen. Web Scraper sind darauf angewiesen, dass der HTML-Code einer Website unverändert bleibt. Wenn also ein Entwickler eine Website aktualisiert, kann das Ihren Scraper beschädigen, und Sie müssen Änderungen vornehmen, um das Problem zu beheben.

Web-Scraping kann auch gegen die Nutzungsbedingungen bestimmter Websites verstoßen. Daher ist es wichtig, die Nutzungsbedingungen einer Website zu lesen, bevor Sie Daten von ihr abrufen.

Auch wenn eine Website das Scrapen von Daten zulässt, kostet das Scrapen von Daten Geld für die Website (weil Sie ihre Ressourcen verbrauchen), daher sollten Sie beim Scrapen von Daten einige Dinge beachten:

  1. Scrapen Sie Daten nicht öfter als nötig.

  2. Zwischenspeichern Sie Daten, wenn Sie können.

Web Scraping VS. APIs

Bevor Sie einen Web Scraper erstellen, sollten Sie prüfen, ob die Datenquelle, von der Sie scrapen wollen, über eine API verfügt. Eine API ist eine Anwendungsprogrammierschnittstelle, die es zwei Programmen ermöglicht, miteinander zu kommunizieren. Bei Vonage haben wir zum Beispiel eine SMS-API, mit der Sie programmgesteuert eine SMS-Nachricht versenden können. Wir haben auch eine Video-API, mit der Sie ganz einfach Video-Streaming zu Ihrer Website hinzufügen können, und eine Reihe von anderen Kommunikations-APIs.

Viele Datenquellen bieten APIs an, über die Sie auf ihre Informationen zugreifen können, ohne einen Web Scraper schreiben zu müssen. Ein Beispiel, IMDB hat eine API die Sie verwenden können, um ihre Filmbewertungen zu erhalten.

Es hat mehrere Vorteile, die API von IMDB zu verwenden, anstatt die Daten selbst von der Website abzurufen.

Erstens müssen Sie sich keine Sorgen machen, dass Sie gegen ihre Nutzungsbedingungen verstoßen. Außerdem ist es viel schneller, Daten von einer API abzurufen, als sie zu scrapen. Schließlich wird die IMDB-API von einem Entwicklerteam verwaltet, so dass Sie sich keine Sorgen machen müssen, dass sie kaputt geht, wie es bei einem Web Scraper der Fall sein könnte.

Was ist HTML?

Bevor wir weitermachen, hier eine kurze Einführung in HTML (wenn Sie bereits mit der Webentwicklung vertraut sind, können Sie diesen Abschnitt überspringen). HTML steht für Hypertext Markup Language und ist eine Auszeichnungssprache, mit der Websites strukturiert werden. Werfen Sie einen Blick auf diese Website:

Example.com

Die Website hat "Beispiel-Domain" oben als Überschrift (d. h. in großer Schrift und fett). Unter "Beispiel-Domain" befindet sich ein Absatz mit Text, gefolgt von einem Link.

Hier ist der HTML-Code für diese Website.

HTML example

Wie Sie sehen können, besteht HTML aus Tags. Die Tags weisen Ihren Webbrowser an, etwas zu tun. In diesem Fall weist das HTML Ihren Webbrowser an, eine Webseite zu erstellen, auf der oben "Beispiel.com" steht.

Innerhalb eines Body-Tags befinden sich ein Textabsatz und ein Link. Wenn Sie sich den HTML-Code ansehen, werden Sie feststellen, dass "Beispiel.com" umgeben ist von <h1> und </h1>. Viele HTML-Tags, wie dieser hier, haben einen öffnenden und einen schließenden Tag. In diesem Fall behandelt Ihr Browser alles, was zwischen den Tags steht, als Überschrift.

Alles, was innerhalb von <p> Tags ist ein Absatz. Schließlich ist ein <a> Tag ein Link. In diesem Fall ist die Codezeile "ahref=https://www.iana.org/domains/example" innerhalb des <a> Tag Ihren Browser an, einen Link zu https://www.iana.org/domains/example zu erstellen.

Der gesamte HTML-Code in diesem Beispiel ist eingebettet in <body>, <div> und, <html> Tags, die Ihrem Browser zusätzliche Informationen liefern.

Um diese Website live zu sehen, gehen Sie bitte auf www.example.com.

Um den HTML-Code zu sehen, drücken Sie Strg+U in Ihrem Browser oder Cmd+Option+U auf einem Mac (Cmd+U, wenn Sie Firefox verwenden).

Was ist Parsing?

In diesem Lernprogramm lernen Sie, wie Sie Daten aus dem Internet auslesen und analysieren können. Was aber bedeutet Parsing? Parsen bedeutet, dass man Text in ein anderes Format umwandelt, aus dem man sinnvolle Informationen extrahieren kann.

In Kürze werden Sie zum Beispiel HTML in Beautiful Soup einspeisen. Wenn Sie das getan haben, können Sie sich die Daten auf verschiedene Weise ansehen. Sie können alle Links auf der Seite, den Text oder die Bilder abrufen.

Beautiful Soup ermöglicht es Ihnen, die Daten zu "verstehen", indem Sie die verschiedenen HTML-Tags sinnvoll einsetzen. Auf diese Weise erhalten Sie schnell alle Informationen, die Sie von einer Website benötigen.

Herunterladen von HTML einer Website

Nun ist es an der Zeit, unseren Web Scraper zu bauen! Zu Beginn werden wir alle Daten von www.example.com.

Als Erstes müssen wir uns das HTML von example.com besorgen.

Sie können den HTML-Code einer Website abrufen, indem Sie eine HTTP-Anfrage senden.

Es gibt verschiedene HTTP-Anfragen, um verschiedene Aufgaben zu erfüllen, aber wir werden eine GET-Anfrage verwenden, um den Server einer Website zu bitten, uns seine Ressourcen zu senden.

Python hat eine eingebaute Bibliothek namens requests mit der Sie leicht eine HTTP-Anfrage senden können. Hier sehen Sie, wie Sie die requests Bibliothek verwenden, um eine GET-Anfrage zu senden und den HTML-Code von example.com zu drucken.

import requests

print(requests.get('https://example.com').content)

>> b'<!doctype html>\n<html>\n<head>\n    <title>Example Domain</title>\n\n...

Wenn Sie diesen Code ausführen, sollten Sie das HTML von example.com sehen.

Parsing von HTML mit Beautiful Soup

Wir können nun die Beautiful Soup-Bibliothek von Python verwenden, um das HTML von example.com zu analysieren. Zu diesem Zweck importieren wir die BeautifulSoup Bibliothek importieren und sie verwenden, um ein BeautifulSoup Objekt wie dieses:

import requests
from bs4 import BeautifulSoup


page = requests.get("https://example.com")
soup = BeautifulSoup(page.content, "html.parser")

Die Klasse BeautifulSoup Klasse akzeptiert den Text, den sie analysiert, als Parameter und eine Zeichenkette, die ihr mitteilt, worum es sich bei dem Text handelt. In diesem Fall stellt der Text HTML dar, also übergeben wir in "html.parser".

Jetzt können Sie Ihr BeautifulSoup Objekts find Methode verwenden, um nach verschiedenen Tags im HTML zu suchen. Die Methode find Methode akzeptiert den Namen eines Tags als Parameter und gibt das erste Tag zurück, das übereinstimmt.

import requests
from bs4 import BeautifulSoup


page = requests.get("https://example.com")
soup = BeautifulSoup(page.content, "html.parser")
print(soup.find('p'))

>> <p>This domain is for use in illustrative examples in documents...

In diesem Fall suchten Sie im HTML nach p Tags gesucht, was für Absatz steht, und BeautifulSoup hat alles in <p> Tags.

HTML example

Der Teil der Website example.com, auf dem "Example Domain" steht, befindet sich in einem <h1> Tag. Um "Example Domain" zu scrapen, können Sie in h1 an find anstelle von p.

print(soup.find("h1"))

>> <h1>Example Domain</h1>

Nun sollte Ihr Code den Titel der Website ausgeben.

Die letzte Information auf example.com ist der Link am Ende, auf dem "Weitere Informationen..." steht. Um diese letzte Information zu erhalten, müssen Sie nach einem a Tag.

print(soup.find("a"))

>> <a href="https://www.iana.org/domains/example">More information...</a>

Wenn Sie nun Ihren Code ausführen, sollte er den Link zurückgeben.

Mehr Daten scrapen

Schauen wir uns an, wie man noch mehr Daten von einer Website abrufen kann.

Wenn Sie Ihren Webbrowser verwenden und mehrere Registerkarten geöffnet haben, enthält jede Registerkarte den Namen der Website.

Webentwickler definieren den Titel einer Website in einem <title> Tag. Sie können den Titel einer Website wie folgt erhalten:

import requests
from bs4 import BeautifulSoup



URL = "https://example.com"
page = requests.get(URL)
soup = BeautifulSoup(page.content, "html.parser")
print (soup.title.get_text())

>> Example Domain

Wenn Sie diesen Code ausführen, sollte Python "Example Domain" ausgeben.

In HTML können Sie einem Tag eine ID oder eine Klasse zuweisen, die es Ihnen ermöglicht, ihn mit CSS zu gestalten.

Sie können nach Tags nach Klasse und ID suchen, wenn Sie eine Website auslesen.

Um dies in Aktion zu sehen, schauen wir uns eine Website an, die Real Python zusammengestellt hat: eine gefälschte Jobbörse. Wenn Sie die Seite besuchen, sehen Sie oben auf der Seite "Fake Python".

Wenn Sie sich den HTML-Code der Website ansehen, werden Sie feststellen, dass dieser HTML-Code "Fake Python" in der Registerkarte Ihres Browsers erzeugt.

<h1 class="title is-1">Fake Python </h1>

Wenn Sie diese Daten auslesen wollen, müssen Sie zunächst eine HTTP-Anfrage senden, um den HTML-Code herunterzuladen. Dann können Sie Beautiful Soup verwenden, um nach einem Tag mit der Klasse "title". So wird es gemacht:

import requests
from bs4 import BeautifulSoup

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)
soup = BeautifulSoup(page.content, "html.parser")
result = soup.find(class_="title")
print(result)

>> <h1 class="title is-1">
        Fake Python
   </h1>

Alles, was Sie tun müssen, ist, den Namen der Klasse an find mit diesem Code übergeben: class_="title".

Bis jetzt haben wir mit soup.find um unser HTML zu durchsuchen, das das erste gefundene Ergebnis zurückgibt. Beautiful Soup hat auch eine Methode soup.find_all die jede Übereinstimmung zurückgibt. Damit können Sie zum Beispiel alle Jobtitel auf der Fake-Python-Website abrufen. So geht's:

import requests
from bs4 import BeautifulSoup

URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)
soup = BeautifulSoup(page.content, "html.parser")
result = soup.find_all(class_="is-5")
for html in result:
    print(html)
    
>> <h2 class="title is-5">Senior Python Developer</h2>
<h2 class="title is-5">Energy engineer</h2>
<h2 class="title is-5">Legal executive</h2>...

Zunächst müssen Sie sich mit Ihrem Browser den HTML-Code von Fake Python ansehen. Sie entdecken, dass alle Jobtitel die Klasse "is-5". Dann müssen Sie nur noch nach jeder HTML-Datei suchen, die diese Klasse enthält, indem Sie find_allzu suchen, die Ergebnisse durchzugehen und sie auszudrucken.

Reguläre Ausdrücke

Wenn Sie Ihr Web-Scraping verfeinern möchten, können Sie reguläre Ausdrücke verwenden. Ein regulärer Ausdruck ist eine Folge von Zeichen, die ein Suchmuster definieren.

Python hat eine eingebaute Bibliothek namens re mit der man sie definieren kann. Sie können zum Beispiel einen regulären Ausdruck definieren, der nach Zahlen in einer Zeichenkette sucht. Hier sehen Sie, wie Sie re verwenden, um nach Zahlen in einer Zeichenkette zu suchen.

import re


print(re.findall('\d+', 'hello 1 hello 2 hello 3'))

>> \[‘1’, ‘2’, ‘3’]

Das Modul re Methode des Moduls findall Methode akzeptiert zwei Parameter: die zu suchende Zeichenkette und einen regulären Ausdruck. Der reguläre Ausdruck in diesem Beispiel lautet '\d+'.

Wie Sie sehen können, liefert dieser reguläre Ausdruck alle Zahlen in der Zeichenfolge 'hello 1 hello 2 hello 3'.

Reguläre Ausdrücke sind flexibel: Sie können reguläre Ausdrücke so schreiben, dass sie auf alles passen, von breiten Mustern bis hin zu spezifischen Mustern. Hier ein Beispiel für einen regulären Ausdruck, der nur mit Zeichenfolgen übereinstimmt, die mit "The" beginnen und mit "brown" enden.

import re


print(re.findall('^The.*brown$', 'The fox is brown'))

>> ['The fox is brown']

Python gibt die Zeichenfolge aus, weil sie mit "The" beginnt und mit "brown" endet.

In diesem Fall lautet der reguläre Ausdruck '^The.*brown$'. Das Caret am Anfang gefolgt von "The" bedeutet, dass "The" am Anfang einer Zeichenkette steht.

Das .* bedeutet, dass alles übereinstimmt. Das nächste ist brown$, was bedeutet, dass die Zeichenfolge mit braun enden muss.

Wenn Sie die Zeichenkette so ändern, dass sie mit "green" endet, findet Python keine Übereinstimmung, da sie nicht dem von Ihnen definierten Muster entspricht:

import re


print(re.findall('^The.*brown$', 'The fox is green'))

>> []

Sie können reguläre Ausdrücke verwenden, wenn Sie Daten von Websites auslesen. So geht's:

import re
import requests
from bs4 import BeautifulSoup


page = requests.get("https://example.com")
soup = BeautifulSoup(page.content, "html.parser")
result = soup.find_all(re.compile("(head|div)"))
print(result)

>> [<head>
<title>Example Domain</title>...

In diesem Code übergeben Sie soup.find_all den regulären Ausdruck "(head|div)". Dieser reguläre Ausdruck passt auf alles, was entweder in einem <head> Tag oder einem <div> Tag. Wenn Sie einen regulären Ausdruck definieren, bedeutet das Pip-Symbol "oder".

Abschließende Überlegungen

Herzlichen Glückwunsch! Sie wissen, wie man eine Website scrapt! Alle öffentlichen Daten aus dem Internet stehen Ihnen jetzt zur Verfügung.

Wie bereits erwähnt, birgt das Web Scraping einige Probleme. Bevor Sie also mit dem Scraping von Daten beginnen, sollten Sie zunächst prüfen, ob die Datenquelle eine API bereitstellt. Wenn dies nicht der Fall ist und die Nutzungsbedingungen dies zulassen, können Sie jetzt alle benötigten Daten abrufen.

Natürlich gibt es beim Web Scraping noch mehr als die Grundlagen, die ich in diesem Tutorial behandelt habe. Wenn Sie mehr über Web Scraping erfahren möchten, können Sie einen kostenlosen Coursera-Kurs besuchen, z. B. Python für den Zugriff auf Webdaten verwenden.

Sie können sich auch die Dokumentation von BeautifulSoup lesen. Sie können hier mehr über reguläre Ausdrücke erfahren.

Zum Schluss möchten Sie vielleicht Scrapy ausprobierenausprobieren, ein beliebtes Python-Framework für Web-Scraping.

Vielen Dank für die Lektüre und viel Erfolg bei Ihrem Web-Scraping!

Teilen Sie:

https://a.storyblok.com/f/270183/400x394/540f26da70/cory-althoff.png
Cory AlthoffEhemaliges Vonage-Team-Mitglied

Cory Althoff ist Anwalt der Entwickler bei Vonage und Autor von zwei Büchern: Der "Self-Taught Programmer" und "The Self-Taught Computer Scientist". Book Authority bezeichnete "The Self-Taught Programmer" als eines der besten Programmierbücher aller Zeiten, und The Next Web listete es als eines der zehn Bücher, die Ihnen helfen werden, ein besserer Softwareentwickler zu werden. Cory lebt mit seiner Frau und seiner Tochter in der Bay Area.