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

von Ahad Sheriff

Ein einfaches Projekt zum Erlernen der Grundlagen des Web Scraping

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

Web Scraping ist der Prozess des Extrahierens von Daten von Websites, 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. Während dieses Programm relativ einfach ist, kann es eine großartige Einführung in die Grundlagen des Web Scraping und der Automatisierung bieten. Wir werden uns auf das rekursive Extrahieren von Links von Webseiten konzentrieren, aber die gleichen Ideen können auf eine Vielzahl anderer Lösungen angewendet werden.

Unser Programm wird wie folgt funktionieren:

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

Das Wichtigste zuerst

Das erste, was wir tun sollten, ist alle notwendigen Bibliotheken. Wir werden BeautifulSoup, Requests 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 das Crawlen gestartet werden soll. Während Sie jede Webseite mit HTML-Links auswählen können, empfehle ich die Verwendung von ScrapeThisSite. Es ist eine sichere Sandbox, die Sie kriechen können, ohne in Schwierigkeiten zu geraten.

url = "https://scrapethissite.com"

Als nächstes müssen wir ein neues Deque-Objekt erstellen, damit wir neu gefundene Links einfach hinzufügen und entfernen können, sobald wir mit der Verarbeitung fertig sind. Füllen Sie die Deque mit Ihrer Variablen url vor:

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

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 (dieselbe Domain wie das Ziel), ausländische (andere Domain als das 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 Crawlen

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

Wir möchten uns jede URL in der Warteschlange ansehen, prüfen, ob sich auf dieser Seite zusätzliche URLs befinden, und jede am Ende der Warteschlange hinzufügen, bis keine mehr vorhanden ist. Sobald wir mit dem Scraping einer URL fertig sind, entfernen wir sie aus der Warteschlange und fügen sie zur späteren Verwendung zum processed_urls -Set 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 zur späteren Verwendung zum broken_urls -Set 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 if '/' in parts.path else url

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

soup = BeautifulSoup(response.text, "lxml")

Kratzen Sie nun die Webseite nach allen Links und fügen Sie sie dem entsprechenden Satz hinzu:

for link in soup.find_all('a'): # extract link url from the anchor anchor = link.attrs 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: So wie das Programm derzeit funktioniert, wird das Crawlen fremder URLs SEHR lange dauern. Sie könnten möglicherweise in Schwierigkeiten geraten, wenn Sie Websites ohne Erlaubnis kratzen. Verwendung auf eigene Gefahr!

Beispielausgabe

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, die Suche auf die Tiefe zu beschränken und vieles mehr. Erfahren Sie hier, wie Sie Befehlszeilenschnittstellen erstellen, um Argumente zu akzeptieren.

Write a Comment

Deine E-Mail-Adresse wird nicht veröffentlicht.