So erstellen Sie einen URL-Crawler zum Zuordnen einer Website mit Python

Ein einfaches Projekt zum Erlernen der Grundlagen des Web Scraping

Bevor wir beginnen, stellen wir sicher, dass wir verstehen, was Web Scraping ist:

Beim Web-Scraping werden Daten von Websites extrahiert, um sie in einem Format darzustellen, das Benutzer leicht verstehen können.

In diesem Tutorial möchte ich zeigen, wie einfach es ist, einen einfachen URL-Crawler in Python zu erstellen, mit dem Sie Websites zuordnen können. Obwohl dieses Programm relativ einfach ist, bietet es eine gute Einführung in die Grundlagen des Web Scraping und der Automatisierung. Wir werden uns darauf konzentrieren, rekursiv Links von Webseiten zu extrahieren, aber die gleichen Ideen können auf eine Vielzahl anderer Lösungen angewendet werden.

Unser Programm wird folgendermaßen funktionieren:

  1. Besuchen Sie eine Webseite
  2. Kratzen Sie alle eindeutigen URLs auf der Webseite ab und fügen Sie sie einer Warteschlange hinzu
  3. Verarbeiten Sie die URLs rekursiv nacheinander, bis die Warteschlange erschöpft ist
  4. Ergebnisse drucken

Das wichtigste zuerst

Als erstes sollten wir alle erforderlichen Bibliotheken importieren. Wir werden BeautifulSoup, Anfragen und urllib für das Web-Scraping verwenden.

from bs4 import BeautifulSoupimport requestsimport requests.exceptionsfrom urllib.parse import urlsplitfrom urllib.parse import urlparsefrom collections import deque

Als nächstes müssen wir eine URL auswählen, von der aus mit dem Crawlen begonnen werden soll. Sie können zwar jede Webseite mit HTML-Links auswählen, ich empfehle jedoch die Verwendung von ScrapeThisSite. Es ist eine sichere Sandbox, die Sie ohne Probleme crawlen können.

url = “//scrapethissite.com”

Als Nächstes müssen wir ein neues Deque-Objekt erstellen, damit wir neu gefundene Links problemlos hinzufügen und entfernen können, sobald wir sie verarbeitet haben. Füllen Sie die Deque mit Ihrer urlVariablen vor:

# a queue of urls to be crawled nextnew_urls = deque([url])

Wir können dann einen Satz verwenden, um eindeutige URLs zu speichern, sobald sie verarbeitet wurden:

# a set of urls that we have already processed processed_urls = set()

Wir möchten auch lokale (gleiche Domain wie das Ziel), fremde (andere Domain als Ziel) und fehlerhafte URLs verfolgen:

# a set of domains inside the target websitelocal_urls = set()
# a set of domains outside the target websiteforeign_urls = set()
# a set of broken urlsbroken_urls = set()

Zeit zum Kriechen

Mit all dem können wir jetzt beginnen, den eigentlichen Code zum Crawlen der Website zu schreiben.

Wir möchten jede URL in der Warteschlange überprüfen, prüfen, ob sich auf dieser Seite zusätzliche URLs befinden, und jede am Ende der Warteschlange hinzufügen, bis keine mehr übrig sind. Sobald wir mit dem Scraping einer URL fertig sind, entfernen wir sie aus der Warteschlange und fügen sie dem processed_urlsSet zur späteren Verwendung hinzu.

# process urls one by one until we exhaust the queuewhile len(new_urls): # move url from the queue to processed url set url = new_urls.popleft() processed_urls.add(url) # print the current url print(“Processing %s” % url)

Fügen Sie als Nächstes eine Ausnahme hinzu, um fehlerhafte Webseiten abzufangen, und fügen Sie sie dem broken_urlsSet zur späteren Verwendung hinzu:

try: response = requests.get(url)
except(requests.exceptions.MissingSchema, requests.exceptions.ConnectionError, requests.exceptions.InvalidURL, requests.exceptions.InvalidSchema): # add broken urls to it’s own set, then continue broken_urls.add(url) continue

Wir müssen dann die Basis-URL der Webseite abrufen, damit wir lokale und ausländische Adressen leicht unterscheiden können:

# extract base url to resolve relative linksparts = urlsplit(url)base = “{0.netloc}”.format(parts)strip_base = base.replace(“www.”, “”)base_url = “{0.scheme}://{0.netloc}”.format(parts)path = url[:url.rfind(‘/’)+1] if ‘/’ in parts.path else url

Initialisieren Sie BeautifulSoup, um das HTML-Dokument zu verarbeiten:

soup = BeautifulSoup(response.text, “lxml”)

Durchsuchen Sie nun die Webseite nach allen Links und sortieren Sie sie zu ihrem entsprechenden Satz:

for link in soup.find_all(‘a’): # extract link url from the anchor anchor = link.attrs[“href”] if “href” in link.attrs else ‘’
if anchor.startswith(‘/’): local_link = base_url + anchor local_urls.add(local_link) elif strip_base in anchor: local_urls.add(anchor) elif not anchor.startswith(‘http’): local_link = path + anchor local_urls.add(local_link) else: foreign_urls.add(anchor)

Da ich meinen Crawler nur auf lokale Adressen beschränken möchte, füge ich Folgendes hinzu, um unserer Warteschlange neue URLs hinzuzufügen:

for i in local_urls: if not i in new_urls and not i in processed_urls: new_urls.append(i)

Wenn Sie alle URLs crawlen möchten, verwenden Sie:

if not link in new_urls and not link in processed_urls: new_urls.append(link)

Warnung: Die Art und Weise, wie das Programm derzeit funktioniert, das Crawlen fremder URLs wird SEHR lange dauern . Sie könnten möglicherweise Probleme bekommen, wenn Sie Websites ohne Erlaubnis kratzen. Benutzung auf eigene Gefahr!

Hier ist mein ganzer Code:

Und das sollte es sein. Sie haben gerade ein einfaches Tool erstellt, um eine Website zu crawlen und alle gefundenen URLs zuzuordnen!

Abschließend

Fühlen Sie sich frei, auf diesem Code aufzubauen und ihn zu verbessern. Sie können das Programm beispielsweise so ändern, dass Webseiten beim Crawlen nach E-Mail-Adressen oder Telefonnummern durchsucht werden. Sie können die Funktionalität sogar erweitern, indem Sie Befehlszeilenargumente hinzufügen, um Ausgabedateien zu definieren, Suchvorgänge auf die Tiefe zu beschränken und vieles mehr. Erfahren Sie hier, wie Sie Befehlszeilenschnittstellen erstellen, um Argumente zu akzeptieren.

Wenn Sie zusätzliche Empfehlungen, Tipps oder Ressourcen haben, teilen Sie diese bitte in den Kommentaren mit!

Danke fürs Lesen! Wenn Ihnen dieses Tutorial gefallen hat und Sie mehr Inhalte wie diesen wünschen, müssen Sie den folgenden Button zerschlagen. ❤️

Besuchen Sie auch meine Website, Twitter, LinkedIn und Github.