Ok, jetzt können wir etwas Code schreiben!
Öffne zunächst ein Terminalfenster in deiner IDE und führe den folgenden Befehl aus, der BeautifulSoup installiert, eine Bibliothek, die uns hilft, die Daten aus dem HTML zu extrahieren:
> pip install beautifulsoup4
Erstellen Sie anschließend einen Ordner mit dem Namen „products“. Dieser hilft Ihnen dabei, die Scraping-Ergebnisse zu organisieren und in mehreren CSV-Dateien zu speichern.
Erstellen Sie schließlich die Datei „crawler.py“. Hier werden wir unseren gesamten Code und die Crawling-Logik schreiben. Wenn wir fertig sind, können wir die Datei mit dem folgenden Befehl ausführen:
> py crawler.py
Als Nächstes importieren wir die benötigten Bibliotheken und definieren einige globale Variablen:
import requests
from bs4 import BeautifulSoup
import csv
BASE_URL = "https://www.shopetee.com"
SECTION = "/collections/all-collections"
FULL_START_URL = BASE_URL + SECTION
ENDPOINT = "https://api.webscrapingapi.com/v1/"
API_KEY = "API_KEY"
Nun definieren wir den Einstiegspunkt für unseren Crawler:
def crawl(url, filename):
page_body = get_page_source(url, filename)
soup = BeautifulSoup(page_body, 'html.parser')
start_crawling(soup, filename)
crawl(FULL_START_URL, 'etee-page1.txt')
Wir implementieren die Crawl-Funktion, die die HTML-Dokumente über unsere get_page_source-Prozedur extrahiert. Anschließend erstellt sie das BeautifulSoup-Objekt, das unser Parsing vereinfacht, und ruft die start_crawling-Funktion auf, die mit der Navigation auf der Website beginnt.
def get_page_source(url, filename):
params = {
"api_key": API_KEY,
"url": url,
"render_js": '1'
}
page = requests.request("GET", ENDPOINT, params=params)
soup = BeautifulSoup(page.content, 'html.parser')
body = soup.find('body')
file_source = open(filename, mode='w', encoding='utf-8')
file_source.write(str(body))
file_source.close()
return str(body)
Wie bereits erwähnt, nutzt die Funktion `get_page_source` die WebScrapingAPI, um den HTML-Inhalt der Website abzurufen, und schreibt ihn in eine Textdatei im Abschnitt `<body>`, da dieser alle Informationen enthält, die uns interessieren.
Lassen Sie uns nun einen Schritt zurücktreten und prüfen, wie wir unsere Ziele erreichen können. Die Produkte sind auf Seiten organisiert, daher müssen wir wiederholt auf jede Seite zugreifen, um sie alle zu extrahieren.
Das bedeutet, dass unser Crawler einige rekursive Schritte durchläuft, solange Seiten verfügbar sind. Um diese Logik in Code umzusetzen, müssen wir uns ansehen, wie der HTML-Code diese Bedingungen beschreibt.
Wenn Sie zur Entwicklerkonsole zurückkehren, sehen Sie, dass jede Seitenzahl eigentlich ein Link zu einer neuen Seite ist. Da wir uns auf der ersten Seite befinden und keine vorherige Seite vorhanden ist, ist der Pfeil nach links deaktiviert.
Der folgende Algorithmus muss also:
- Auf die Seite zugreifen;
- die Daten extrahieren (dies werden wir im nächsten Schritt implementieren);
- den Paginierungs-Container im HTML-Dokument finden; prüfen, ob der Pfeil „Nächste Seite“ deaktiviert ist, und wenn ja, anhalten; wenn nicht, den neuen Link abrufen und die Crawl-Funktion für die neue Seite aufrufen.
def start_crawling(soup, filename):
extract_products(soup, filename)
pagination = soup.find('ul', {'class': 'pagination-custom'})
next_page = pagination.find_all('li')[-1]
if next_page.has_attr('class'):
if next_page['class'] == ['disabled']:
print("You reached the last page. Stopping the crawler...")
else:
next_page_link = next_page.find('a')['href']
next_page_address = BASE_URL + next_page_link
next_page_index = next_page_link[next_page_link.find('=') + 1]
crawl(next_page_address, f'etee-page{next_page_index}.txt')