Lerne Coding
Wie du die Robots.txt mit Python parsen kannst?
15.10.2021

Erklärung des Robotparser vom urllib Modul in Python!

Inhaltsverzeichnis
[[TABLE OF CONTENTS]]
access_timeGeschätzte Lesezeit ca. Minuten

Wir betrachten heute den Robotparser des urllib Moduls in Python. Mit diesem kannst du eine Robots.txt Datei in Python parsen. Zuallererst beginnen wir mit einem kleinen Exkurs, was eine Robots.txt Datei ist und wo für sie überhaupt gebraucht wird. Diese ist vor allem im Bereich der Suchmaschinenoptimierung (SEO) interessant!

Exkurs: Was ist die Robots.txt Datei?

Die Robots.txt ist eine Datei, die im Hauptverzeichnis einer Webseite abgelegt wird. Diese gibt Crawlern, zum Beispiel der Suchmaschine DuckDuckGo, Bing und Google, vor, welche Seiten oder Verzeichnisse nicht gecrawlt werden sollen. Dabei kann zwischen verschiedenen Crawler, mittels User Agent, differenziert und zum Beispiel für Bing andere Regeln festgelegt werden als für Google.

Die Robots.txt hat keine Regel die eingehalten werden muss. Jeder Crawler interpretiert die Regeln etwas anders. Es ist also nett, wenn ein Crawler diese beachtet, aber nicht zwingend notwendig. Abgesehen davon gibt es auch Crawler, wie Bots, die Formulare auf Webseiten ausfüllen, denen die Regeln herzlich egal sind.

Da wir aber zu den Guten gehören, sollten wir bei unserem "Python Crawler"-Projekt den Robots.txt Dateien etwas Aufmerksamkeit schenken. Diese können wir mit dem Robotparser umsetzen.

Google hat im "Search Central Guide" auch sehr ausführliche Informationen zum Thema Robots.txt zur Verfügung gestellt, die zeigen, wie Google mit der Interpretation der Datei umgeht.

Den Beitrag von Google findet Ihr unter: https://developers.google.com/search/docs/advanced/robots/intro?hl=de

Was können wir mit dem Robotparsermodul machen?

Mit dem Robotparsermodul können die Robots.txt einer Webseite ausgelesen und interpretiert werden. So prüft man welche Regeln für den eigenen Crawler eine Relevanz haben.

Oder die Regel eines crawl-delay also eine Zeit wie lange bis zum nächsten Crawlen der Webseite gewartet werden soll. Diese ganzen Regeln können für unterschiedliche User-Agents definiert werden. Damit Google und Baidu unterschiedliche Regeln erhalten können, wie sie beim Crawlen verfahren sollen.

Die Robots.txt von HelloCoding ist zum Beispiel relativ einfach gehalten, bis auf ein paar interne Pfade, die nicht standardmäßig gecrawlt werden sollen, um ein Überschreiten des Crawl Limits bei Google zu vermeiden.

User-agent: *
disallow: /send/
disallow: /api/
disallow: /home/
disallow: /backend/
allow: /

Sitemap: https://hellocoding.de/sitemap.xml
Methoden des Robotparser

set_url(url)

In dieser Methode wird die URL definiert unter der die Robots.txt zu finden ist.

read()

Mit dieser Methode fütterst du den Parser mit der Robots.txt Datei, die zuvor mit set_url() definiert wurde.

can_fetch(useragent,url)

Mit can_fetch kannst du prüfen, ob eine Seite einer Webseite abgerufen werden darf. Dabei kannst du auch ein User-Agent definieren, falls deine Anwendung einen eigenen verwendet oder du, zum Beispiel, für den User-Agent von Google prüfen willst.

mtime()

Die Methode gibt dir den letzten Zeitpunkt des Abrufs der Robots.txt aus. Diese ist vor allem in länger laufenden Prozessen interessant, um dort zu gewährleisten, dass die Robots.txt noch aktuell ist.

modified()

Setzt die Zeit, zu der die Robots.txt Datei zum letzten Mal gelesen wurde, auf den aktuellen Zeitpunkt.

crawl_delay(useragent)

Du erhältst von der Methode den Wert des Crawl-delay Parameters aus der eingelesenen Robots.txt für den angegebenen User-Agent zurück. Falls kein Wert für den Crawl-delay vorhanden ist, wird none zurückgegeben.

request_rate(useragent)

Diese Methode gibt einen Named Tuple mit zwei Werten zurück. Diese sind request und seconds oder none falls nicht vorhanden. Dieser Wert kann wieder, je nach User-Agent, unterschiedlich ausfallen.

site_maps()

Die Methode gibt eine Liste aller URLs zurück, die als Sitemap in der Robots.txt definiert wurden.

Beispiel wie du den Robots.txt Parser verwenden kannst in Python!

Nun wollen wir uns anschauen, wie wir den Robots.txt Parser verwenden können.

Als ersten Schritt definieren wir den Link zur Robots.txt von HelloCoding.de, um diese danach mittels read einlesen zu können.

import urllib.robotparser

robotParse = urllib.robotparser.RobotFileParser()

robotParse.set_url("https://hellocoding.de/robots.txt")
robotParse.read()

robotParse.site_maps()
# ['https://hellocoding.de/sitemap.xml']

robotParse.can_fetch('*','https://hellocoding.de/send/docs')
# False

robotParse.can_fetch('Googlebot/2.1 (+http://www.google.com/bot.html)','https://hellocoding.de/blog/')
# True

Im zweiten Schritt können wir uns aus der Robots.txt alle Informationen holen, die wir in unserer Anwendung benötigen würden. Angenommen wir brauchen die Links zu den Sitemaps, um diese später auch noch zu parsen. So können wir uns eine Liste dieser URLs mittels site_maps() holen.

Und im dritten Schritt können wir mittels der can_fetch Methode prüfen, ob wir eine bestimmte Seite abrufen dürfen, entweder mit keinem spezifischen User Agent definiert über das Sternchen (*), oder einem spezifischen, in diesem Fall, der des Google Crawlers (Googlebot/2.1).

Natürlich musst du bei deinem Crawler die Robots.txt theoretisch nicht beachten. Allerdings gehört es vor allem bei Crawlern zu einem guten Ton den Regeln in der Robots.txt Beachtung zu schenken.

Mit dem Robotparser in der Urllib hast du in Python eine Möglichkeit die Robots.txt in deinen Crawler zu implementieren.

Fazit

Wenn du in deinem Python-Webseiten-Crawler die Regeln der Robots.txt beachten willst, ist dieses Modul definitiv das Richtige. Versuche doch einmal einen kleinen Crawler zu schreiben, der alle URLs aus einer Sitemap.xml liest und dann alle Seiten abspeichert. Und vor dem Abrufen prüfst du, ob du die URL lesen darfst!

Bildquelle - Vielen Dank an die Ersteller:innen für dieses Bild
Kommentare zum Artikel

Es sind noch keine Kommentare vorhanden? Sei der/die Erste und verfasse einen Kommentar zum Artikel "Wie du die Robots.txt mit Python parsen kannst?"!

Kommentar schreiben

Vom Autor Empfohlen
close