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

Erstellen Sie Ihren ersten Web Scraper, Teil 1

by
Length:LongLanguages:

German (Deutsch) translation by Alex Grigorovich (you can also view the original English article)

Rubyland hat zwei Juwelen, die in den letzten Jahren die Aufmerksamkeit auf sich gezogen haben: Nokogiri und Mechanize.  Wir geben zu jedem einen Artikel, bevor wir ihn mit einem praktischen Beispiel in die Tat umsetzen.

Themen

  • Web Scraping?
  • Genehmigung
  • Das Problem
  • Nokogiri
  • Extraktion?
  • Seiten
  • API
  • Knoten Navigation

Web Scraping?

Es gibt mehr Begriffe als Web oder Screen Scraping.  Web-Harvesting und Web-Datenextraktion sagen dir sofort, was los ist.  Wir können die Extraktion von Daten von Webseiten automatisieren - und das ist auch nicht so kompliziert.

Mit diesen Tools können Sie das Surfen im Internet imitieren und automatisieren.  Sie schreiben ein Programm, das nur die Art von Daten extrahiert, die Sie interessieren.  Das Targeting spezifischer Daten ist fast so einfach wie die Verwendung von CSS-Selektoren.

Vor ein paar Jahren habe ich einen Online-Video-Kurs abonniert, der eine Million kurze Videos enthält, aber keine Möglichkeit, sie in großen Mengen herunterzuladen.  Ich musste jeden Link alleine durchgehen und das gefürchtete "Speichern als" selbst machen.  Es war eine Art menschliches Web-Scraping - etwas, das wir oft tun müssen, wenn uns das Wissen fehlt, um solche Sachen zu automatisieren.  Der Kurs selbst war in Ordnung, aber ich habe ihre Dienste danach nicht mehr genutzt.  Es war einfach zu langweilig.

Heute würde ich mich nicht so sehr mit solchen Gedanken schmelzenden UX beschäftigen.  Ein Scraper, der das Herunterladen für mich übernehmen würde, würde mich nur ein paar Minuten brauchen, um ihn zusammen zu werfen.  Kein großes Problem!

Lass es mich kurz vor dem Start durchbrechen.  Das Ganze kann in ein paar Schritten zusammengefasst werden. Zuerst holen wir eine Webseite mit den gewünschten Daten, die wir brauchen.  Dann durchsuchen wir diese Seite und identifizieren die Informationen, die wir extrahieren möchten.

Der letzte Schritt besteht darin, diese Bits zu targetieren, sie bei Bedarf in Scheiben zu schneiden und zu entscheiden, wie und wo sie gespeichert werden sollen.  Gut geschriebenes HTML ist oft der Schlüssel, um diesen Prozess einfach und angenehm zu gestalten.  Bei komplizierteren Extraktionen kann es schmerzhaft sein, wenn Sie mit schlecht strukturiertem Markup umgehen müssen.

Was ist mit APIs?  Sehr gute Frage.  Wenn Sie Zugriff auf einen Service mit einer API haben, ist es oft nicht nötig, einen eigenen Scraper zu schreiben.  Dieser Ansatz ist hauptsächlich für Websites, die diese Art von Bequemlichkeit nicht bieten.  Ohne eine API ist dies oft die einzige Möglichkeit, die Extraktion von Informationen von Websites zu automatisieren.

Sie könnten fragen, wie funktioniert dieses Scraping-Ding tatsächlich?  Ohne in das tiefe Ende zu springen, ist die kurze Antwort, indem Baumdatenstrukturen durchquert werden.  Nokogiri erstellt diese Datenstrukturen aus den Dokumenten, die Sie füttern, und lässt Sie interessante Teile für die Extraktion auswählen.  Zum Beispiel ist CSS eine Sprache, die für das Traversieren von Bäumen geschrieben wird, um Baumstrukturdaten zu suchen, und wir können sie für die Datenextraktion verwenden.

Es gibt viele Ansätze und Lösungen zum Spielen.  Rubyland hat zwei Juwelen, die seit einigen Jahren im Rampenlicht stehen.  Viele Leute verlassen sich immer noch auf Nokogiri und Mechanize für HTML-Scraping-Bedürfnisse.  Beide wurden getestet und bewiesen, dass sie einfach zu bedienen sind und gleichzeitig sehr leistungsfähig sind.  Wir werden beide betrachten.  Aber vorher möchte ich einen Moment nehmen, um das Problem anzusprechen, das wir am Ende dieser kurzen Einführungsreihe lösen werden.

Genehmigung

Bevor Sie mit dem Scraping beginnen, stellen Sie sicher, dass Sie die Berechtigung der Websites haben, auf die Sie für die Datenextraktion zugreifen möchten.  Wenn die Website beispielsweise über eine API oder einen RSS-Feed verfügt, ist es möglicherweise nicht nur einfacher, den gewünschten Inhalt zu erhalten, sondern auch die legale Option der Wahl.

Nicht jeder wird es zu schätzen wissen, wenn Sie auf ihren Websites massiv scrapen - verständlicherweise.  Informieren Sie sich über die Seite, die Sie interessiert, und geraten Sie nicht in Schwierigkeiten.  Die Chancen stehen niedrig, dass Sie ernsthaften Schaden anrichten werden, aber das Risiko zu riskieren, ist unwissentlich nicht der richtige Weg.

Das Problem

Ich musste einen neuen Podcast erstellen.  Das Design war nicht da, wo ich es haben wollte, und ich hasste es, neue Beiträge zu veröffentlichen.  Verdammte WYSIWYGs!  Ein bisschen Kontext.  Vor ungefähr zwei Jahren habe ich die erste Version meines Podcasts gebaut.  Die Idee war, mit Sinatra zu spielen und etwas superleichtes zu bauen.  Ich hatte ein paar unerwartete Probleme, seit ich so ziemlich alles maßgeschneidert habe.

Von Rails kommend, war es definitiv eine lehrreiche Reise, die ich zu schätzen weiß, aber ich bedauerte es schnell, keine statische Seite verwendet zu haben, die ich über GitHub-Seiten über GitHub hätte bereitstellen können.  Die Bereitstellung neuer Episoden und deren Pflege fehlte die Einfachheit, nach der ich suchte.  Für eine Weile entschied ich, dass ich größere Fische zum Frittieren hatte und konzentrierte mich stattdessen darauf, neues Podcast-Material zu produzieren.

Im vergangenen Sommer habe ich angefangen ernst zu werden und habe an einer Middleman-Seite gearbeitet, die auf GitHub-Seiten gehostet wird.  Für die zweite Staffel der Show wollte ich etwas frisches.  Ein neues, vereinfachtes Design, Markdown für die Veröffentlichung neuer Folgen und keine Faustkämpfe mit Heroku-Himmel!  Die Sache war, dass ich 139 Episoden herumliegen hatte, die zuerst importiert und konvertiert werden mussten, um mit Middleman zu arbeiten.

Für Beiträge verwendet Middleman .markdown-Dateien, die so genannte Frontmatter für Daten haben, die meine Datenbank im Grunde ersetzt.  Diese Übertragung per Hand ist für 139 Episoden nicht möglich.  Dafür ist Berechnung da.  Ich musste eine Möglichkeit finden, den HTML-Code meiner alten Website zu analysieren, den relevanten Inhalt zu scrappen und in Blogposts zu übertragen, die ich für die Veröffentlichung neuer Podcast-Episoden auf Middleman nutze.

Deshalb werde ich Ihnen in den nächsten drei Artikeln die Werkzeuge vorstellen, die in Rubyland für solche Aufgaben gebräuchlich sind.  Am Ende werden wir auf meine Lösung eingehen, um Ihnen auch etwas Praktisches zu zeigen.

Nokogiri

Auch wenn Sie Ruby / Rails ganz neu sind, sind die Chancen sehr gut, dass Sie bereits von diesem kleinen Juwel gehört haben.  Der Name wird oft fallen gelassen und bleibt leicht bei dir.  Ich bin mir nicht sicher, ob viele wissen, dass Nokogiri japanisch für "sah" ist.

Es ist ein passender Name, sobald Sie verstehen, was das Werkzeug tut.  Der Schöpfer dieses Edelsteins ist der schöne Tenderlove, Aaron PattersonNokogiri konvertiert XML- und HTML-Dokumente in eine Datenstruktur - genauer gesagt in eine Baumdatenstruktur.  Das Tool ist schnell und bietet eine schöne Oberfläche.  Insgesamt ist es eine sehr potente Bibliothek, die sich um eine Vielzahl Ihrer HTML-Scraping-Bedürfnisse kümmert.

Sie können Nokogiri nicht nur zum Parsen von HTML verwenden; XML ist ein faires Spiel. Es gibt Ihnen die Optionen der XML-Pfadsprache und der CSS-Schnittstellen, um die geladenen Dokumente zu durchlaufen.  XML-Pfadsprache oder kurz XPath ist eine Abfragesprache.

Es ermöglicht uns, Knoten aus XML-Dokumenten auszuwählen.  CSS-Selektoren sind eher Anfängern bekannt.  Wie bei Stilen, die Sie schreiben, machen CSS-Selektoren das Targeting auf bestimmte Abschnitte von Seiten, die für die Extraktion interessant sind, denkbar einfach.  Sie müssen nur Nokogiri wissen lassen, wonach Sie suchen, wenn Sie ein bestimmtes Ziel anvisieren.

Seiten

Was wir immer anfangen müssen, ist die aktuelle Seite, an der wir interessiert sind.  Wir geben an, welche Art von Nokogiri-Dokument wir parsen wollen - XML ​​oder HTML zum Beispiel:

some_scraper.rb

Nokogiri:XML und Nokogiri:HTML kann IO-Objekte oder String-Objekte aufnehmen.  Was oben passiert, ist einfach.  Dies öffnet und ruft die angegebene Seite unter Verwendung von open-uri ab und lädt dann seine Struktur, sein XML oder HTML in ein neues Nokogiri-Dokument.  XML ist etwas, mit dem Anfänger sich nicht oft befassen müssen.

Daher würde ich empfehlen, dass wir uns vorerst auf das HTML-Parsing konzentrieren.  Warum open-uri?  Mit diesem Modul aus der Ruby Standard Library können wir die Seite ohne viel Aufwand aufnehmen.  Da IO-Objekte faires Spiel sind, können wir open-uri einfach nutzen.

API

Lassen Sie uns dies mit einem kleinen Beispiel umsetzen: 

at_css

some_podcast_scraper.rb

Was wir hier gemacht haben, stellt alle Schritte dar, die normalerweise mit Web-Scraping verbunden sind - nur auf einer Mikroebene.  Wir entscheiden, welche URL wir benötigen und welche Seite wir holen müssen, und wir laden sie in ein neues Nokogiri-Dokument.  Dann öffnen wir diese Seite und zielen auf einen bestimmten Bereich.

Hier wollte ich nur den Titel der neuesten Episode wissen.  Mit der at_css-Methode und einem CSS-Selektor für h2.post-title konnte ich den Extraktionspunkt gezielt ansteuern.  Mit dieser Methode werden wir dieses einzigartige Element jedoch nur schaben.  Das gibt uns den ganzen Selektor - was die meiste Zeit nicht genau das ist, was wir brauchen.  Daher extrahieren wir nur den inneren Textteil dieses Knotens über die text methode.  Zum Vergleich können Sie die Ausgabe sowohl für die Kopfzeile als auch für den Text unten überprüfen.

Ausgabe

Obwohl dieses Beispiel sehr begrenzte Anwendungen hat, besitzt es alle Zutaten, alle Schritte, die Sie verstehen müssen.  Ich finde es cool, wie einfach das ist.  Weil es aus diesem Beispiel nicht offensichtlich ist, möchte ich darauf hinweisen, wie mächtig dieses Werkzeug sein kann.  Mal sehen, was wir noch mit einer Nokogiri-Schrift machen können.

Beachtung!

Wenn Sie ein Anfänger sind und sich nicht sicher sind, wie Sie den hierfür benötigten HTML-Code ausrichten sollen, sollten Sie nach einer Online-Suche suchen, um herauszufinden, wie Sie den Inhalt von Websites in Ihrem Browser überprüfen können. Im Grunde genommen machen heutzutage alle gängigen Browser diesen Vorgang wirklich einfach.

In Chrome müssen Sie nur mit der rechten Maustaste auf ein Element auf der Website klicken und die Option zum Überprüfen auswählen.  Dies öffnet ein kleines Fenster am unteren Rand Ihres Browsers, das Ihnen etwas wie eine Röntgenaufnahme des DOM der Website zeigt.  Es hat viele weitere Optionen und ich würde empfehlen, einige Zeit bei Google zu verbringen, um sich weiterzubilden.  Das ist eine weise Zeit!

css

Die css-Methode liefert uns nicht nur ein einzelnes Element der Wahl, sondern jedes Element, das den Suchkriterien auf der Seite entspricht.  Ziemlich ordentlich und unkompliziert!

some_scraper.rb

Output

Der einzige kleine Unterschied in diesem Beispiel ist, dass ich zuerst die rohen Header iteriere.  Ich habe auch seinen inneren text mit der textmethode extrahiert.  Nokogiri stoppt automatisch am Ende der Seite und versucht nicht, die Paginierung automatisch zu verfolgen.

Nehmen wir an, wir möchten etwas mehr Informationen haben, sagen wir das Datum und den Untertitel für jede Episode.  Wir können einfach das obige Beispiel erweitern.  Es ist trotzdem eine gute Idee, dies Schritt für Schritt zu machen.  Lassen Sie ein kleines Stück arbeiten und fügen Sie auf dem Weg mehr Komplexität hinzu.

some_scraper.rb

Ausgabe

An diesem Punkt haben wir bereits einige Daten zum Spielen.  Wir können es strukturieren oder schlachten, wie wir es wollen.  Das obige sollte einfach zeigen, was wir auf lesbare Weise haben.  Natürlich können wir tiefer in jeden davon gehen, indem wir reguläre Ausdrücke mit der text methode verwenden.

Wir werden das viel genauer untersuchen, wenn wir das eigentliche Podcast-Problem lösen.  Es wird keine Klasse auf Regexp sein, aber Sie werden mehr davon in Aktion sehen - aber keine Sorgen, nicht so sehr, um Ihr Gehirn zum Bluten zu bringen.

Attribute

Was in diesem Stadium hilfreich sein könnte, ist das Extrahieren des href für die einzelnen Episoden.  Es könnte nicht einfacher sein.

some_scraper.rb

Die wichtigsten Punkte, auf die hier zu achten ist, sind [:href] und podcast_url.  Wenn Sie [:] markieren, können Sie einfach ein Attribut aus dem Zielselektor extrahieren.  Ich habe etwas weiter abstrahiert, aber Sie können klarer sehen, wie es unten funktioniert.

Um eine vollständige und nützliche URL zu erhalten, habe ich die Stammdomäne in einer Variablen gespeichert und die vollständige URL für jede Episode erstellt.

Werfen wir einen kurzen Blick auf die Ausgabe:

Ausgabe

Ordentlich, nicht wahr?  Sie können dasselbe tun, um die Klasse [:class] eines Selektors zu extrahieren.

Wenn dieser Knoten mehr als eine Klasse hat, erhalten Sie eine Liste von allen.

Knoten Navigation

  • parent
  • children
  • previous_sibling
  • next_sibling

Wir sind es gewohnt mit Baumstrukturen in CSS oder sogar jQuery umzugehen.  Es wäre ein Schmerz, wenn Nokogiri keine handliche API anbieten würde, um sich in solchen Bäumen zu bewegen.

some_scraper.rb

Ausgabe

Wie Sie selbst sehen können, ist dies ein ziemlich mächtiger Kram - besonders wenn Sie sehen, was .parent in einem Zug sammeln konnte. Anstatt einen Haufen Knoten von Hand zu definieren, könnten Sie sie im Großhandel sammeln.

Sie können sie sogar für umfangreichere Traversierungen verketten.  Sie können das natürlich so kompliziert nehmen, wie Sie möchten, aber ich würde Sie davor warnen, die Dinge einfach zu halten.  Es kann schnell ein wenig unhandlich und schwer zu verstehen sein. Denken Sie daran: "Halten Sie es einfach, dumm!"

some_scraper.rb

Ausgabe

Abschließende Gedanken

Nokogiri ist keine große Bibliothek, aber es hat viel zu bieten.  Ich empfehle Ihnen, mit dem bisher Gelernten zu spielen und Ihr Wissen durch seine Dokumentation zu erweitern, wenn Sie eine Wand treffen.  Aber mach dich nicht in Schwierigkeiten!

Dieses kleine Intro sollte Sie auf Ihrem Weg zu verstehen, was Sie tun können und wie es funktioniert.  Ich hoffe, du wirst es ein bisschen mehr selbst erkunden und ein bisschen Spaß damit haben.  Wie Sie selbst herausfinden werden, ist es ein reichhaltiges Tool, das weitergibt.

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.