Beautiful Soup ist eine Open-Source-Python-Bibliothek. Es verwendet navigierende Parser, um den Inhalt von XML- und HTML-Dateien abzukratzen. Sie benötigen Daten für verschiedene Analysezwecke. Wenn Sie jedoch noch nicht mit Python und Web-Scraping vertraut sind, lohnt es sich, die Beautiful Soup-Bibliothek von Python für ein Web-Scraping-Projekt auszuprobieren.
Mit Pythons Open-Source-Bibliothek Beautiful Soup können Sie Daten abrufen, indem Sie jeden Teil oder jedes Element einer Webseite mit maximaler Kontrolle über den Prozess abkratzen. In diesem Artikel sehen wir uns an, wie Sie mit Beautiful Soup eine Website kratzen können.
So installieren Sie eine schöne Suppe und legen los
Bevor wir fortfahren, verwenden wir in diesem Tutorial-Artikel zu Beautiful Soup Python 3 und beautifulsoup4 , die neueste Version von Beautiful Soup. Stellen Sie sicher, dass Sie eine virtuelle Python-Umgebung erstellen , um Ihr Projekt und seine Pakete von denen auf Ihrem lokalen Computer zu isolieren.
Um zu beginnen, müssen Sie die Beautiful Soup-Bibliothek in Ihrer virtuellen Umgebung installieren. Beautiful Soup ist als PyPi-Paket für alle Betriebssysteme verfügbar, sodass Sie es mit dem Befehl pip install beautifulsoup4 über das Terminal installieren können .
Wenn Sie jedoch unter Debian oder Linux arbeiten, funktioniert der obige Befehl immer noch, aber Sie können ihn mit dem Paketmanager installieren, indem Sie apt-get install python3-bs4 ausführen .
Beautiful Soup kratzt URLs nicht direkt. Es funktioniert nur mit vorgefertigten HTML- oder XML-Dateien. Das bedeutet, dass Sie eine URL nicht direkt übergeben können. Um dieses Problem zu lösen, müssen Sie die URL der Zielwebsite mit der Anforderungsbibliothek von Python abrufen, bevor Sie sie an Beautiful Soup füttern.
Um diese Bibliothek für Ihren Scraper verfügbar zu machen, führen Sie den Befehl pip install Requests über das Terminal aus.
Um die XML-Parser-Bibliothek zu verwenden, führen Sie pip install lxml aus , um sie zu installieren.
Überprüfen Sie die Webseite, die Sie entfernen möchten
Bevor Sie eine Website, die Sie nicht kennen, kratzen, sollten Sie deren Elemente überprüfen. Sie können dies tun, indem Sie Ihren Browser in den Entwicklermodus schalten. Es ist ziemlich einfach, Chrome DevTools zu verwenden, wenn Sie Google Chrome verwenden.
Es ist jedoch notwendig, eine Webseite zu überprüfen, um mehr über ihre HTML-Tags, Attribute, Klassen und IDs zu erfahren. Dadurch werden die Kernelemente einer Webseite und ihre Inhaltstypen verfügbar gemacht.
Es hilft Ihnen auch, die besten Strategien zu entwickeln, die Sie verwenden können, um genau die Daten zu erhalten, die Sie von einer Website benötigen, und wie Sie diese abrufen können.
So kratzen Sie die Daten einer Website mit einer schönen Suppe
Nachdem Sie nun alles vorbereitet haben, öffnen Sie einen bevorzugten Code-Editor und erstellen Sie eine neue Python-Datei mit einem ausgewählten Namen. Sie können jedoch auch webbasierte IDEs wie Jupyter Notebook verwenden, wenn Sie nicht mit der Ausführung von Python über die Befehlszeile vertraut sind.
Importieren Sie als Nächstes die erforderlichen Bibliotheken:
from bs4 import BeautifulSoup import requests
Sehen wir uns zunächst an, wie die Anforderungsbibliothek funktioniert:
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com') print(website)
Wenn Sie den obigen Code ausführen, wird ein 200-Status zurückgegeben, der anzeigt, dass Ihre Anfrage erfolgreich war. Andernfalls erhalten Sie einen 400-Status oder einige andere Fehlerstatus, die auf eine fehlgeschlagene GET-Anforderung hinweisen.
Denken Sie daran, die URL der Website in Klammern immer durch Ihre Ziel-URL zu ersetzen.
Sobald Sie die Website mit der Get- Anfrage erhalten haben, übergeben Sie sie an Beautiful Soup, das den Inhalt nun je nach gewähltem Format mit seinem integrierten XML- oder HTML-Parser als HTML- oder XML-Dateien lesen kann.
Sehen Sie sich dieses nächste Code-Snippet an, um zu sehen, wie Sie dies mit dem HTML-Parser tun:
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com') soup = BeautifulSoup(website.content, 'html.parser') print(soup)
Der obige Code gibt das gesamte DOM einer Webseite mit seinem Inhalt zurück.
Sie können auch eine besser ausgerichtete Version des DOM erhalten, indem Sie die Methode prettify verwenden. Sie können dies ausprobieren, um die Ausgabe zu sehen:
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') print(soup.prettify())
Sie können den reinen Inhalt einer Webseite auch abrufen, ohne ihr Element mit der .text- Methode zu laden :
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') print(soup.text)
So schaben Sie den Inhalt einer Webseite nach dem Tag-Namen
Sie können mit Beautiful Soup auch den Inhalt eines bestimmten Tags abkratzen. Dazu müssen Sie den Namen des Ziel-Tags in Ihre Beautiful Soup Scraper-Anfrage aufnehmen.
Sehen wir uns zum Beispiel an, wie Sie den Inhalt in den h2- Tags einer Webseite abrufen können.
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') print(soup.h2)
Im obigen Code-Snippet gibt soup.h2 das erste h2- Element der Webseite zurück und ignoriert den Rest. Um alle h2- Elemente zu laden , können Sie die integrierte Funktion find_all und die for- Schleife von Python verwenden:
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') h2tags = soup.find_all('h2') for soups in h2tags: print(soups)
Dieser Codeblock gibt alle h2- Elemente und ihren Inhalt zurück. Sie können den Inhalt jedoch abrufen , ohne das Tag zu laden, indem Sie die .string- Methode verwenden:
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') h2tags = soup.find_all('h2') for soups in h2tags: print(soups.string)
Sie können diese Methode für jedes HTML-Tag verwenden. Alles, was Sie tun müssen, ist das h2- Tag durch das gewünschte zu ersetzen .
Sie können jedoch auch weitere Tags auslesen , indem Sie eine Liste von Tags an die find_all- Methode übergeben. Der folgende Codeblock kratzt beispielsweise den Inhalt der Tags a , h2 und title ab :
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') tags = soup.find_all(['a', 'h2', 'title']) for soups in tags: print(soups.string)
So schaben Sie eine Webseite mithilfe der ID und des Klassennamens
Nachdem Sie eine Website mit den DevTools untersucht haben, erfahren Sie mehr über die ID- und Klassenattribute, die jedes Element in seinem DOM enthalten. Sobald Sie diese Informationen haben, können Sie diese Webseite mit dieser Methode abkratzen. Dies ist nützlich, wenn der Inhalt einer Zielkomponente aus der Datenbank ausläuft.
Sie können die find- Methode für die id- und class-Scraper verwenden. Im Gegensatz zur find_all- Methode, die ein iterierbares Objekt zurückgibt, arbeitet die find- Methode auf einem einzelnen, nicht iterierbaren Ziel, das in diesem Fall die ID ist. Sie müssen also nicht die for- Schleife verwenden.
Sehen wir uns ein Beispiel an, wie Sie den Inhalt einer Seite unten mithilfe der ID kratzen können:
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') id = soup.find(id = 'enter the target id here') print(id.text)
Um dies für einen Klassennamen zu tun, ersetzen Sie die ID durch class . Das Schreiben von Klassen führt jedoch direkt zu Syntaxverwirrung, da Python sie als Schlüsselwort sieht. Um diesen Fehler zu umgehen, müssen Sie einen Unterstrich wie folgt vor die Klasse schreiben: class_ .
Im Wesentlichen wird die Zeile mit der ID zu:
my_classes = soup.find(class_ = 'enter the target class name here') print(my_classes.text)
Sie können eine Webseite jedoch auch durch Aufrufen eines bestimmten Tag-Namens mit der entsprechenden ID oder Klasse scannen:
data = soup.find_all('div', class_ = 'enter the target class name here') print(data)
Wie man einen wiederverwendbaren Schaber mit schöner Suppe herstellt
Sie können eine Klasse erstellen und den gesamten vorherigen Code in einer Funktion in dieser Klasse zusammenfassen, um einen wiederverwendbaren Scraper zu erstellen, der den Inhalt einiger Tags und ihrer IDs abruft. Wir können dies tun, indem wir eine Funktion erstellen, die fünf Argumente akzeptiert: eine URL, zwei Tag-Namen und ihre entsprechenden IDs oder Klassen.
Angenommen, Sie möchten den Preis von Hemden von einer E-Commerce-Website abkratzen. Die folgende Scraper-Beispielklasse extrahiert die Preis- und Shirt-Tags mit ihren entsprechenden IDs oder Klassen und gibt sie dann als Pandas-Datenrahmen mit 'Price' und Shirt_name als Spaltennamen zurück.
Stellen Sie sicher, dass Sie Pandas über das Terminal installieren, falls Sie dies noch nicht getan haben.
import pandas as pd class scrapeit: try: def scrape(website=None, tag1=None, id1=None, tag2=None, id2=None): if not (website and tag1 and id1 and tag2 and id2)==None: try: page = requests.get(website) soup = BeautifulSoup(page.content, 'html.parser') infotag1 = soup.find_all(tag1, id1) infotag2 = soup.find_all(tag2, id2) priced = [prices.text for prices in infotag1] shirt = [shirts.text for shirts in infotag2] data = { 'Price':priced, 'Shirt_name':shirt} info = pd.DataFrame(data, columns=['Price', 'Shirt_name']) print(info) except: print('Not successful') else: print('Oops! Please enter a website, two tags and thier corresponding ids') except: print('Not successful!')
Der soeben erstellte Scraper ist ein wiederverwendbares Modul und Sie können es importieren und in einer anderen Python-Datei verwenden. Um die Scrape- Funktion aus ihrer Klasse aufzurufen , verwenden Sie Scrapeit.scrape('Website URL', 'price_tag', 'price_id', 'shirt_tag', 'shirt_id') . Wenn Sie die URL und andere Parameter nicht angeben, werden Sie von der else- Anweisung dazu aufgefordert.
Um diesen Scaper in einer anderen Python-Datei zu verwenden, können Sie ihn wie folgt importieren:
from scraper_module import scrapeit scrapeit.scrape('URL', 'price_tag', 'price_id', 'shirt_tag', 'shirt_id')
Hinweis: scraper_module ist der Name der Python-Datei, die die Scraper-Klasse enthält.
Sie können auch die Dokumentation zu Beautiful Soup lesen, wenn Sie tiefer eintauchen möchten, wie Sie sie am besten nutzen können.
Beautiful Soup ist ein leistungsstarker Python-Screenscraper, der Ihnen die Kontrolle darüber gibt, wie Ihre Daten während des Scrapings übertragen werden. Es ist ein wertvolles Geschäftstool, da es Ihnen Zugriff auf die Webdaten von Mitbewerbern wie Preise, Markttrends und mehr bietet.
Obwohl wir in diesem Artikel einen Tag-Scraper erstellt haben, können Sie immer noch mit dieser leistungsstarken Python-Bibliothek herumspielen, um nützlichere Scraping-Tools zu erstellen.