Zurück zum Blog
Anleitungen
Raluca PenciucLast updated on Apr 28, 202615 min read

Web Scraping mit Python: Der ultimative Leitfaden zur Erstellung Ihres Scrapers

Web Scraping mit Python: Der ultimative Leitfaden zur Erstellung Ihres Scrapers

Während wir im 20. Jahrhundert noch von der Devise „Zeit ist Geld“ geleitet wurden, dreht sich heute alles um Daten. Mehr Daten bedeuten mehr Erkenntnisse, also bessere Entscheidungen und mehr Geld.

Web-Scraping und Web-Scraper haben insbesondere im letzten Jahrzehnt enorm an Popularität gewonnen. Immer mehr Unternehmen benötigen eine präzise Marketingstrategie, was die Beschaffung riesiger Informationsmengen in kurzer Zeit erfordert.

Da die Datenextraktion nun im Rampenlicht steht, erkennen Unternehmen zunehmend, wie sie davon profitieren können. Für Entwickler könnte dies eine gute Möglichkeit sein, ihr Geschäft anzukurbeln, oder einfach ein spannendes Projekt, um ihre Programmierkenntnisse zu vertiefen.

Selbst wenn Ihre Arbeit nichts mit Web Scraping zu tun hat, Sie aber ein Python-Teamplayer sind, werden Sie am Ende dieses Artikels eine neue Nische kennenlernen, in der Sie Ihre Fähigkeiten hervorragend einsetzen können. Wir werden sehen, wie wir unser eigenes Web Scraping mit Python erstellen können.

Web-Scraping mit Python verstehen

Aber zunächst: Was bedeutet Web-Scraping? Auf der grundlegendsten Ebene extrahiert ein Web-Scraper Daten von einer Website, sofern diese ihre Daten nicht über eine öffentliche API zur Verfügung stellen.

Dieser Prozess ist nützlicher, als es scheint, wenn man bedenkt, dass Sie umso bessere Entscheidungen in Ihrem Unternehmen treffen, je mehr Informationen Sie haben.

Heutzutage sind Websites immer inhaltsreicher, sodass es alles andere als eine gute Idee ist, diesen Prozess vollständig von Hand durchzuführen. Hier kommt die Entwicklung eines automatisierten Tools für das Scraping ins Spiel.

„Wofür brauche ich die Daten?“, fragen Sie sich vielleicht. Schauen wir uns doch einmal einige der wichtigsten Anwendungsfälle an, in denen Web-Scraping ein echter Lebensretter ist:

  • Preisinformationen: Ein E-Commerce-Unternehmen benötigt Informationen über die Preise der Wettbewerber, um bessere Preis- und Marketingentscheidungen zu treffen.
  • Marktforschung: Marktanalyse bedeutet hochwertige, umfangreiche und aufschlussreiche Informationen.
  • Immobilien: Privatpersonen oder Unternehmen müssen Angebote aus verschiedenen Quellen zusammenführen.
  • Lead-Generierung: Kunden für Ihr wachsendes Unternehmen finden.
  • Markenbeobachtung: Unternehmen analysieren Foren, Social-Media-Plattformen und Bewertungen, um zu verfolgen, wie ihre Marke wahrgenommen wird.
  • Die Überwachung des Mindestverkaufspreises (MAP) stellt sicher, dass die Online-Preise einer Marke mit ihrer Preispolitik übereinstimmen.
  • Maschinelles Lernen: Entwickler müssen Trainingsdaten bereitstellen, damit ihre KI-gestützten Lösungen korrekt funktionieren.

Weitere Anwendungsfälle und eine detailliertere Beschreibung findest du hier.

„Cool, legen wir los!“, sagen Sie vielleicht. Nicht so schnell.

Selbst wenn Sie verstehen, wie Web-Scraping funktioniert und wie es Ihr Geschäft verbessern kann, ist es nicht so einfach, einen Web-Scraper zu erstellen. Zunächst einmal wollen manche Leute aus verschiedenen Gründen keinen Scraper auf ihren Websites haben.

Ein Grund dafür ist, dass beim Scraping viele Anfragen pro Sekunde gesendet werden, was den Server überlasten kann. Website-Betreiber können dies manchmal als Hackerangriff (Denial-of-Service) betrachten, weshalb Websites Maßnahmen ergreifen, um sich zu schützen, indem sie die Bots blockieren.

Einige dieser Maßnahmen können sein:

  • IP-Blockierung: Dies geschieht, wenn eine Website eine hohe Anzahl von Anfragen von derselben IP-Adresse feststellt; die Website kann Ihnen den Zugriff vollständig verweigern oder Ihre Geschwindigkeit erheblich drosseln.
  • CAPTCHAs (Completely Automated Public Turing tests to tell Computers and Humans Apart): Das sind logische Aufgaben, die für Menschen recht einfach zu lösen sind, für Scraper jedoch ein Problem darstellen.
  • Honeypot: integrierte Links, die für Menschen unsichtbar, für Bots jedoch sichtbar sind; sobald diese in die Falle tappen, sperrt die Website ihre IP-Adresse.
  • Anmeldung erforderlich: Websites verstecken möglicherweise einige benötigte Informationen hinter einer Anmeldeseite; selbst wenn Sie sich auf der Website authentifizieren, hat der Scraper keinen Zugriff auf Ihre Anmeldedaten oder Browser-Cookies.

Manche Websites wenden diese Techniken vielleicht nicht an, aber allein die Tatsache, dass sie mit JavaScript eine bessere Benutzererfahrung bieten wollen, erschwert einem Web-Scraper das Leben.

Wenn eine Website Javascript oder ein Framework zur HTML-Generierung verwendet, sind einige Inhalte erst nach bestimmten Interaktionen mit der Website oder nach Ausführung eines Skripts (in der Regel in Javascript geschrieben) zugänglich, das das HTML-Dokument generiert.

Betrachten wir auch die Qualität der extrahierten Daten. Auf einer E-Commerce-Website werden Ihnen beispielsweise je nach Region, in der Sie leben, unterschiedliche Preise angezeigt. Diese Daten sind nicht sehr genau, daher muss der Bot einen Weg finden, die Daten so genau wie möglich zu extrahieren.

Selbst wenn Sie all diese Herausforderungen meistern, müssen Sie dennoch berücksichtigen, dass sich die Struktur einer Website jederzeit ändern kann. Schließlich muss eine Website benutzerfreundlich sein, nicht botfreundlich, daher muss sich unser automatisiertes Tool an diese Änderungen anpassen.

In diesem nie endenden Scraping-Krieg entwickeln Bots selbst Lösungen. Das Ziel all dieser Lösungen ist es, menschliches Verhalten im Internet so gut wie möglich nachzuahmen.

Beispielsweise können Sie IP-Sperren umgehen, indem Sie IP-Proxy-Dienste nutzen. Es ist besser, kostenpflichtige Dienste zu verwenden, da die kostenlosen ihre IPs öffentlich machen, sodass eine Website sie blockieren könnte.

Sie können auch CAPTCHA-Löser integrieren. Diese helfen Ihnen dabei, kontinuierliche Datenfeeds zu erhalten, verlangsamen jedoch den Scraping-Prozess geringfügig.

Als Lösung für Honeypot-Fallen können Sie XPath (oder sogar reguläre Ausdrücke, wenn Sie mutig genug sind) verwenden, um bestimmte Elemente statt des gesamten HTML-Dokuments zu scrapen.

All diese Probleme zu berücksichtigen und Lösungen dafür zu finden, kann zu einem mühsamen und zeitaufwändigen Prozess werden. Deshalb haben Web-Scraping-APIs in den letzten zehn Jahren immer mehr Aufmerksamkeit erlangt.

Hier bei WebScrapingAPI sammeln wir den HTML-Inhalt von jeder beliebigen Website und bewältigen dabei alle möglichen Herausforderungen (wie die zuvor genannten). Außerdem nutzen wir Amazon Web Services, sodass Geschwindigkeit und Skalierbarkeit kein Problem darstellen. Hast du Lust, es auszuprobieren? Du kannst mit einem kostenlosen Konto starten, das dir 1000 API-Aufrufe pro Monat bietet. Cool, oder?

Das Web verstehen

Aber kommen wir nun zurück zum Thema dieses Artikels. Wir wollen lernen, wie man mit Python einen Web-Scraper erstellt.

Das erste wichtige Konzept ist das Hypertext Transfer Protocol (HTTP), das die Kommunikation zwischen einem Server und einem Client regelt. Die Idee dahinter ist ziemlich einfach. Der Client (die Anwendung) sendet eine Nachricht (HTTP-Anfrage) an den Server, und der Server gibt eine Antwort zurück.

Die Nachricht enthält verschiedene Informationen, die den Client beschreiben und wie er die Daten verarbeiten wird: Methode, HTTP-Version und Header.

Beim Web Scraping ist die am häufigsten verwendete Methode für eine HTTP-Anfrage GET. Das bedeutet, dass Sie die angeforderten Daten abrufen werden. Wenn Sie mehr darüber erfahren möchten, finden Sie hier eine vollständige und detaillierte Liste.

Header enthalten zusätzliche Informationen zur HTTP-Anfrage oder -Antwort. Wir werden auf die für das Web-Scraping relevantesten eingehen, du kannst jedoch die vollständige Liste einsehen.

  • User-Agent: dient zur Identifizierung der Anwendung, des Betriebssystems, der Software und deren Version; ein Web-Scraper verwendet diesen Header, um Anfragen realistischer erscheinen zu lassen.
  • Cookie: enthält zustandsbezogene Informationen zur Anfrage (zum Beispiel das Authentifizierungstoken).
  • Host: Gibt den Domainnamen des Servers und gegebenenfalls die Portnummer an, auf der der Server empfangsbereit ist.
  • Referrer: Enthält die Quelle, von der der Nutzer gekommen ist; je nachdem kann der angezeigte Inhalt unterschiedlich sein, daher muss ein Web-Scraper dies ebenfalls berücksichtigen.
  • Accept: teilt dem Server mit, welche Art von Inhalt als Antwort zurückgegeben werden kann; dies wird beim Web-Scraping oft übersehen, obwohl es eine organischere Kommunikation zwischen Client und Server ermöglichen kann.

Python verstehen

Python ist eine universelle und hochrangige Programmiersprache, die sich aus mehreren Gründen in der Gunst der Entwickler behauptet:

  • Lesbarer Code: Dank ihrer einfachen Syntax ist sie die perfekte Wahl für Anfänger.
  • Programmierparadigmen: Objektorientierte, strukturierte, funktionale und aspektorientierte Programmierung sind nur einige Beispiele.
  • Robuste Standardbibliothek: große Auswahl an Modulen für jeden Bedarf
  • Aktive Community: viele Open-Source-Bibliotheken und -Tools

Gut, nachdem das gesagt ist, bereiten wir unseren Arbeitsbereich vor. Zunächst benötigen wir Python 3. Du kannst es hier herunterladen und installieren.

Dieses Tutorial ist IDE-unabhängig, du kannst also frei wählen, womit du am besten zurechtkommst. Wir bevorzugen Visual Studio Code, da es leichtgewichtig ist und für mehrere Sprachen verfügbar ist.

Wir werden außerdem eine Reihe von Python-Bibliotheken verwenden:

  • requests: zum Absenden einer HTTP-Anfrage
  • beautifulsoup: zum Parsen des HTML-Dokuments
  • selenium: zum Scrapen dynamischer Inhalte
  • nltk (optional): zur Verarbeitung natürlicher Sprache

Du musst sie nicht alle im Voraus installieren, da es zu jedem Schritt weitere Details und Installationsanweisungen gibt.

Nun fangen wir mit dem Web-Scraping an!

Erstellen Sie Ihren eigenen Web-Scraper

Um es dir einfacher zu machen, ist das Tutorial in einzelne Schritte unterteilt. Außerdem findest du einige zusätzliche Schritte, die mit einer .1 hinter der Nummer gekennzeichnet sind. Diese dienen als Alternativen, die dich vielleicht interessieren könnten.

Schritt 1: Untersuche die Seite, die du scrapen möchtest

Okay, genug geplaudert, lassen Sie uns loslegen.

Zunächst müssen wir eine Website auswählen, die wir scrapen möchten. Um die Prinzipien zu veranschaulichen, wählen wir eine einfache Bildungswebsite: https://en.wikipedia.org/wiki/Beer.

In diesem Schritt wollen wir nur das HTML-Dokument der Seite überprüfen, um uns einen kurzen Überblick über ihre Struktur zu verschaffen. Es spielt keine Rolle, welchen Browser oder welches Betriebssystem du in diesem Schritt verwendest; der Vorgang ist derselbe. Klicke mit der rechten Maustaste auf eine beliebige Stelle – über ein Bild, einen Link oder einen einfachen Textblock – und wähle dann die Option „Element untersuchen“.

Wir konzentrieren uns ausschließlich auf die Registerkarte „Elemente“. Je nach Website sehen Sie dort eine Menge HTML-Code. Lassen Sie sich davon nicht überwältigen, sondern prüfen Sie nur die Daten, die Sie interessieren.

Schritt 2: Eine HTTP-Anfrage senden

Jetzt können wir damit beginnen, den Code für unseren Web-Scraper zu schreiben. Wir starten einfach damit, eine HTTP-Anfrage an unsere Website zu senden, um den vollständigen HTML-Code zurückzugewinnen, den wir gerade im Browser gesehen haben. Wie würde das im Code aussehen? Nun, fantastisch! Schließlich sprechen wir hier von Python.

Installieren wir die requests-Bibliothek, um die HTTP-Anfrage zu stellen:

pip install requests

Schreiben wir nun den Code:

import requests
URL = 'https://en.wikipedia.org/wiki/Beer'
page = requests.get(URL)

Ziemlich einfach, oder? Wir haben die Bibliothek importiert, die wir zuvor installiert haben. Dann haben wir die URL der Website definiert, die wir scrapen wollen, und eine GET-Anfrage gestellt. Wenn du sehen möchtest, was das Ergebnis ist, dann probier es aus und gib es aus. Im Moment siehst du nur eine unübersichtliche Zeichenkette, die den HTML-Code darstellen soll, den du in deinem Browser gesehen hast. Das hilft uns nicht viel weiter, also müssen wir ihn verarbeiten.

Schritt 3: Das HTML der Seite scrapen

Um einige nützliche Informationen aus unserem Ergebnis zu extrahieren, installieren wir die BeautifulSoup-Bibliothek:

pip install beautifulsoup4

Lassen Sie uns zunächst unser Ergebnis ansprechend formatieren:

import requests
from bs4 import BeautifulSoup
 
URL = 'https://en.wikipedia.org/wiki/Beer'
page = requests.get(URL)
 
soup = BeautifulSoup(page.content, 'html.parser')
prettyHTML = soup.prettify()
print(prettyHTML)

Wir wandeln das vorherige Ergebnis in ein BeautifulSoup-Objekt um. Mit dem Attribut .content kannst du auf die HTML-Daten zugreifen. Wenn du die Methode .prettify() anwendest, siehst du dasselbe Format, das du zuvor in deinem Browser gesehen hast.

Leider stellt nicht jede Website ihren vollständigen HTML-Code auf diese Weise zur Verfügung. Wie bereits erwähnt, gibt es einige Herausforderungen, denen Web-Scraper begegnen.

Schritt 3.1: Dynamischer Inhalt

Beispielsweise sind manche Seiten erst nach dem Einloggen sichtbar. Selbst wenn du dich über deinen Browser authentifizierst, kann dein Python-Skript nicht auf die Daten zugreifen.

Eine weitere häufige Situation sind dynamische Websites. Das bedeutet, dass die Antwort auf die GET-Anfrage kein HTML-Dokument, sondern ein JavaScript-Skript ist. Selbst wenn du den HTML-Code im Browser sehen kannst, liegt das daran, dass das Skript ausgeführt wird. In deinem Code musst du das Skript jedoch lokal ausführen, um den HTML-Code zu erhalten.

Betrachten wir diese Situation einmal in der Praxis. Wir wählen ein minimalistisches Beispiel einer schnell erstellten Website aus einer älteren Hochschulübung: https://dynamic-website.surge.sh.

Du kannst den vollständigen HTML-Code in deinem Browser sehen. In diesem Beispiel handelt es sich um eine Tabelle, deren Zellen Bilder enthalten.

import requests
from bs4 import BeautifulSoup
 
URL = 'https://dynamic-website.surge.sh'
page = requests.get(URL)
soup = BeautifulSoup(page.content, 'html.parser')
 
file = open('page.txt', mode='w', encoding='utf-8')
file.write(soup.prettify())

Extrahieren wir nun diesen HTML-Code. Das bedeutet, dass wir denselben Code wie zuvor ausführen, mit einigen Änderungen: Wir haben die URL aktualisiert und eine Textdatei geöffnet, um unser Ergebnis zu speichern. Wir führen das Programm aus und überprüfen die Datei „page.txt“ auf denselben Tabellenabschnitt.

Was ist das? Wo ist die Tabelle? Nun, sie ist da, nur dass sie noch von niemandem generiert wurde. Sie können sich den <head>-Tag des HTML-Dokuments ansehen, um zu prüfen, ob Skripte verwendet werden:

Und ja, wir verwenden tatsächlich ein Skript.

Um dieses Problem zu lösen, benötigen wir Selenium, eine Bibliothek für Webtests und die Automatisierung von Browseraktivitäten. Wir werden sie im Headless-Modus verwenden, was bedeutet, dass sie sich wie ein normaler Browser verhält, der den JavaScript-Code ausführt, jedoch ohne sichtbare Benutzeroberfläche.

pip install selenium

In diesem Tutorial verwenden wir den ChromeDriver, um den Web-Treiber für Selenium zu konfigurieren. Denken Sie nur daran, den Pfad zu kopieren, in den Sie ihn herunterladen! Wir haben ihn im Verzeichnis C gespeichert, aber jeder Speicherort ist geeignet.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
 
CHROMEDRIVER_PATH = "your/path/here/chromedriver_win32/chromedriver"
URL = "https://dynamic-website.surge.sh"
 
options = Options()
options.headless = True
driver = webdriver.Chrome(CHROMEDRIVER_PATH, options=options)
 
driver.get(URL)
soup = BeautifulSoup(driver.page_source, 'html.parser')
 
file = open('page.txt', mode='w', encoding='utf-8')
file.write(soup.prettify())

Der Rest des Vorgangs ist weitgehend identisch, außer dass wir die Requests-Bibliothek nicht mehr verwenden, um die HTTP-Anfrage zu stellen.

Wir führen das Programm erneut aus, und…

…Voilà! Wir haben nun den vollständigen HTML-Code.

Schritt 4: Extrahieren bestimmter Abschnitte

Okay, kommen wir wieder zum Thema zurück.

Den vollständigen HTML-Code zu haben, ist ein großer Fortschritt, aber der Prozess ist noch nicht abgeschlossen. Meistens benötigen wir bestimmte Informationen von einer Website, also schauen wir uns an, wie wir diese extrahieren können.

Fangen wir mit etwas Kleinem an – dem Titel der Website. Du findest ihn im Abschnitt <head> des HTML-Codes unter einem &lt;title>-Tag.

Wir wissen, dass eine Website nur einen Titel hat, daher verwenden wir die Methode .find(). Sie nimmt den Namen des Tags als Eingabe und gibt das HTML-Element zurück; wenn du also dessen Inhalt benötigst, greife einfach über das Attribut .text darauf zu. Außerdem werden wir unserem kleinen Scraper ein wenig Struktur verleihen.

def extract_title(soup):
    title = soup.find('title')
 
    #output: <title>Beer - Wikipedia</title>    
    print('Title element: ', title)
 
    #output: Beer - Wikipedia
    print('Title: ', title.text)
 
def main():
    URL = 'https://en.wikipedia.org/wiki/Beer'
    page = requests.get(URL)
    soup = BeautifulSoup(page.content, 'html.parser')
 
    extract_title(soup)
 
main()

Das ist keine Raketenwissenschaft. BeautifulSoup ist eine leistungsstarke Bibliothek und unterstützt verschiedene Muster zum Extrahieren spezifischer Daten. Du kannst HTML-Elemente anhand ihres Namens, ihrer ID und ihres class-Attributs abrufen oder sogar CSS-Selektoren verwenden. Der Fantasie sind keine Grenzen gesetzt!

Gehen wir noch einen Schritt weiter und extrahieren wir Elemente, die mehr als einmal vorkommen. In diesem Fall verwenden wir die Methode .find_all(). Der einzige Unterschied besteht darin, dass sie eine Liste von Elementen anstelle eines einzelnen Elements zurückgibt. Deshalb durchlaufen wir diese anschließend und zeigen die Attribute jedes Elements an. Als Beispiel haben wir alle Bilder aus dem Artikel extrahiert:

def extract_images(soup):
    images = soup.find_all('img')
    for image in images:
        imageAlt = image.get('alt')
        imageSrc = image.get('src')
        print("ALT: ", imageAlt, "SRC: ", imageSrc)
 
def main():
    URL = 'https://en.wikipedia.org/wiki/Beer'
    page = requests.get(URL)
    soup = BeautifulSoup(page.content, 'html.parser')
 
    extract_images(soup)
 
main()

Schritt 5: Funktionen beim Scraping übergeben

Eine häufige Situation beim Web-Scraping ist, dass die Liste der Parsing-Ergebnisse sehr lang ist und gemischte Informationen enthält.

Vielleicht ist Ihnen beispielsweise aufgefallen, dass unsere vorherigen Bilder ein alt-Attribut enthalten können oder auch nicht.

Oder stellen Sie sich vor, wir würden alle Links aus dem Artikel extrahieren. Wir alle wissen, dass ein Wikipedia-Artikel SEHR VIELE Links enthält, und wir möchten vielleicht keine vollständige Liste davon. Das Ergebnis wird externe und interne Links, Referenzen und Zitate enthalten, daher müssen wir sie in mehrere Kategorien einteilen.

Um dieses Problem zu lösen, werden wir eine Lambda-Funktion verwenden. Im Grunde genommen nimmt die Lambda-Funktion jedes Element aus der Ergebnisliste als Parameter und wendet die von uns definierte Bedingung an, genau wie bei der Verwendung eines Filters.

Nehmen wir als praktisches Beispiel an, wir müssen alle internen Links extrahieren, auf die entsprechenden Artikel zugreifen und für jeden eine Zusammenfassung erstellen. Da einer der Anwendungsfälle von Python die künstliche Intelligenz ist, könnte dieses Beispiel eine hervorragende Anwendung zur Gewinnung von Trainingsdaten sein.

Zunächst müssen wir die NLTK-Bibliothek installieren, da die Erstellung einer Zusammenfassung die Verarbeitung menschlicher Sprache erfordert.

pip install -U nltk

Und natürlich müssen wir sie in unseren Code importieren:

import re
import nltk
import heapq
# need to download only for the first execution
# warning: the size of the dataset is big; hence it will take time
nltk.download()

Hinweis: Wenn Sie ein macOS-Benutzer sind, erhalten Sie möglicherweise die Fehlermeldung „SSL: certificate verify failed“. Die Ursache dafür könnte sein, dass Python 3.6 eine eingebettete Version von OpenSSL verwendet. Sie müssen lediglich den Ordner öffnen, in dem Sie Python installiert haben, und diese Datei ausführen:

/Your/Path/Here/Python 3.6/Install Certificates.command

Wie du siehst, haben wir auch die re-Bibliothek importiert, die für Operationen mit regulären Ausdrücken verwendet wird, sowie heapq, eine Implementierung einer Heap-Warteschlange.

Gut, wir haben alles, was wir brauchen, um mit dem Schreiben des Codes zu beginnen. Beginnen wir damit, die internen Links zu extrahieren. Wenn Sie zum Browser zurückkehren, werden Sie einige Dinge an den Elementen bemerken, die uns interessieren.

Das wären:

  • Das href-Attribut hat einen Wert;
  • Der Wert von „href“ beginnt mit „/wiki/“;
  • Das übergeordnete Element des Links ist ein -Tag;

Diese Merkmale helfen uns dabei, die benötigten Links von allen anderen zu unterscheiden.

Da wir nun wissen, wie wir die Links finden, schauen wir uns an, wie wir sie extrahieren können.

count = 0
 
def can_do_summary(tag):
    global count
    if count > 10: return False
 
    # Reject if parent is not a paragraph
    if not tag.parent.name == 'p': return False
 
    href = tag.get('href')
    # Reject if href is not set
    if href is None: return False
 
    # Reject is href value does not start with /wiki/
    if not href.startswith('/wiki/'): return False
 
    compute_summary(href)
    return True
 
 
def extract_links(soup):
    soup.find_all(lambda tag: tag.name == 'a' and can_do_summary(tag))
 
def main():
    URL = 'https://en.wikipedia.org/wiki/Beer'
    page = requests.get(URL)
    soup = BeautifulSoup(page.content, 'html.parser')
 
    extract_links(soup)
 
main()

Okay, was ist hier also passiert? Wenn wir uns die Funktion `extract_links()` ansehen, erkennen wir, dass wir anstelle eines Tag-Namens eine Lambda-Funktion als Parameter an die Methode `.find_all()` übergeben haben. Das bedeutet, dass wir aus allen Tags des HTML-Dokuments nur diejenigen auswählen, die unserer Bedingung entsprechen.

Wie du sehen kannst, besteht die Bedingung für ein Tag darin, ein Link zu sein und von der oben definierten Funktion `can_do_summary()` akzeptiert zu werden. Dort lehnen wir alles ab, was nicht den zuvor beobachteten Merkmalen entspricht. Außerdem haben wir eine globale Variable verwendet, um die Anzahl der extrahierten Links auf 10 zu begrenzen. Wenn du alle benötigst, kannst du die Variable `count` gerne entfernen.

Am Ende rufen wir die Funktion `compute_summary()` für den neu gefundenen Link auf. Dort wird der Artikel zusammengefasst.

def compute_summary(href):
    global count
    full_link = 'https://en.wikipedia.org' + href
    page = requests.get(full_link)
    soup = BeautifulSoup(page.content, 'html.parser')
 
    # Concatenate article paragraphs
    paragraphs = soup.find_all('p')
    article_text = ""
    for p in paragraphs:
        article_text += p.text
 
    # Removing Square Bracket, extra spaces, special characters and digits
    article_text = re.sub(r'\[[0-9]*\]', ' ', article_text)
    article_text = re.sub(r'\s+', ' ', article_text)
    formatted_article_text = re.sub('[^a-zA-Z]', ' ', article_text)
    formatted_article_text = re.sub(r'\s+', ' ', formatted_article_text)
 
    # Converting text to sentences
    sentence_list = nltk.sent_tokenize(article_text)
 
    # Find frequency of occurrence of each word
    stopwords = nltk.corpus.stopwords.words('english')
 
    word_frequencies = {}
    for word in nltk.word_tokenize(formatted_article_text):
        if word not in stopwords:
            if word not in word_frequencies.keys():
                word_frequencies[word] = 1
            else:
                word_frequencies[word] += 1
 
    maximum_frequency = max(word_frequencies.values())
 
    for word in word_frequencies.keys():
        word_frequencies[word] = (word_frequencies[word] / maximum_frequency)
 
    # Calculate the score of each sentence
    sentence_scores = {}
    for sent in sentence_list:
        for word in nltk.word_tokenize(sent.lower()):
            if word in word_frequencies.keys():
                if len(sent.split(' ')) < 30:
                    if sent not in sentence_scores.keys():
                        sentence_scores[sent] = word_frequencies[word]
                    else:
                        sentence_scores[sent] += word_frequencies[word]
 
    # Pick top 7 sentences with highest score
    summary_sentences = heapq.nlargest(7, sentence_scores, key=sentence_scores.get)
    summary = '\n'.join(summary_sentences)
    count += 1

Kurz gesagt: Wir senden eine HTTP-Anfrage an die neu gefundene URL und wandeln das Ergebnis in ein BeautifulSoup-Objekt um, genau wie zu Beginn des Artikels.

Um eine Zusammenfassung zu erstellen, extrahieren wir alle Absätze aus dem Artikel und fügen sie aneinander. Danach entfernen wir alle Sonderzeichen, die die Berechnungen stören könnten.

Einfach ausgedrückt wird eine Zusammenfassung erstellt, indem die häufigsten Wörter ermittelt werden und jeder Satz eine Punktzahl erhält, die auf der Häufigkeit seiner Wörter basiert. Am Ende wählen wir die 7 Sätze mit der höchsten Punktzahl aus.

Dies ist nicht das Thema unseres Artikels, aber Sie können hier mehr darüber lesen, wenn Sie neugierig sind oder sich sogar für natürliche Sprachverarbeitung begeistern.

Schritt 6: Erstellen Sie eine CSV-Datei, um Ihre Daten zu speichern

Im letzten Schritt dieses Leitfadens müssen wir uns die Ergebnisse des Scrapings ansehen. Bisher haben wir sie nur im Terminal angezeigt, da es nur wenige Datenzeilen gab.

Im realen Leben bedeutet Scraping jedoch eine beträchtliche Menge an Informationen, daher sollten wir uns ansehen, wie wir die Ergebnisse in einer Datei speichern können.

Verwenden wir die native Bibliothek csv (es muss also nichts zusätzlich installiert werden) und öffnen wir eine Datei namens summaries.csv.

import csv
summaries_file = open('summaries.csv', mode='a', encoding='utf-8')

Die Bibliothek erstellt die Datei, falls sie noch nicht existiert. Außerdem öffnen wir sie im „Append“-Modus, da jeder Link nacheinander, einzeln, verarbeitet wird.

    summaries_writer = csv.writer(summaries_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    summaries_writer.writerow([full_link, summary])

Am Ende der Funktion compute_summary() initialisieren wir einfach den Writer und beginnen mit dem Anhängen der Daten. Eine Zeile besteht aus der URL des Artikels und seiner Zusammenfassung.

Schritt 6.1: Erstellen einer JSON-Datei

Ein weiteres Format zur Datenserialisierung, das in den letzten Jahren populär wurde, ist JavaScript Object Notation (JSON). Es ist leicht lesbar und praktisch, wenn Sie die gescrapten Daten an eine API oder eine andere Anwendung übergeben möchten.

In Python ist der einfachste Weg, eine JSON-Datei zu schreiben, die Daten an ein dict-Objekt zu übergeben.

import json
 
summaries_file = open('summaries.json', mode='a', encoding='utf-8')
data = {}
data['summaries'] = []

Wir verwenden die native Bibliothek für JSON-Dateien und öffnen eine neue Datei, genau wie zuvor bei unserer CSV-Datei. Dann initialisieren wir ein leeres dict-Objekt und eine leere Liste, die unsere Zusammenfassungen enthalten wird.

data['summaries'].append({
'url': full_link,
      'summary': summary
})

Am Ende der Funktion `compute_summary()`, genau dort, wo wir zuvor die CSV-Datei geschrieben haben, fügen wir nun ein neues Dict-Objekt an die abschließende Liste an.

json.dump(data, summaries_file, indent=4)

Und schließlich schreiben wir in unserer main()-Funktion, nachdem wir den extract_links()-Prozess ausgeführt haben, das endgültige Objekt in die Datei. Der Parameter indent sorgt lediglich für eine ansprechende Formatierung des Ergebnisses.

Fazit und Alternativen

Nun, das war’s, das Ende unseres Tutorials. Ich hoffe, es war hilfreich und hat Ihnen einen guten Einblick in das Web-Scraping mit Python gegeben.

Wir haben die Vorteile kennengelernt und erfahren, wie es Ihr Unternehmen bzw. Ihre Anwendung verbessern kann. Gleichzeitig haben wir diese Informationen mit einigen der Herausforderungen beim Web-Scraping abgewogen.

Wenn Sie Entwickler sind, könnte es für Sie spannend sein, selbst einen Web-Scraper zu entwickeln und dabei all diese Probleme zu überwinden. Das kann eine coole Lernerfahrung sein.

Als Geschäftsinhaber (oder als jemand, der Daten für eine reale, groß angelegte Anwendung benötigt) möchten Sie jedoch möglicherweise die damit verbundenen Kosten (Zeit, Geld, Personal) vermeiden.

In dieser Situation löst die Verwendung einer speziellen API das Problem. WebScrapingAPI überwindet alle möglichen Hindernisse: Javascript-Rendering, Proxys, CAPTCHAs usw. und bietet anpassbare Funktionen. Und wenn Sie sich noch nicht ganz sicher sind, denken Sie daran, dass es einen kostenlosen Tarif gibt – warum probieren Sie es also nicht einfach mal aus?

Über den Autor
Raluca Penciuc, Full-Stack-Entwickler @ WebScrapingAPI
Raluca PenciucFull-Stack-Entwickler

Raluca Penciuc ist Full-Stack-Entwicklerin bei WebScrapingAPI. Sie entwickelt Scraper, verbessert Umgehungsstrategien und findet zuverlässige Wege, um die Erkennung auf Zielwebsites zu verringern.

Los geht’s

Sind Sie bereit, Ihre Datenerfassung zu erweitern?

Schließen Sie sich den über 2.000 Unternehmen an, die WebScrapingAPI nutzen, um Webdaten im Unternehmensmaßstab ohne zusätzlichen Infrastrukturaufwand zu extrahieren.