Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Ruby
Code

Erstellen Ihres ersten Web Scraper, Teil 2

by
Length:LongLanguages:

German (Deutsch) translation by Katharina Nevolina (you can also view the original English article)

In diesem Tutorial erfahren Sie, wie Sie mit Mechanize auf Links klicken, Formulare ausfüllen und Dateien hochladen können. Außerdem erfahren Sie, wie Sie Seitenobjekte mechanisieren und eine Google-Suche automatisieren und ihre Ergebnisse speichern können.

Themen

  • Einzelseite vs. Paginierung
  • Mechanisieren
  • Agent
  • Seite
  • Nokogiri-Methoden
  • Links
  • Klicken
  • Formen

Einzelseite vs. Paginierung

Bisher haben wir einige Zeit damit verbracht, herauszufinden, wie wir mit Nokogiri den Bildschirm einer einzelnen Seite abkratzen können. Dies war eine gute Grundlage, um einen Schritt vorwärts zu gehen und zu lernen, wie Inhalte von mehreren Seiten extrahiert werden.

Schließlich besteht das Problem, das wir lösen möchten, darin, den Inhalt aus mehr als 140 Episoden abzurufen. Dies ist mehr Inhalt, als für eine einzelne Webseite angemessen ist. Wir müssen mit Paginierung arbeiten und herausfinden, wie wir den Inhalten im Kaninchenbau folgen können.

Hier hört Nokogiri auf und ein weiteres nützliches Juwel namens Mechanize kommt ins Spiel.

Mechanisieren

Mechanisieren ist ein weiteres leistungsstarkes Werkzeug, das viele Extras zu bieten hat. Es ermöglicht Ihnen im Wesentlichen, Interaktionen mit Websites zu automatisieren, von denen Sie Inhalte extrahieren müssen. In diesem Sinne erinnert es mich ein wenig an einige Funktionen, die Sie vielleicht aus Tests mit Capybara kennen.

Verstehen Sie mich nicht falsch, das Spielen mit Nokogiri auf einer einzigen Seite ist an sich schon großartig, aber für scharfere Datenextraktionsjobs benötigen wir etwas mehr Leistung. Wir können im Wesentlichen so viele Seiten durchsuchen, wie wir benötigen, und mit ihren Elementen interagieren - menschliches Verhalten imitieren und automatisieren. Ziemlich mächtiges Zeug!

Mit diesem Juwel können Sie Links folgen, Formularfelder ausfüllen und diese Daten übermitteln - selbst der Umgang mit Cookies steht auf dem Tisch. Das heißt, Sie können auch die Anmeldung von Benutzern in privaten Sitzungen imitieren und Inhalte von einer Site abrufen, auf die nur Sie Zugriff haben.

Sie füllen das Login mit Ihren Anmeldeinformationen aus und teilen Mechanize mit, wie sie vorgehen sollen. Da Sie auf Links klicken und Formulare senden können, können Sie mit diesem Werkzeug nur sehr wenig tun. Es hat eine enge Beziehung zu Nokogiri und hängt auch davon ab. Aaron Patterson ist wieder einer der Autoren dieses schönen Juwel.

Instanziieren eines Mechanize Agent

Bevor wir mit der Mechanisierung beginnen können, müssen wir einen Mechanisierungsagenten instanziieren.

some_scraper.rb

Dieser agent wird verwendet, um eine Seite abzurufen, ähnlich wie bei Nokogiri.

some_scraper.rb

Was hier passiert ist, dass der Mechanize-Agent die Podcast-Seite und ihre Cookies erhalten hat.

Seiteninhaltextrahieren

Wir haben jetzt eine Seite, die zur Extraktion bereit ist. Bevor wir dies tun, empfehle ich, dass wir mit der inspect-Methode einen Blick unter die Haube werfen.

some_scraper.rb

Die Ausgabe ist ziemlich substanziell. Überzeugen Sie sich selbst, woraus ein Mechanize::Page-Objekt besteht. Hier sehen Sie alle Attribute für diese Seite.

Für mich ist das ein sehr praktisches Objekt, um die Daten, die Sie extrahieren möchten, aufzuteilen.

Ausgabe

Wenn Sie sich die HTML-Seite selbst ansehen möchten, können Sie den body oder die content-Methoden mit Tags versehen.

some_scraper.rb

Ausgabe

Da dieser Podcast nur eine geringe Anzahl verschiedener Elemente auf der Seite enthält, finden Sie hier die Mechanize::Page, die von github.com zurückgegeben wird. Es gibt eine größere Auswahl an Inhalten. Ich denke, das ist wichtig, um ein Gefühl dafür zu bekommen.

Ausgabe von github.com

Zurück zum Podcast können Sie sich auch Dinge wie Codierungen, den HTTP-Antwortcode, den URI oder die Antwortheader ansehen.

some_scraper.rb

Ausgabe

Es gibt viel mehr Zeug, wenn Sie tiefer graben möchten. Ich werde es dabei belassen.

Nokogiri-Methoden

  • at
  • search

Mechanize verwendet Nokogiri, um Daten von Seiten zu kratzen. Sie können das, was Sie im ersten Artikel über Nokogiri gelernt haben, anwenden und es auch auf Mechanize-Seiten verwenden. Das bedeutet, dass Sie im Allgemeinen Mechanize verwenden, um durch Seiten und Nokogiri-Methoden für Ihre Scraping-Anforderungen zu navigieren.

Wenn Sie beispielsweise ein einzelnes Objekt suchen möchten, können Sie at verwenden, während die search alle Objekte zurückgibt, die mit einem Selektor auf einer bestimmten Seite übereinstimmen. Um dies neu zu formulieren, funktionieren diese Methoden sowohl für Nokogiri-Dokumentobjekte als auch für Seitenobjekte mechanisieren.

some_scraper.rb

Ausgabe

Links

  • links
  • link_with
  • links_with

Wir können auch die gesamte Site nach unseren Wünschen navigieren. Der wahrscheinlich wichtigste Teil von Mechanize ist die Fähigkeit, mit Links spielen zu können. Ansonsten könnte man so ziemlich alleine bei Nokogiri bleiben. Werfen wir einen Blick darauf, was wir zurückerhalten, wenn wir eine Seite nach ihren Links fragen.

some_scraper.rb

Ausgabe

Holy Moly, lass uns das zusammenfassen. Da wir Mechanize nicht angewiesen haben, sich anderswo umzusehen, haben wir nur von dieser ersten Seite an eine Reihe von Links erhalten. Mechanize geht diese Seite in absteigender Reihenfolge durch und gibt Ihnen diese Liste mit Links von oben nach unten zurück. Ich habe ein kleines Bild mit grünen Zeigern auf die verschiedenen Links erstellt, die Sie in der Ausgabe sehen können.

Das zeigt Ihnen übrigens bereits das Endergebnis der Neugestaltung für meinen Podcast. Ich denke, diese Version ist zu Demonstrationszwecken etwas besser. Sie erhalten auch einen Einblick, wie das Endergebnis aussieht und warum ich meine alte Sinatra-Site abkratzen musste.

Bildschirmfoto

Podcast Links

Wie immer können wir auch nur den Text daraus extrahieren.

some_scraper.rb

Ausgabe

Es kann sehr nützlich oder einfach mühsam sein, all diese Links in großen Mengen zu erhalten. Zum Glück haben wir ein paar Werkzeugs, mit denen wir genau das einstellen können, was wir brauchen.

some_scraper.rb

Ausgabe

Boom! Jetzt kommen wir voran! Wir können solche spezifischen Links vergrößern. Wir können Links, die bestimmten Kriterien entsprechen - wie zum Beispiel den Text - mit einer schöneren API wie links_with oder link_with ansprechen. Wenn wir mehrere Fokus-Links haben, können wir eine bestimmte Zahl auf der Seite mit Klammern [] vergrößern.

some_scraper.rb

Wenn Sie nicht nach dem Linktext, sondern nach dem Link selbst suchen, müssen Sie nur eine bestimmte href angeben, um diesen Link zu finden. Mechanisieren steht Ihnen nicht im Weg. Anstelle von text füttern Sie die Methoden mit href.

some_scraper.rb

Wenn Sie nur den ersten Link mit dem gewünschten Text finden möchten, können Sie auch diese Syntax verwenden. Sehr praktisch und etwas lesbarer.

some_scraper.rb

Wie wäre es, diesem Kerl zu folgen und zu sehen, was sich hinter diesem Focus-Link verbirgt? click wir darauf!

Klicken

some_scraper.rb

Dies würde uns eine weitere lange Liste von Links wie zuvor bringen. Sehen Sie, wie einfach es war, .click.links zu kombinieren. Mechanize klickt auf den Link für Sie und folgt der Seite zum neuen Ziel. Da wir auch eine Liste von Links angefordert haben, erhalten wir alle Links, die Mechanize auf dieser neuen Seite finden kann.

Angenommen, ich habe zwei Textlinks desselben Befragten - einen, der auf Tags verweist, und einen auf eine aktuelle Episode - und ich möchte die Links von jeder dieser Seiten erhalten.

some_scraper.rb

Dies würde Ihnen eine Liste von Links für beide Seiten geben. Sie durchlaufen jeden Link für den Befragten, und Mechanize folgt dem angeklickten Link und sammelt die auf der neuen Seite gefundenen Links für Sie. Im Folgenden finden Sie einige Beispiele, in denen Sie Kombinationen vergleichen können, um loszulegen.

some_scraper.rb

Formen

  • submit
  • field_with
  • checkbox_with
  • radiobuttons_with
  • file_uploads

Schauen wir uns die Formulare an!

some_scraper.rb

Ausgabe

Da wir die forms-Methode verwenden, wird ein Array zurückgegeben - auch wenn nur ein Formular an uns zurückgegeben wird. Jetzt, da wir wissen, dass das Formular den Namen "f" hat, können wir das Singular-Versions-form verwenden, um dieses zu verfeinern.

some_scraper.rb

Mit dem form('f') haben wir das bestimmte Formular ausgewählt, mit dem wir arbeiten möchten. Infolgedessen wird kein Array zurückgegeben.

Ausgabe

Wir können auch den Namen des Texteingabefeldes (q) identifizieren.

Wir können es unter diesem Namen anvisieren und seinen Wert wie Ruby-Attribute festlegen. Alles was wir tun müssen, ist ihm einen neuen Wert zu geben. Sie können dem obigen Ausgabebeispiel entnehmen, dass es standardmäßig leer ist.

some_scraper.rb

Ausgabe

Wie Sie oben sehen können, wurde der Wert für das Textfeld in Neue Google-Search geändert. Jetzt müssen wir nur noch das Formular submit und die Ergebnisse von der von Google zurückgegebenen Seite sammeln. Einfacher geht es nicht. Lassen Sie uns diesmal nach etwas anderem suchen!

some_scraper.rb

Hier habe ich den Suchergebnis-Header mit einem CSS-Selektor h3.r identifiziert, seinen text zugeordnet und die Ergebnisse hübsch gedruckt. War das nicht schwer? Das ist sicher ein einfaches Beispiel, aber denken Sie an die unendlichen Möglichkeiten, die Ihnen damit zur Verfügung stehen!

Ausgabe

Mechanize verfügt über verschiedene Eingabefelder, mit denen Sie spielen können. Sie können sogar Dateien hochladen!

  • field_with
  • checkbox_with
  • radiobuttons_with
  • file_uploads

Sie können Optionsfelder und Kontrollkästchen auch anhand ihres Namens identifizieren und mit - Sie haben es erraten - check.

some_scraper.rb

Mit Options-Tags können Benutzer ein Element aus einer Dropdown-Liste auswählen. Wir richten sie erneut nach Namen aus und wählen die gewünschte Optionsnummer aus.

some_scraper.rb

Das Hochladen von Dateien funktioniert ähnlich wie das Eingeben von Text in Formulare, indem es wie Ruby-Attribute festgelegt wird. Sie identifizieren das Upload-Feld und geben dann den Dateipfad (Dateinamen) an, den Sie übertragen möchten. Es klingt komplizierter als es ist. Werfen wir einen Blick!

some_scraper.rb

Abschließende Gedanken

Seht, doch keine Magie! Sie sind jetzt gut gerüstet, um selbst Spaß zu haben. Es gibt sicherlich ein bisschen mehr über Nokogiri und Mechanize zu lernen, aber anstatt zu viel Zeit mit unnötigen Aspekten zu verbringen, spielen Sie damit herum und lesen Sie mehr Dokumentation, wenn Sie auf Probleme stoßen, die über den Rahmen eines Anfängerartikels hinausgehen.

Ich hoffe, Sie können sehen, wie einfach dieses Juwel ist und wie viel Kraft es bietet. Wie wir alle inzwischen aus der Populärkultur wissen, trägt dies auch Verantwortung. Verwenden Sie es innerhalb rechtlicher Rahmenbedingungen und wenn Sie keinen Zugriff auf eine API haben. Sie werden diese Werkzeuge wahrscheinlich nicht häufig verwenden, aber Junge, sie sind nützlich, wenn Sie echte Kratzbedürfnisse vor sich haben.

Wie versprochen werden wir im nächsten Artikel ein Beispiel aus der Praxis behandeln, in dem ich Daten von meiner Podcast-Site kratzen werde. Ich werde es von einer alten Sinatra-Site extrahieren und auf meine neue Middleman-Site übertragen, die für jede Episode .markdown-Dateien verwendet. Wir werden die Daten, Episodennummern, Namen der Befragten, Überschriften, Unterüberschriften usw. extrahieren. Wir sehen uns dort!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.