Scraping einer dynamischen Website mit Python und Selenium.
Einführung
Vor einiger Zeit erhielt ich eine Aufgabe, bei der ich Daten von einer spanischen Website für Hotelbuchungen sammeln musste. Wir haben ein paar Möglichkeiten, wenn wir auf diese Art von Aufgaben stoßen, Schöne Suppe, Scrapy und Selen. Beautiful Soup funktioniert nicht gut mit dynamischen Websites, und ich bevorzuge die Funktionsweise von Scrapy-Skripten nicht. Im Gegensatz zu Scrapy und anderen Methoden, bei denen Sie sofort mit dem Setzen von Links beginnen, müssen Sie sich bei Selenium zunächst einen Webdriver für den Browser besorgen, den Sie für die Aufgabe verwenden möchten.
Einrichten des Systems für das Projekt
Der wichtigste Schritt, bevor wir ein Projekt initiieren, ist die Vorbereitung Ihres Systems auf das Projekt. Hier sind die Schritte, die für die Projekteinrichtung zu befolgen sind:
- Python – Sie können Python hier herunterladen . Stellen Sie außerdem sicher, dass Sie bei der Installation Python zum Pfad hinzufügen.
- Erstellen Sie eine virtuelle Umgebung in Ihrem Projektverzeichnis. Sie können eine virtuelle Umgebung mit erstellen
python -m venv [name you want to give to your environment]. - Aktivieren Sie Ihre virtuelle Umgebung. Ich gehe davon aus, dass Sie sich jetzt im Projektverzeichnis befinden und
[environment name]\Scripts\activateIhre virtuelle Umgebung aktivieren werden. - In dieser Umgebung installieren Sie nun Selenium.
pip install selenium==<required version>installiert Ihre benötigte Version von Selenium. Ich habe Version 3 für das Projekt verwendet. - Besorgen Sie sich je nach verwendeter Chrome-Version einen Chrome-Treiber. Sie können Ihren Treiber von hier erhalten .
Extrahierte Daten werden in das „Data“-Verzeichnis verschoben, und der heruntergeladene Treiber wird in das „Driver“-Verzeichnis verschoben.
Jetzt erstellen Sie im Hauptverzeichnis eine Python-Datei, in der Sie das Skript schreiben, um die Daten von der Website zu entfernen.
Wir beginnen mit dem Importieren der erforderlichen Bibliotheken:
Um das Skript zu starten, erstellen wir zunächst ein Treiberobjekt, indem wir selenium.webdriverFolgendes verwenden:
driver = webdriver.Chrome(executable_path ='data/chromedriver.exe')
Die Website, von der wir die Daten sammeln möchten, ist rentalia und kann unter dieser Adresse gefunden werden.https://es.rentalia.com/”
Wir lassen den Treiber zuerst mit dem Befehl auf die Website zugreifendriver.get('https://es.rentalia.com/')
Sobald sich der Treiber auf der Website befindet, kann er auf alle HTML-Elemente zugreifen, die auf der Webseite vorhanden sind, auf der er sich befindet. Sie können auf diesen Link verweisen, um mehr über die Funktionen zu erfahren, mit denen wir auf die auf der Webseite vorhandenen Elemente zugreifen können.https://iqss.github.io/dss-webscrape/finding-web-elements.html“.
Sie sollten jetzt mit der Elementauswahlfunktion in Selenium Webdriver vertraut sein, und der nächste Schritt besteht darin, die Referenzen der Elemente zu erhalten, von denen Sie Ihre Daten erhalten möchten. Dazu müssen Sie nur die Entwickleroptionen in Ihrem Browser öffnen, Sie können einfach auf das Element drücken F12oder mit der rechten Maustaste auf das Element klicken, das Sie auswählen möchten, und Sie werden eine Option zum Überprüfen finden, wenn Sie darauf klicken, auf die Sie zum HTML-Code dafür weitergeleitet werden. Aus diesem Code können Sie den Klassennamen, HTML, ID oder den X-Pfad abrufen. Der X-Pfad kann im Menü abgerufen werden, das beim Klicken auf das Code-HTML-Element angezeigt wird.
So erhalten Sie den X-Pfad:
Beginnend mit dem Prozess:
Der erste und wichtigste Punkt ist, die Website in dem Browser zu öffnen, mit dem Sie Ihren Webdriver arbeiten lassen, und mit dem Beobachten von Prozessen zu beginnen.
Beispielsweise gibt es eine Schaltfläche zum Akzeptieren von Cookies, sobald die Seite geladen wird. Sie können nur dann mit dem darin enthaltenen Inhalt interagieren, wenn Sie auf diese Schaltfläche geklickt haben.
Sobald Sie damit fertig sind, müssen Sie die Eingaben ausfüllen, um die Ergebnisse für den Bereich zu erhalten, für den Sie Daten benötigen. Die Ergebnisseite hätte eine Liste von Hotels mit Informationen zu den Zimmern wie Preis pro Nacht, Lage, eine kurze Beschreibung usw. Eine Sache, die auf dieser Seite nicht vorhanden ist, ist die Kontaktnummer, die Sie verwenden können, um sich nach dem Zimmer zu erkundigen. Wir müssen also auf die Detailseite jedes Hotelzimmers gehen, um die Nummer zu erhalten.
Ich habe die Erstellung des Skripts in folgende Schritte unterteilt:
- Zugriff auf die Schaltfläche zum Akzeptieren der Bedingungen, um zur Webseite zu gelangen.
#clicking the accepting button
cookies_btn = driver.find_element('xpath', '//*[@id="didomi-host"]/div/div/div/div//div[2]/button[2]')
cookies_btn.click()
# we used xpath to access the element and once we get the object made for the element we can click simply by adding click() method.
# inputing the locations from the given list
input_field.send_keys(loc)
ActionChains(driver).send_keys(Keys.DOWN).send_keys(Keys.ENTER).perform()
# we replicated the interaction we make to input and submit the query in the input bar using action chains
Um die Daten für jede Site zu erhalten, habe ich eine Schleife in eine Schreibanweisung eingefügt, um eine Tabelle nur mit Überschriften in Bezug auf die Variablen zu generieren, die wir haben, und dann, wenn die Schleife fortgesetzt wird, würde der Code Zeilen mit Daten aus Platzhaltern füllen, die wir definiert und für die Extraktion verwendet haben. Es gab noch ein paar Dinge, die ich hinzugefügt habe, damit es bei der Datenerfassung gut und effizient funktioniert, den fertigen Code finden Sie hier . Zum Beispiel habe ich das Skript so erstellt, dass es Eingaben des Benutzers als Argumente akzeptiert, Sie erhalten alle erforderlichen Informationen in diesem Repository. Aber bevor Sie Code von dort erhalten, möchte ich, dass Sie dies selbst implementieren.
Außerdem gibt es keine Standardregel, um die Daten in einer CSV-Datei abzurufen, also tun Sie, was Sie für interessant halten.
Ich hoffe, das war hilfreich!

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































