A fool with a tool - Scraping Basics

  • 4,820 views
Uploaded on

Reguläre Ausdrücke und XPath als Basis für jegliches Scraping.

Reguläre Ausdrücke und XPath als Basis für jegliches Scraping.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
4,820
On Slideshare
0
From Embeds
0
Number of Embeds
5

Actions

Shares
Downloads
65
Comments
0
Likes
7

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Reguläre Ausdrücke - Scraping Basics A (F)Uhl With A Tool... ...is still a fool!
  • 2. Wer spricht hier? Programmieren (seit 1984)8 Jahre SEO-Agenturen Web-Entwickler (6 Jahre) Linux-Server Admin Perl SEO (seit 2002) PHP SEM Zocken (PS3) Inhouse SEO Markus Uhl FUS RO DAH!!! Condé Nast Verlag SEOdiot VOGUE Death Metal GLAMOUR Bass GQ E-Gitarre
  • 3. Was tun wir hier?Was ihr in 45 Minuten NICHT könnt Was ihr in 45 Minuten könnt Ubot oder ein anderes Reguläre Ausdrücke Tool bedienen verstehen und entwickeln Copy&Paste aus der Präse für Eure Mit XPath beliebige Aufgaben Elemente des DOM- Trees addressieren Auf ein Ergebnis mit zwei Mausklicks hoffen Beliebige Inhalte aus beliebigen Quellen scrapen
  • 4. Reguläre AusdrückeDie Basis für algorithmische Analyse von Texten
  • 5. Reguläre AusdrückeWurden bereits in den 60ern entwickeltBeschreiben, wie eine zu suchende Zeichenketteaufgebaut ist („Pattern Matching“)Ergeben erst mal eine Wahr/Falsch-Aussage (der Textentspricht diesem Muster oder nicht), können aber auchZeichenfolgen extrahieren oder ersetzenWerden in allen gängigen ProgrammiersprachenunterstütztKönnen in vielen Programmen wie Notepad++, ScreamingFrog oder OpenOffice verwendet werden. Nur MS Wordhat natürlich einen komplett eigenen „Dialekt“.Finden auch in der .htaccess von Apache Verwendung(mod_rewrite)Auch Google Analytics unterstützt RegExes in den Filtern
  • 6. GrundregelnReguläre Ausdrücke werden zur Verdeutlichung immer inSchrägstriche gesetzt:/regex/Diese müssen in fortgeschrittenen Programmen wieGoogle Analytics aber oft nicht mit angegeben werdenWenn im Ausdruck selbst ein Schrägstrich vorkommt, mussdieser mit einem Backslash „escaped“ werden:/AC/DC/Auch der Backslash selbst muss escaped werden://Das escapen gilt immer, auch wenn die Schrägstricheaussenrum nicht angegeben werden müssen!Escaped werden müssen auch alle weiterenSonderzeichen, die für die RegEx Bedeutung haben
  • 7. ModifierMit Hilfe angehängter „Modifier“ kann das Verhalten derRegEx beeinflusst werden RegExes sind Case Sensitive. /campixx/ ist nicht das gleiche wie /Campixx/. Mit dem Modifier „i“ wird der Ausdruck aber Case Insensitive: /campixx/i findet dann auch „Campixx“ Reguläre Ausdrücke arbeiten zeilenweise. Mit den Modifiern „s“ und „m“ können mehrzeilige Texte verwendet werden (dazu später mehr) Beim Extrahieren von sich wiederholenden Mustern führt der Modifier „g“ (global) dazu, dass nicht nur der erste gefundene Match zurückgegeben wird, sondern alle
  • 8. Zeichenfolgen und Wildcardskonkrete Buchstabenfolgen:/campixx/i – findet „campixx“ und „Campixx“„.“ - irgendein beliebiges Zeichen außer einemZeilenumbruch:/campi../i – findet „campixx“ und „camping“Achtung: will man einen echten Punkt finden,muss man den wie einen Schrägstrich escapen:/./
  • 9. Meta-Zeichen„w“ – ein Buchstabe, eine Zahl oder ein Unterstrich (WordCharacter). Konkreter: die Buchstaben a bis z, A bisZ, Ziffern von 0 bis 9 sowie der Unterstrich „_“./campwww/i findet „campixx“, „campino“ und „camping“„d“ - eine Zahl (Digit)/campixdddd/i - findet „campix2012“ und„campix2013“„s“ – Leerzeichen und Tabs (Spaces)/campixxs2013/ findet „campixx 2013“, aber nicht„campixx2013“Von jedem Meta-Zeichen w, d und s gibt es das genaueGegenteil in Großbuchstaben: W, D und S – kannmanchmal hilfreich sein, um Ausdrücke kürzer zuschreiben
  • 10. Einfache Wiederholungen„?“ – das letzte Zeichen kommt nicht oder nur einmal vor/campi?x?/ - findet „camp“, „campi“, „campx“ und „campix“Achtung: suchen wir tatsächlich nach einem Fragezeichen,muss es escaped werden: /Hallo?/„*“ – das letzte Zeichen kommt nicht oder mehrmals vor/campix*/ - findet „campi“, „campix“, „campixx“,„campixxxxxxxxxxx“Vorsicht: die Kombination „.*“ ist gierig! Und denke ggf. ansescapen!„+“ – das letzte Zeichen kommt ein- oder mehrmals vor/campix+/ - findet „campix“ oder „campixx“, aber nicht„campi“Du vermutest richtig – escapen nicht vergessen, wenn Du
  • 11. Konkrete Wiederholungen{n} – das Zeichen kommt genau n-mal vor/campix{2}/ - findet „campixx“ und nichtsanderes{n,} – das Zeichen kommt mindestens n-mal vor/campix{2,}/ - findet „campixx“ und„campixxx“, aber nicht „campix“{n,m} – das Zeichen kommt mindestens n-mal,höchstens m-mal vor/d{4,5}sd+/ - findet alle Telefonnummernim Format „0179 3872342“ (Vorwahlen habenimmer zwischen 4 und 5 Stellen?)
  • 12. BackreferencesZum Weiterverarbeiten von Teilen der Matcheswerden Klammern gesetzt/(d{4,5})s(d+)/ trennt Vorwahl undRufnummerDiese extrahierten Werte, auch „Backreferences“genannt, stehen dann in Variablen namens 1, 2 etc.zur Verfügung/(d{4,5})s(d+)/-> Vorwahl in 1, Rufnummer in 2In der .htaccess wird stattdessen $1, $2 etc.verwendetRewriteRule /alt/(.*) /neu/$1 [R=301,L]Vorsicht: diese „/“ stehen für Verzeichnisse, NICHT
  • 13. Alternativen„|“ – Pipe-ZeichenEntweder die linke oder rechte Version/ma|ey|ie?r/i - findet alle möglichen Schreibweisen desNamens „Mayer“, „Maier“, „Meier“, „Meyer“, „Mayr“,„Mair“...Wenn mehr als ein Buchstabe betroffen ist oder sich dieAlternativen schachteln, müssen Klammern drumrumhelfen/(handy|mobil)-?nummer/i – egal, ob im Formular nachder Handy- oder Mobilnummer gefragt wird und egal, ob daein Bindestrich dazwischen ist oder nicht...Beachte: werden die Werte später weiterverwendet,ändern sich evtl. die Nummern der Backreferences:/(handy|mobil)-?nummer:s+/(d{4,5})s(d+)/i
  • 14. Zeichenklassen„[...]“ – erlaubt nur die angegebenen Zeichen/d{4,5}[-/s]d+/ - findet Telefonnummern mit denüblichen Trennzeichen, also egal ob 0179-3872342,0179/3872342 oder 0179 3872342Sind in manchen RegEx-Dialekten wichtig fürUmlaute!w für deutsche Texte ist dann: /[a-zäöüß]/i„^“ – Negierung. Diese Zeichen dürfen nichtvorkommen.Beliebter Trick, um ein gieriges .* zu umgehenBeispiel: <a href=„home.html“ class=„big“>/<a href=„(.*)“>/i – findet home.html“class=“big/<a href=„([^“]+)“>/i – findet nur home.html
  • 15. Zeilenumbrüche„n“Der Zeilenumbruch ist das einzige Zeichen, das nichtvon „.“ gematcht wirdSoll „.“ auch Zeilenumbrüche matchen, muss derModifier „/s“ verwendet werdenWenn also zum Beispiel ein Link im Quellcode überzwei Zeilen geht (etwas, das natürlich keinProgrammierer je machen würde *hüstel*):<a href=„home.html“class=„big“>/(<a.*>/ findet den Link nicht!/(<a.*>/s findet den Link.
  • 16. Zeilenanfang & -ende„^“ – Beginn einer Zeile, „$“ – Ende einer ZeileBeides ist in Verbindung mit mod_rewrite sinnvoll, um spezifische URLsweiterzuleitenRewriteRule ^sinn$ /404.html [R=302,L]Leitet ausschließlich die URL www.domain.de/sinn auf die Nicht-Gefunden-Seite, nicht aber die Seiten unsinn.html, macht-sinn.html oder das Verzeichnis/sinnlosBei mehrzeiligem Text matchen „^“ und „$“ nur genau einmal – auf die ersteZeile. Ist das Muster dort nicht vorhanden, wird die RegEx kein Ergebniszurückliefern, auch wenn das Muster in späteren Zeilen vorkommt. Will manmehrere Zeilen untersuchen, muss man den Modifier „/m“ verwenden.Beispiel: finde alle Absätze im Text, bei denen ich den Punkt am Endevergessen habe:/[^.]$/mErweiterung: eine Zeile kann natürlich auch mit Ausrufe-, Fragezeichen oderDoppelpunkt enden:/[^.?!:]$/mÜberraschung: nicht jedes Sonderzeichen hat eine Bedeutung in RegExes, soz.B. Doppelpunkt und Ausrufezeichen.
  • 17. Word Boundaries„b“ – Wortgrenze. Der Übergang zwischenWortzeichen (w) und Nicht-Wortzeichen (W)Nützlich, wenn man ganze Worte sucht, keineWortbestandteile, zum Beispiel:/berb/ig – findet alle „er“, aber nicht „Bier“ oder„Berg“Merke: Google nutzt b, um Dateinamen zuzerlegen. Ein Unterstrich „_“ ist als w definiert.Deswegen findet /bkeywordb/ nichts in„mein_keyword.jpg“, weil zwischen „mein“ und„keyword“ kein W und damit keine WordBoundary ist!
  • 18. Komplexeres Beispiel/^((+|00)[1-9]d{0,3}|0 ?[1-9]|(00? ?[1-9][d ]*))[d-/ ]*$/Die „perfekte“ Telefonnummern-Regex.Erwischt alle Schreibweisen+43 911 6348-24(030) 86402357089 43590450 22 56 / 4 35 90 450030-795-463872Hausaufgabe: so modifizieren, dass man möglichstgleich Ländervorwahl (falls vorhanden), Vorwahl undRufnummer in 1, 2 und 3 hat.
  • 19. ErsetzenGrundform der Syntax, zum Beispiel in PERL:s/dies/das/Für andere Programme und Sprachen bitteHandbuch/Google konsultierenHier machen die Backreferences besondersSinn. Beispiel: ich habe eine Liste von Namen.(„Vorname Nachname“). Möchte ich stattdesseneine telefonbuchartige Liste („Nachname,Vorname“):s/(w+)s(w+)/2, 1/g
  • 20. Massen-ErsetzungenPraxis-Beispiel: ich habe in einem Verzeichnis500 Textdateien über Vogue liegen. Konventionfür die Schreibweise ist VOGUE inGroßbuchstaben und außerdem sind Vertipperwie Vouge oder Voque drin. Wie korrigiere ichalle Texte?Lösung: PERL auf der Kommandozeileperl –p –i –e„s/bvou?g|qu?eb/VOGUE/ig“ *.txt(Merkhilfe: „Perl-Kuchen“ – Perl-Pie – Perl –p –i
  • 21. ZusammenfassungMit regulären Ausdrücken kann jedes beliebigeZeichenmuster in Texten gefunden und extrahiert werden.Bedenke: Websites bzw. deren Quellcode sind nichtsanderes als Texte!RegExes sind daher die Grundlage für jegliches Scrapingvon Informationen aus einer WebseiteDie Ausdrücke können unter Umständen sehr komplexwerden – aber Übung macht den Meister!Für ein gewünschtes Zeichenmuster gibt es oft nicht nur„die eine“ richtige Lösung, sondern unterschiedliche WegeÜber Google findet man sehr viele erprobte Standard-RegExes, z.B. für Telefonnummern, Email-Adressen, URLsWenn Deine RegEx keine Antwort findet, überdenke dieFrage!
  • 22. Buchtipp„Reguläre Ausdrücke“http://amzn.to/XAoqAg
  • 23. Tipp: RegExpTesterPlugin / Applikation für Google Chrome
  • 24. Online RegExTesterEinfach nach „regex tester“ googeln – es gibtsie wie Sand am Meer. Keiner sticht besondershervor, keiner ist besonders schlecht.
  • 25. XPathRoutenplaner für den DOM-Tree
  • 26. XML Path Language XPath Abfragesprache, um gezielt Elemente eines XML-Dokuments zu addressieren Beschreibt bei HTML-Dateien somit den Pfad innerhalb des DOM-Trees, um zu einem bestimmten Tag zu gelangen Grundlage weiterer Standards wie XSLT oder XQuery Unterstützt auch Reguläre Ausdrücke
  • 27. XPath BasicsXPath-Ausdrücke sind wie URLs aufgebautz.B. /html/title für den <title> oder /html/body/h1 fürdie erste H1-ÜberschriftIn den meisten Fällen verwendet man aber die Such-Syntax, wobei mit // (= der oberste Knoten) begonnenwirdz.B. //title statt /html/title oder //h1 statt /html/body/h1Mehrere Elemente auswählenz.B. //* für alle Elemente oder //tr für alle Reihen einerTabelleMöchte man ein bestimmtes Element, wird diegewünschte Nummer des Elements in eckigenKlammern angegebenz.B. //h2[2] für die zweite H2-Überschrift
  • 28. XPath, Attribute und RegExesGezielt nach Attributen der Tags suchenz.B. //@class für alle Elemente, die ein „class=...“ besitzen, egal obdas ein div, eine table, ein img oder sonst was ist. Eselsbrücke:@ttribut!Nur Elemente, dessen Attribute bestimmte Werte habenz.B. //*[@style=‚display:none‘] für alle versteckten Elementez.B. //a[@rel=‚nofollow‘]/@href für alle per nofollow verlinkten URLsLesart ist einfacher von hinten: gib mir alle @ttribute namens hrefvon allen Anchor-Tags, dessen @ttribut namens „rel“ den Wert„nofollow“ hatNur Elemente, dessen Attributwerte mit einem bestimmten Textbeginnenz.B. //div[starts-with(@class, „heading“)] für alle div, deren class mit„heading“ starten, also class=„heading1“, class=„heading2“ etc.Nur Elemente, die bestimmte Worte im Text besitzenz.B. //h2[re:test(., ‘Kapitel|Abschnitt, i)] für alle H2-Überschriften, indenen die Worte „Kapitel“ oder „Abschnitt“ vorkommen.„Kapitel|Abschnitt“ ist dabei der reguläre Ausdruck und kann allesbeinhalten, was wir im vorigen Kapitel gelernt haben (ohne dieeinschließenden Schrägstriche!). Das anschließende „i“ ist der
  • 29. Nicht nur für Dummies: Firebug&ChromeFirefox: gewünschten Text markieren -> rechteMaustaste -> Element mit Firebug untersuchen -> dort rechte Maustaste auf Auswahl -> XPathkopierenChrome: gewünschten Text markieren -> rechteMaustaste -> Element untersuchen -> rechteMaustaste auf Auswahl -> Copy XPathAber Vorsicht! Beide verwenden numerierteAngaben, z.B./html/body/div[3]/div[3]/div[4]/p[21]. Funktioniertüber mehrere Seiten hinweg also nur dann, wenndie Struktur wirklich immer gleich ist. Kommt beieiner anderen Seite ein Abschnitt dazu oder fehlt,stimmen diese Nummern nicht mehr!
  • 30. XPath-ReferenzenBücher sind anders als bei den Regulären Ausdrücken leiderimmer für Programmierer von XSLT und XQuery Anwendungenausgelegt. XPath ist da immer nur Nebensache unddementsprechend schlecht dokumentiert.Passable Adressen: http://manual.calibre-ebook.com/xpath.htmlund http://hbraemer.de/XQuery/tutorial/xpath/index.jsp
  • 31. Scraping ToolsWie komme ich an den Inhalt von Websites?
  • 32. Scraping EhrenkodexVermeide DOS-Verhalten!100 Threads gleichzeitig auf einer Website sind einDenial-Of-Service-Angriff.Teste oft – scrape einmal!Mach immer 10-15 Stichproben und prüfe, ob wirklichdas rauskommt, was Du willst, bevor Du auf eineWebsite losgehst.Rechne mit Abbrüchen!Merke Dir abgearbeitete URLs. Bricht das Scrapingab, fang nicht einfach wieder von vorne an.Scrape. In. Häppchen.Geh bei großen Websites Unterverzeichnis fürUnterverzeichnis durch, um Abbrüche zu minimieren.
  • 33. Tu‘s niemals„ohne“!Wann immer Du automatisiert Websitesabfragst, benutze IMMER einen Proxy!Wechsle am besten die Proxies alle X Minuten.
  • 34. ScrapeboxDer Name ist NICHT Programm!Hat bezüglich Scraping nur einen einzigenAnwendungszweck: URLs aus den Google-SERPs zu ziehen, macht das aber dafürperfekt
  • 35. Article Wizard von PascalLandauScraping ist im Beta-Stadium, aber schon sehr robust undzuverlässig.Anleitung: http://bit.ly/YlweS9Kann neben RegExes auch XPATH.Empfehlenswert bis zu einigen tausend URLs.
  • 36. UbotEher ein Automatisierungstool, um Aufgaben durchzuführen.Für einfache Scrapes von Tabellen oder ähnlichen Strukturenaber ausreichend.
  • 37. Eierlegende Wollmilchsau:Outwit Hub ProIch habe noch NIE ein schlechter dokumentiertes Stück Softwaregesehen!Dennoch mit Abstand mächtigstes Scraping-Werkzeug, das mansich out of the box kaufen kann (50$). Dank voller AJAX-Unterstützung und vieler kleiner Spezialfeatures in dieser Disziplinsogar deutlich mächtiger als Ubot. Verwendet eigene Marker-Logik, kann aber natürlich auch RegExes. Empfehlenswert bis zu
  • 38. Für Hardcore-Scrapes: wgetwget --recursive --no-clobber --html-extension --domains vogue.de --no-parent www.vogue.de/mode/mode-trends/Speichert den Quelltext aller Seiten entsprechend ihrer URL-Struktur als Datei auf die Festplatte.Praxistipp: verwende immer die Option „html-extension“, auch wenn die Seiten eigentlich ohneEndung ausgeliefert werden. Sonst wird wget scheitern, wenn es versucht,domain.de/ordner/seite zu schreiben, nachdem es schon domain.de/ordner als datei und nichtals Ordner angelegt hat. Vorteile Sehr robust: saugt sogar de.wikipedia.org komplett, wenn der Plattenspeicher reicht Unattended: kann mit Hilfe von „screen“ auf einer Linux-Kiste laufen und laufen und laufen und laufen Nachteile Seiten werden nur gespeichert. RegEx-Matching muss in einem späteren Schritt (PERL?) erfolgen. Kann nur statisches HTML, kein AJAX-Gedöns – sieht damit aber auch nur das, was Google sieht Single Threaded: es wird nur immer eine einzige Anfrage gleichzeitig gestartet, daher langsam
  • 39. AnwendungsbeispieleWas kann ich alles scrapen und wozu?
  • 40. Ist alles verpixelt?Google Analytics, IVW, AdSense, AdServer...Bestes Tool hierfür: Custom Filter in ScreamingFrog
  • 41. Sind meine Inhalte vertaggt?Redakteure „vergessen“ gerne mal, Artikel zu vertaggenBestes Tool: je nach Aufbau des Quellcodes entweder ArticleWizard oder Outwit Hub Pro
  • 42. Graphen in Zahlen umwandelnEs nervt, wenn jemand tolle Kurven zeigt, aber die Daten dazuverschweigt.
  • 43. Wikipedia-DatenSuper Gastartikel dazu von Pascal Landau:http://www.seokai.com/html-scraping-article-spinning-praxisbeispiel/
  • 44. Wie ranken meineSeitentypen?Tipp: bau in den Quellcode HTML-Kommentare ein, inder Du den Seitentyp, das verwendete Template, dieView oder sonstige Kriterien ausgibst. Scrape dieseund setze sie über SVERWEISE (siehe Campixx-Vortrag 2012) in Beziehung zu Platzierungen oderTraffic. Rankt irgendein Seitentyp auffallend häufigeroder schlechter? Warum?
  • 45. wdf*idf en masseScrape doch einfach mal alle wdf*idf-Werte aller Artikel einesVerzeichnisses. Was man damit anstellen kann? SieheSEOdioten-Vortrag auf der Campixx 2014... ;o)
  • 46. Letzte WorteA (F)Uhl with a tool......still a fool?