Kratzen Sie eine Website mit diesem schönen Suppen-Python-Tutorial

Beautiful Soup ist eine Open-Source-Python-Bibliothek. Es verwendet navigierende Parser, um den Inhalt von XML- und HTML-Dateien zu entfernen. Sie benötigen Daten für verschiedene Analysezwecke. Wenn Sie Python und Web-Scraping noch nicht kennen, lohnt es sich, die Beautiful Soup-Bibliothek von Python für ein Web-Scraping-Projekt auszuprobieren.

Mit der Open-Source-Bibliothek Beautiful Soup von Python können Sie Daten abrufen, indem Sie einen Teil oder ein 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 weiterhin. Sie können ihn jedoch 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 heißt, Sie können eine URL nicht direkt übergeben. 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 weiterleiten.

Führen Sie den Befehl pip install request über das Terminal aus, um diese Bibliothek für Ihren Scraper verfügbar zu machen.

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 kratzen möchten

Bevor Sie eine Website scrappen, mit der Sie nicht vertraut sind, sollten Sie die 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 erforderlich, 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 dabei, die besten Strategien zu entwickeln, mit denen Sie genau die gewünschten Daten von einer Website abrufen können und wie Sie sie abrufen können.

So kratzen Sie die Daten einer Website mit einer schönen Suppe

Nachdem Sie 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

Lassen Sie uns zunächst sehen, 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 der Status 200 zurückgegeben, der angibt, dass Ihre Anforderung erfolgreich ist. Andernfalls erhalten Sie den Status 400 oder einen anderen Fehlerstatus, der auf eine fehlgeschlagene GET-Anforderung hinweist.

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, geben Sie sie an Beautiful Soup weiter, die den Inhalt nun je nach gewähltem Format mithilfe des integrierten XML- oder HTML-Parsers als HTML- oder XML-Dateien lesen kann.

Schauen Sie sich dieses nächste Code-Snippet an, um zu sehen, wie dies mit dem HTML-Parser gemacht wird:

 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 ihrem Inhalt zurück.

Sie können auch eine besser ausgerichtete Version des DOM mithilfe der Prettify- Methode erhalten. 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 das 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 kratzen Sie den Inhalt einer Webseite anhand des Tag-Namens

Sie können den Inhalt eines bestimmten Tags auch mit Beautiful Soup kratzen. Dazu müssen Sie den Namen des Ziel-Tags in Ihre Beautiful Soup Scraper-Anfrage aufnehmen.

Lassen Sie uns beispielsweise sehen, 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 gibtoup.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. Mit der .string- Methode können Sie den Inhalt jedoch abrufen , ohne das Tag zu laden :

 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. Sie müssen lediglich das h2- Tag durch das gewünschte ersetzen.

Sie können jedoch auch mehr Tags entfernen , 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 :

 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 kratzen Sie eine Webseite mit der ID und dem Klassennamen

Nachdem Sie eine Website mit den DevTools überprüft 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 kratzen. Dies ist nützlich, wenn der Inhalt einer Zielkomponente aus der Datenbank herausgeschleift wird.

Sie können die Suchmethode für die ID- und Klassen-Scraper verwenden. Im Gegensatz zur find_all- Methode, die ein iterierbares Objekt zurückgibt, arbeitet die find- Methode mit einem einzelnen, nicht iterierbaren Ziel, in diesem Fall der ID . Sie müssen also die for- Schleife nicht verwenden.

Schauen wir uns ein Beispiel an, wie Sie den Inhalt einer der folgenden Seiten mit der folgenden ID entfernen 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)

Ersetzen Sie dazu für einen Klassennamen die ID durch class . Das Schreiben einer Klasse führt jedoch direkt zu einer Verwirrung der Syntax, da Python dies als Schlüsselwort betrachtet. Um diesen Fehler zu umgehen, müssen Sie vor der Klasse einen Unterstrich wie folgt 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 durchsuchen, indem Sie einen bestimmten Tag-Namen mit der entsprechenden ID oder Klasse aufrufen:

 data = soup.find_all('div', class_ = 'enter the target class name here')
print(data)

Wie man einen wiederverwendbaren Schaber mit schöner Suppe macht

Sie können eine Klasse erstellen und den gesamten vorherigen Code zu einer Funktion in dieser Klasse zusammenfügen, um einen wiederverwendbaren Scraper zu erstellen, der den Inhalt einiger Tags und deren 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 für Hemden von einer E-Commerce-Website kratzen. Die folgende Beispiel-Scraper-Klasse extrahiert die Preis- und Shirt-Tags mit den 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 kann in eine andere Python-Datei importiert und verwendet werden. Um die Scrape- Funktion aus ihrer Klasse aufzurufen , verwenden Sierapeit.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 folgendermaßen 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, in der sich die Scraper-Klasse befindet.

Sie können auch die Dokumentation zu Beautiful Soup lesen, wenn Sie genauer untersuchen möchten, wie Sie sie optimal nutzen können.

Schöne Suppe ist ein wertvolles Web Scraping Tool

Beautiful Soup ist ein leistungsstarker Python-Bildschirmschaber, mit dem Sie steuern können, wie Ihre Daten während des Scrapings durchkommen. Es ist ein wertvolles Geschäftstool, da Sie damit auf die Webdaten der Wettbewerber wie Preise, Markttrends und mehr zugreifen können.

Obwohl wir in diesem Artikel einen Tag-Scraper erstellt haben, können Sie mit dieser leistungsstarken Python-Bibliothek herumspielen, um nützlichere Scraping-Tools zu erstellen.