AA_razor_ctr_sxc_839248.jpg

© Ctr, sxc.hu

Webseiten filtern mit Bordmitteln

Messerscharf analysiert

Die Mühe beim Erstellen eines kleinen Skripts zahlt sich über die Zeit mehrfach aus, wenn die Ergebnisse einer Websuche dafür viel übersichtlicher ausfallen und außerdem vorsortiert erscheinen.

Viele Jobbörsen erlauben spezifische Abfragen, wie zum Beispiel die Angabe von Ort und Beruf als Filter und das Ordnen der Ergebnisse nach bestimmten Kriterien. Allerdings liefert eine solche Abfrage nicht selten Ergebnisse, die nutzlos sind und nicht wirklich einer spezifischen Suche entsprechen.

Oft tauchen sogenannte Premium-Angebote an erster Stelle auf, und viele der darauf folgenden Stellenangebote stammen von Zeitarbeitsunternehmen oder Arbeitsvermittlern oder sind aus einem anderen Grund wertlos für die Suche nach einer interessanten Tätigkeit. Anhand der Stellenbörse von Meinestadt.de zeigen wir, wie Sie Stellenangebote gezielt filtern und Einträge deutlich markieren.

Nachgefragt

Abbildung 1 zeigt eine typische Abfrage, die einen bestimmten Beruf und Ort berücksichtigt und die Ergebnisse nach Abstand zum Ort geordnet anzeigt. Die Felder in der Eingabemaske der Webseite nehmen die dafür vorgesehenen Daten auf. Gleich an erster Stelle sehen Sie zum Beispiel gleich drei "Premium"-Stellenangebote, die nur deshalb oben stehen, weil der Kunde dafür zahlt – der spezifischen Suche entsprechen sie aber oft nicht.

Abbildung 1: Aus einer unübersichtlichen Liste von Einträgen entsteht mit ein paar einfachen Hilfsmitteln eine schlanke Liste mit eindeutigen Einträgen.

Um das Ergebnis zu modifizieren, gilt es als erstes herauszufinden, woher die Daten kommen. Die URL der Abfrage sehen Sie in der Adresszeile des Browsers. Listing 1 zeigt die im Beispiel verwendete. Dort sehen Sie hinter dem dritten Schrägstrich die Ortsangabe bad-sassendorf, dahinter mit jobwrds=Sachbearbeiter die Berufsbezeichnung und hinter orderby= die Angabe km für das Sortieren nach Entfernung vom Ort.

Listing 1

http://jobs.meinestadt.de/bad-sassendorf/suche?jobwrds=Sachbearbeiter&orderBy=km

Der Quelltext von HTML-Dateien liest sich mit etwas Übung ebenfalls ganz einfach: Die überwiegende Menge der Informationen liegt als Text vor, und durch einfache HTML-Tags erkennen Sie Bestandteile wie Überschrift, Absatz oder andere Elemente einer Webseite. Links bestehen in der Regel aus einem öffnenden <a ...> und einem schließenden </a>. Das Attribut href innerhalb des Tags nimmt dann die URL für den Link auf. Innerhalb des Tags steht der Text, den Besucher einer Webseite im Browser als Linktext sehen.

Um mit Grep die Online-Abfrage nach Stellenangeboten zu filtern, ist es erforderlich, denn Quelltext an das Filterprogramm zu übergeben. Dazu nutzen Sie das Kommandozeilen-Tool Wget: Über dessen Option -O - schreiben Sie den Inhalt einer URL auf die Standardausgabe. Mit diesem Wissen fragen Sie mithilfe von Wget ganz einfach die Stellenangebote in Dortmund für den Beruf des Sachbearbeiters nach Entfernung geordnet ab und schreiben das Ergebnis auf die Standardausgabe, um dieses weiter zu verarbeiten (Listing 2).

Listing 2

wget -O - 'http://jobs.meinestadt.de/dortmund/suche?jobwrds=Sachbearbeiter&orderBy=km'

Diese URL ermitteln Sie, indem Sie die Werte in der Stellenbörse in die dafür vorgesehenen Felder eingeben und sich die Ergebnisse dann nach Entfernung geordnet ansehen. Geben Sie probeweise den Befehl in eine Shell ein, um zu sehen, wie Wget den Quelltext auf die Standardausgabe schreibt. Wichtig dabei: Setzen Sie die URL in Hochkommas, damit die Shell die komplette URL als ein Wort interpretiert und dem Tool entsprechend übergibt.

Nach dem der erste Schritt getan ist, gehen Sie daran, die einzelnen Stellenangebote aus dem Quelltext zu filtern. Wenn Sie sich den Quelltext näher anschauen, sehen Sie, dass Links auf Standard-Stellenangebote in einer ganz bestimmten Form auftreten – Listing 3 zeigt ein Beispiel. Die URL des Stellenangebots beginnt also mit http und endet mit einer Zeichenkette in Form von id=12345678. Listing 4 demonstriert eine entsprechende Abfrage mit Grep.

Listing 3

<a href="http://jobs.meinestadt.de/dortmund/standard?id=13887688">Sachbearbeiter/in Rechnungswesen Standort: Dortmund</a>

Listing 4

grep -Eo 'http://jobs.meinestadt.de/[a-z\-]+/standard\?id=[0-9]+'

Da Sie einen regulären Ausdruck an den Filter übergeben, setzen Sie die Option -E zusammen mit der Option -o, um ausschließlich das reine Ergebnis zu erhalten. Nun gilt es, die Bausteine zusammenzusetzen: Öffnen Sie ein Shell und geben die Zeile aus Listing 5 ein. Haben Sie alles richtig gemacht, erhalten Sie eine ähnliche Ausgabe wie dort.

Listing 5

$ wget -O - 'http://jobs.meinestadt.de/dortmund/suche?jobwrds=Sachbearbeiter&orderBy=km' | grep -Eo 'http://jobs.meinestadt.de/[a-z\-]+/standard\?id=[0-9]+'
http://jobs.meinestadt.de/dortmund/standard?id=14023970
http://jobs.meinestadt.de/dortmund/standard?id=11337961
http://jobs.meinestadt.de/dortmund/standard?id=13449829

Wenn Sie nun noch einmal die Ergebnisse im Browser betrachten, dann finden Sie unter den Stellenangeboten einen Bereich, der etwa zur Navigation durch die Seiten des Ergebnisses dient. Die Ziffern enthalten Links auf eventuelle Folgeseiten. Im Grunde genommen verbirgt sich dahinter dieselbe URL wie in der ersten Abfrage, nur mit dem Zusatz &start=Zahl. Hier gilt es, den höchsten Wert zu ermitteln.

Das erledigt der Befehl aus Listing 6. Er filtert zuerst alle Zeilen mit start=Zahl über Grep heraus. Durch den anschließenden Sed-Befehl schneiden Sie den String start= weg, weil nur die Zahl dahinter interessiert. Die übrig gebliebenen Zahlenwerte sortiert die Shell über den Befehl sort -n in numerischer Reihenfolge. Mit tail -n 1 schneiden Sie den höchsten Wert heraus.

Listing 6

wget -O - 'http://jobs.meinestadt.de/dortmund/suche?iwc=1&jobwrds=Sachbearbeiter&orderBy=km' | grep -Eo 'start=[0-9]+' | sed 's/start=//' | sort -n | tail -n 1

Nun haben Sie alle Grundlagen, um ein kleines Skript zu erstellen, das vollständig automatisiert die Stellenangebote filtert. Es besteht insgesamt aus drei Dateien, wobei eine Datei einfach nur unerwünschte Ausdrücke in Stellenangeboten enthält. Diese heißt im Beispiel schwarzeListe, und darin finden sich die Ausdrücke aus Listing 7. Diese Liste dient im Skript für das Tool Grep als Grundlage, um Stellenangebote nach diesen Ausdrücken auszusortieren.

Listing 7

Vermittlung von Arbeitskräften
Arbeitsvermittler
Arbeitsvermittlung
Personalvermittlung
Zeitarbeit
Überlassung von Arbeitskräften

In dem kleinen Skript benötigen Sie drei Integer-Werte, die sie jeweils mit declare -i Variable initialisieren. Der Variablen runner weisen Sie gleich den Wert 11 zu, da Sie diesen dazu benutzen werden, um Seite 2 der Suchergebnisse durchsuchen zu lassen. Anschließend gibt es drei Variablen, die Sie sofort mit Werten belegen, um die ersten zwei für die Zusammenstellung der URL zu benutzen. Die dritte dient dazu, eine eigene HTML-Datei mit Stellenangeboten zu erstellen, womit Sie dann auch sofort beginnen.

Die Anweisung ab Zeile 12 in Listing 8 erstellt die Datei Stellenangebote.html und schreibt die ersten HTML-Tags hinein. Das geschieht mit einem HERE-Dokument, welches das Skript mittels Cat in die Datei schreibt (Zeile 13 bis 19). Anschließend ermittelt das Skript, wie viele Seiten das Ergebnis der Abfrage bei Meinestadt.de hat (Zeile 21).

Die gesamte Anweisung steht in Klammern, um die Ausgabe in der Variablen zahl abzuspeichern. Während der Laufzeit braucht das Programm einen Zwischenspeicher – den legt das Skript mit dem Befehl in Zeile 23 an.

Listing 8

#!/bin/bash
declare -i zahl
declare -i runner
declare -i nm
runner=11
# Hier kann man was ändern
suchwort=Sachbearbeiter
stadt=dortmund
datei=Stellenangebote.html
cat > $datei <<EOF
<html>
<head>
<title>Stellenangebote</title>
</head>
<body style="margin:40px;font-family:sans-serif">
EOF
# Hier wird ermittelt, bis wohin der Durchlauf erfolgen soll
zahl=$(wget -O - 'http://jobs.meinestadt.de/'$stadt'/suche?iwc=1&jobwrds='$suchwort'&orderBy=km' | grep -Eo 'start=[0-9]+' | sed 's/start=//' | sort -n | tail -n 1)
echo > zwischenspeicher
wget -O - 'http://jobs.meinestadt.de/'$stadt'/suche?iwc=1&jobwrds='$suchwort'&orderBy=km' | for x in $(grep -Eo 'http://jobs.meinestadt.de/[a-z\-]+/standard\?id=[0-9]+'); do
                wget -O zwischenspeicher $x;
                b=$(grep -Eo -f schwarzeListe zwischenspeicher);
                nm=$(grep -n 'mt-jobdetail-title' zwischenspeicher | grep -Eo '[0-9]+');nm=nm+1;
                echo -e '<p><a href="'$x'" target="_blank">'$(sed -n $nm'p' zwischenspeicher)'</a><br>\n'$b'</p>' >> ${datei}; echo > zwischenspeicher;
                done
while test $runner -le $zahl # hier entweder $zahl oder eine buchstäbliche Zahl einsetzen.
        do
                wget -O - 'http://jobs.meinestadt.de/'$stadt'/suche?iwc=1&jobwrds='$suchwort'&orderBy=km&start='$runner | \
                for x in $(grep -Eo 'http://jobs.meinestadt.de/[a-z\-]+/standard\?id=[0-9]+');
                do
                echo $x
                wget -O zwischenspeicher $x;
                b=$(grep -Eo -f schwarzeListe zwischenspeicher);
                nm=$(grep -n 'mt-jobdetail-title' zwischenspeicher | grep -Eo '[0-9]+');
                nm=nm+1;
                echo '<p><a href="'$x'" target="_blank">'$(sed -n $nm'p' zwischenspeicher)'</a><br>' >> ${datei}
                echo ''$b'</p>' >> ${datei};
                echo > zwischenspeicher;
                done
                runner=runner+10
        done;
echo "</body></html>" >> $datei

Im Hauptteil des Skripts holt dieses die bekannte URL mittels Wget ab und leitet die Ausgabe an eine For-Schleife weiter, um alle Treffer abzuarbeiten. Die Shell übernimmt die Treffer, die Grep ausfindig macht, in Form eines Arrays. Danach haben Sie die Möglichkeit, diesen Befehl wieder direkt in eine For-Schleife einzubauen.

Durch den Grep-Befehl erhalten Sie die Links auf die Stellenangebote, die Sie – jedes für sich – durch das Kommando wget -O zwischenspeicher $x; herunter laden und erst einmal in die Datei zwischenspeicher schreiben. Mit dem darauf folgenden Grep-Kommando suchen Sie in dieser Datei nach Treffern aus der Datei schwarzeListe und weisen den Wert der Standardausgabe der Variablen b zu.

Da Sie in der Datei nicht nur Links auf Stellenangebote darstellen wollen, sondern auch die passende Job-Bezeichnung brauchen, müssen Sie irgendwie an die Headline des Stellenangebotes kommen. Ein Blick in den Quelltext eines Stellenangebotes fördert den Quelltext aus Listing 9 zutage.

Listing 9

<div class="mt-jobdetail-title">
Qualitätskontrolleur/in Sachbearbeiter Wareneingang
</div>

An dieser Stelle greifen Sie in die Trickkiste, um eine Grep-Abfrage zu gestalten, die die Headline heraussucht: Sie suchen einfach nach dem Klassen-Attribut mt-jobdetail-title, ermitteln mit der Option -n die Zeilennummer, in der die Zeichenkette steht, und rechnen die Variable $nm um Eins hoch: Nun wissen Sie in welcher Zeile der Titel der Stelle steht.

Jetzt haben Sie alle erforderlichen Daten, um Links auf Stellenangebote in eine eigene HTML-Datei zu verpacken. Den Befehl, der die Daten in die Datei schreibt, finden Sie in Zeile 41 von Listing 8. Um die Links im HTML-Dokument voneinander abzusetzen, kommt das Blockelement <p></p> zum Einsatz, das den eigentlichen Link einfasst. Die beiden aufeinander folgenden Echo-Befehle bekommen ein Gemisch aus Hochkommata und Variablen übergeben, die das Skript zur Laufzeit durch Werte ersetzt. Damit wäre der erste Teil des Links komplett.

Jetzt gehen Sie daran, die Bezeichnung der Stelle einzufügen. Das geschieht mittels Sed, wobei der Befehl wieder in Klammern steht, um den Befehl in einer Subshell auszuführen. Durch die um 1 erhöhte Variable $nm wissen Sie, in welcher Zeile die Headline des Angebots steht. Mit Sed schneiden Sie die Zeile aus, indem Sie die Option -n nutzen, um die Ausgabe nicht explizit angegebener Zeilen zu unterdrücken. Als Argument übergeben Sie $nm'p', was für die Ausgabe der Zeile sorgt.

Der Ausdruck in Zeile 42 schreibt eine Warnung unter den Link, wenn der Jobtitel mit einem Eintrag in der Datei schwarzeListe übereinstimmt. Die Variable $b übernimmt dabei die Funktion eines Zwischenspeichers.

Natürlich soll das Skript alle Seiten des Ergebnisses auswerten. Dabei kommt die Variable $zahl zum Einsatz, in der der höchste Wert für den Parameter start= steckt. Die Variable $zahl kommt innerhalb einer Schleife als Kriterium für das Ende der Durchläufe zum Zuge (Zeile 31).

Für die korrekte URL der folgenden Seiten hängen Sie &start='$runner' an die ursprüngliche URL. Die Variable $runner hat im ersten Durchlauf den Wert 11, und durch den Zusatz &start=11 erhalten Sie die Ergebnisse 11 bis 20. Dadurch, dass sich die Variable $runner bei jedem Durchlauf um 10 erhöht, erhalten Sie auch weitere eventuell folgende Seiten, die unser Tool auswerten kann. Zu guter Letzt schließen Sie die HTML-Datei mit einem echo "</body></html>" >> $datei. Wie sie im Browser aussieht, zeigt Abbildung 2.

Abbildung 2: Das Ergebnis aus der selbsterstellten Webseite glänzt durch Übersichtlichkeit und verbesserte Funktionalität.

Fazit

Ein eigener Webcrawler ist mit Bordmitteln schnell gestrickt. Wer weiß, wo er die benötigten Werkzeuge findet und welche Möglichkeiten diese bieten, der stellt im Handumdrehen ein effektives Skript zusammen.

Das entspricht im klassischen Sinne dem, was neuhochdeutsch Quick & Dirty heißt: Ein hochfunktionales Gebilde, das seine Arbeit zuverlässig verrichtet, jedoch an den, der es lesen und verstehen will, gehobene Ansprüche stellt. Für eine weitere Fingerübung böte es sich an, die Bestandteile in eine klare Struktur zu bringen und den Ablauf eventuell zu modularisieren – falls der neue Job einem noch soviel Zeit lässt. 

Der Autor

Goran Mladenovic gehört nicht unbedingt zu den typischen Entwicklern. Er spricht mehrere Fremdsprachen und versteht sich außerdem gut auf Programmiersprachen.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Offline surfen
    "wget" spiegelt Inhalte von Web- und FTP-Servern, kann abgebrochene Downloads fortsetzen und bietet eine praktische Update-Funktion, mit der Sie bei Änderungen immer auf dem neuesten Stand bleiben.
  • Komfortabel Pakete managen mit der Apt-Shell
    Die Apt-Shell bietet eine Bedienoberfläche für viele Tools rund um das ausgefeilte Debian-Paketmanagement. Mit ihr nutzen Sie die vielfältigen Funktionen über ein zentrales Interface.
  • The Answer Girl
    Dass der Computeralltag auch unter Linux immer wieder für Überraschungen gut ist, ist eher eine Binsenweisheit: Immer wieder funktionieren Dinge nicht oder nicht so, wie eigentlich angenommen. Das Answer-Girl im Linux-Magazin zeigt, wie man mit solchen Problemchen elegant fertig wird.
  • Aktuelle Software
  • Kleine nützliche Dinge für die Shell
Kommentare

Infos zur Publikation

LU 11/2017: Server für Daheim

Digitale Ausgabe: Preis € 8,50
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Stellenmarkt

Aktuelle Fragen

Lieber Linux oder Windows- Betriebssystem?
Sina Kaul, 13.10.2017 16:17, 3 Antworten
Hallo, bis jetzt hatte ich immer nur mit
IT-Kurse
Alice Trader, 26.09.2017 11:35, 2 Antworten
Hallo liebe Community, ich brauche Hilfe und bin sehr verzweifelt. Ih bin noch sehr neu in eure...
Backup mit KUP unter Suse 42.3
Horst Schwarz, 24.09.2017 13:16, 3 Antworten
Ich möchte auch wieder unter Suse 42.3 mit Kup meine Backup durchführen. Eine Installationsmöglic...
kein foto, etc. upload möglich, wo liegt mein fehler?
kerstin brums, 17.09.2017 22:08, 5 Antworten
moin, zum erstellen einer einfachen wordpress website kann ich keine fotos uploaden. vom rechne...
Arch Linux Netzwerkkonfigurationen
Franziska Schley, 15.09.2017 18:04, 0 Antworten
Moin liebe Linux community, ich habe momentan Probleme mit der Einstellung des Lan/Wlan in Arc...