Inhaltsübersicht
Was ist ein Datensatz?
Ein Datensatz ist eine Sammlung von zusammenhängenden Daten, die auf strukturierte Weise organisiert sind. Er kann verschiedene Formen annehmen, z. B. tabellarische Daten - mit Spalten, die verschiedene Variablen darstellen, und Zeilen, die einzelne Datensätze repräsentieren. In anderen Fällen kann ein Datensatz aus Dokumenten oder Dateien bestehen.
Im Wesentlichen fasst ein Datensatz Informationen zusammen, die auf der Grundlage ihrer Beziehung oder ihres Zwecks gruppiert werden. Sie ermöglichen eine effiziente Verwaltung und einen effizienten Zugriff, so dass wir die Daten einzeln oder gemeinsam analysieren und bearbeiten können.
Stellen Sie sich einen Datensatz als einen Behälter mit wertvollen Informationen vor, wie einen virtuellen Aktenschrank oder eine Datenbank. Er bietet einen strukturierten Rahmen, der uns hilft, die Daten zu speichern, zu organisieren und sinnvoll zu nutzen.
Öffentliche vs. private Datensätze
Ein öffentlicher Datensatz ist eine Sammlung von Informationen, die jedem zugänglich ist, der darauf zugreifen möchte. Sie können zu Forschungs-, Analyse- oder anderen Zwecken verwendet werden. Forscher und Datenwissenschaftler nutzen häufig öffentliche Datensätze, um neue Algorithmen und Modelle zu entwickeln.
Ein gutes Beispiel für öffentliche Datensätze sind die von Kaggle bereitgestellten Daten.
(Diese können von jedermann heruntergeladen und nach Belieben verwendet werden).
Ein privater Datensatz hingegen ist eine Sammlung von Informationen, die nur einer bestimmten Gruppe von Personen oder Organisationen zugänglich ist. Unternehmen und Organisationen verwenden private Datensätze häufig, um sensible Informationen zu speichern, die sie nicht mit der Öffentlichkeit teilen möchten.
Dabei ist zu bedenken, dass ein Datensatz nicht deshalb privat ist, weil er bezahlt wird. Dies ist ein wichtiger Unterschied, denn der Zugang zu Daten kann einem Unternehmen einen klaren Vorteil gegenüber der Konkurrenz verschaffen.
Wenn beispielsweise viele Unternehmen die gleichen Datensätze vom gleichen Anbieter kaufen, hängt der Unterschied in den Ergebnissen von den Fähigkeiten der Analysten ab und davon, wie schnell sie die Erkenntnisse umsetzen können.
Wenn Unternehmen jedoch ihre eigenen Datensätze aus alternativen Quellen erstellen, können sie auf eine Fülle einzigartiger Erkenntnisse zugreifen, die andere Organisationen oder Unternehmen nicht haben.
Wie man einen Datensatz erstellt
Für jedes Projekt zum maschinellen Lernen (ML) oder zur Datenanalyse werden Informationen benötigt, und es gibt viele Möglichkeiten, wie Fachleute und Unternehmen diese Informationen sammeln können:
- Erhebungen und Fragebögen - Die Teilnehmer füllen Formulare aus, in denen sie die von den Forschern benötigten Informationen angeben.
- Öffentlich verfügbare Daten - Einige Regierungen und Institutionen stellen öffentliche Datensätze zur Verfügung, die Sie herunterladen und in Ihren Projekten verwenden können.
- Transaktionsdaten - Dinge wie Verkaufsaufzeichnungen liefern eine Menge nützlicher Informationen, die Unternehmen nutzen können, um die Nachfrage nach Produkten und Dienstleistungen, spezifische Details über ihre Zielgruppen und vieles mehr besser zu verstehen.
- Daten-APIs - Einige Websites, Datenanbieter und Anwendungen bieten Open-Source- und kostenpflichtige APIs an, über die wir Informationen aus ihren Datenbanken abrufen können.
In vielen Fällen sind die von uns benötigten Daten jedoch über das Internet verstreut, ohne dass wir über APIs oder strukturierte Formate direkt darauf zugreifen können - ein paar Beispiele sind Produktdaten, öffentliche Unterhaltungen und Beiträge in sozialen Medien, Foren usw.
In diesen Fällen besteht die einzige Lösung darin Nutzung von Web Scraping für den Zugang zu den Daten, ihre Erfassung und Aufbereitung zu brauchbaren Datensätzen.
Erstellen eines Datensatzes mit Web Scraping
Unter Web Scraping versteht man das programmgesteuerte Extrahieren öffentlich zugänglicher Webdaten von Websites und Online-Plattformen. Dies ermöglicht uns den Zugriff auf Millionen von Datenpunkten, die wir später für die Entwicklung von Anwendungen, die Gewinnung von Erkenntnissen für Geschäftsentscheidungen und vieles mehr nutzen können.
Mit anderen Worten: Wir können unsere eigenen privaten, strukturierten Datensätze ganz einfach durch Web Scraping erstellen.
In diesem Lehrgang werden wir die folgenden fünf Technologien verwenden:
- Python
- Anfragen - um unsere HTTP-Anfragen zu stellen
- ScraperAPI - zur Vermeidung von IP-Sperren und zur Umgehung von Anti-Scraping-Mechanismen
- BeautifulSoup - zum Parsen der HTML-Antwort
- Pandas - um unseren DataFrame zu erstellen
Hinweis: In Python ist ein DataFrame eine Struktur, die unserer Dataset-Definition entspricht.
Unser Ziel ist es, die Buchdaten von https://books.toscrape.com/index.html
und erstellen Sie einen DataFrame mit dem Namen, dem Preis, der Beschreibung, der Lagerverfügbarkeit, der universellen Produktnummer (UPC) und der Kategorie.
TL;DR - Vollständiger Code
Für diejenigen, die es eilig haben oder bereits Erfahrung haben, finden Sie hier die vollständige Codebasis, die wir in diesem Tutorial erstellen.
import requests
from bs4 import BeautifulSoup
import pandas as pd
scraperapi = 'https://api.scraperapi.com?api_key=YOUR_API_KEY&url="
all_books = []
for x in range(1, 5):
response = requests.get(scraperapi + f"https://books.toscrape.com/catalogue/page-{x}.html')
soup = BeautifulSoup(response.content, 'html.parser')
onpage_books = soup.find_all('li', class_='col-xs-6')
for books in onpage_books:
r = requests.get(scraperapi + 'https://books.toscrape.com/catalogue/' + books.find('a')['href'])
s = BeautifulSoup(r.content, 'html.parser')
all_books.append({
'Name': s.find('h1').text,
'Description': s.select('p')[3].text,
'Price': s.find('p', class_='price_color').text,
'Category': s.find('ul', class_='breadcrumb').select('li')[2].text.strip(),
'Availability': s.select_one('p.availability').text.strip(),
'UPC': s.find('table').find_all('tr')[0].find('td').text
})
df = pd.DataFrame(all_books)
df.to_csv('book_data.csv', index=False)
Bevor Sie das Skript ausführen, erstellen Sie ein kostenloses ScraperAPI-Konto und fügen Sie dem Skript Ihren API-Schlüssel in der Datei scraperapi
variabel.
1. Erstellung unseres Scraping-Plans
Nachdem wir uns ein klares Ziel gesetzt haben, ist der nächste Schritt die Navigation auf der Website, um zu planen, wie wir die Daten veröffentlichen wollen.
Die Website selbst ist eine Kombination aus paginierten Seiten, Kategorieseiten und Buchseiten. Um detaillierte Informationen für jedes Buch zu erhalten, müssen wir zu jeder dieser Buchseiten navigieren und die Elemente extrahieren.
Wenn wir jedoch auf eines dieser Bücher klicken, werden Sie feststellen, dass es keine Möglichkeit gibt, die URL vorherzusagen - abgesehen von der Verwendung des Namens des Buches als Teil der URL:
https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html
Bei näherer Betrachtung zeigt die Website in der paginierten Reihe 20 Bücher von insgesamt 1000 Büchern an, und wenn wir auf die Schaltfläche "Weiter" am unteren Rand der Seite klicken, ändert sich die URL zu:
https://books.toscrape.com/catalogue/page-2.html
Und mit jeder weiteren Seite werden es mehr:
Mit anderen Worten: Durch programmgesteuertes Erhöhen der Zahl in der URL können wir zu der paginierten Serie navigieren.
Mit diesen Informationen können wir nun unseren Plan aufschreiben:
- Wir werden durch die paginierte Serie navigieren und die URLs aller Bücher sammeln
- Dann können wir eine Anfrage senden, um das HTML jeder einzelnen Buchseite herunterzuladen und die Details zu sammeln, die uns interessieren
- Zum Schluss formatieren wir all diese Informationen in einen DataFrame, den wir direkt verwenden oder in ein anderes Format exportieren können, wenn wir das möchten
Übersetzen wir nun all dies in Code!
2. Unser Projekt einrichten
Erstellen wir ein neues Projektverzeichnis und darin eine Datei book_scraper.py. Dann importieren wir alle unsere Abhängigkeiten am Anfang der Datei.
import requests #pip install requests
from bs4 import BeautifulSoup #pip install beautifulsoup4
import pandas as pd #pip install pandas
Hinweis: Wenn Sie keines dieser Pakete installiert haben, verwenden Sie einfach den pip-Befehl im obigen Codeschnipsel daneben.
Außerdem benötigen wir einen ScraperAPI-Schlüssel. Erstellen Sie einfach ein kostenloses ScraperAPI-Konto, und Sie finden Ihren Schlüssel in Ihrem Dashboard.
Anstatt alle Anfragen von unserem Rechner aus zu senden, senden wir sie über ScraperAPI-Server. Auf diese Weise wechselt ScraperAPI unsere IP-Adresse zwischen den Anfragen und wählt die richtigen HTTP-Header aus, um eine Erfolgsquote von nahezu 100% zu gewährleisten.
Das ist wichtig, denn die meisten Websites würden Ihren Scraper schnell identifizieren und Ihre IP-Adresse sperren, so dass jeglicher Datenverkehr von Ihrem Rechner aus blockiert wird - möglicherweise für immer.
Obwohl es viele Möglichkeiten gibt, dies zu tun, werden wir heute eine ganz einfache verwenden. Kopieren Sie in Ihrem Dashboard den Beispiel-API-Code und fügen Sie ihn in eine Variable namens scraperapi
- aber das Löschen des Wertes innerhalb der url
Parameter:
scraperapi = 'https://api.scraperapi.com?api_key=YOUR_API_KEY&url="
Auf diese Weise können wir scraperapi zu unseren get-Anfragen hinzufügen und es mit der Ziel-URL verketten. Nur um es sauber zu halten.
3. Prüfung unserer Anträge
Als Erstes müssen wir eine wichtige Hypothese testen: Wenn wir die Zahl in https://books.toscrape.com/catalogue/page-2.html
zu einer 1, können wir die Homepage bekommen? Das ist entscheidend, weil es unsere erste Anfrage sein wird.
Wir können dies auf zwei Arten testen:
1. Wir ändern sie direkt in der Adressleiste unseres Browsers (was funktioniert)
2. Senden Sie eine Anfrage über unser Skript (das auch funktioniert)
response = requests.get('https://books.toscrape.com/catalogue/page-1.html')
print(response.status_code)
Es wird ein Statuscode 200 ausgegeben.
Für einen letzten Test fügen wir die ScraperAPI zu dem Gemisch hinzu:
response = requests.get(scraperapi + 'https://books.toscrape.com/catalogue/page-1.html')
Es wird ein Statuscode 200 zurückgegeben. Perfekt!
Um die Zahl in unserer URL zu ändern, müssen wir einen Bereich durch eine range()-Funktion festlegen und dann eine f-Zeichenkette verwenden, um die Variable an der richtigen Stelle in unsere URL-Zeichenkette einzufügen.
for x in range(1, 6):
response = requests.get(scraperapi + f'https://books.toscrape.com/catalogue/page-{x}.html')
Hinweis: Die erste Zahl im Bereich gibt die Anfangszahl an (wir müssen 1 angeben, weil die Zählung standardmäßig bei 0 beginnt), und die zweite die letzte Zahl der Wut - in diesem Fall geht die Wut von 1 bis 6, ohne 6 einzuschließen.
Wir verwenden einen so kurzen Bereich, um unsere Anfrage auf fünf zu beschränken und sicherzustellen, dass sie funktioniert. Führen wir ihn mit folgendem Beispiel aus print()
Anweisung für visuelles Feedback.
print('this is request number ' + str(x) + '. Status code: ' + str(response.status_code))
Ergebnis:
this is request number 1. Status code: 200
this is request number 2. Status code: 200
this is request number 3. Status code: 200
this is request number 4. Status code: 200
this is request number 5. Status code: 200
5. Parsen der HTML-Antwort
Bevor wir ein Element extrahieren können, müssen wir zunächst das zurückgegebene HTML mit BeautifulSoup verarbeiten und in einen Parse-Baum umwandeln.
soup = BeautifulSoup(response.content, 'html.parser')
Auf diese Weise können wir nun HTML-Tags und CSS-Selektoren verwenden, um bestimmte Elemente innerhalb des Parse-Baums auszuwählen. Aber welches Element zuerst? Nun, wenn wir uns die Seite ansehen, befindet sich jedes Buch in einem kartenähnlichen Element.
Unter dieser Prämisse sollten wir in der Lage sein, das richtige Element zu finden, um sie alle in einer einzigen Variablen zu speichern.
Bingo! Jedes Element wird dargestellt als ein <li>
Tag mit einer eindeutigen CSS-Klasse, die wir leicht mit der .find_all()
Methode.
onpage_books = soup.find_all('li', class_='col-xs-6')
Wie bereits erwähnt, hat jede Seite 20 Bücher, also drucken wir die Länge von onpage_books aus, um sicherzustellen, dass wir alle Bücher bekommen.
Wir haben sie!