Mit welcher Sprache bestimmte Webseiten-Formular abfragen?

sucher123

Newbie
Registriert
Juli 2013
Beiträge
7
Hallo liebes Forum,

ich suche nach einer Möglichkeit die Seite

https://www.insolvenzbekanntmachungen.de/cgi-bin/bl_suche.pl

mittels eines Scripts oder Programms abzufragen und die ausgegebenen Ergebnisse abzuspeichern, um sie später zu durchsuchen.

Ich muss in der Lage sein bestimmte Parameter einzugeben. Leider kommt bei der Ausgabe der Ergebnisse sowas raus:

javascript:NeuFenster('/cgi-bin/bl_aufruf.pl?PHPSESSID=bb1972f06067bcdb716ee2bad91e3f3f&datei=gerichte/rp/agmainz/13/280_IN_108_13/2013_07_04__10_35_13_Eroeffnung.htm')

Ich würde gern mal wissen, mit welcher Programmiersprache man das ganze angehen sollte? Perl, Python oder PHP? Vielleicht gibt es ja auch eine besonders geeignete Scrapping Sprache oder fertige Programme?

Danke.
 
Einmal beispielhaft ausfüllen und den POST-Request mit einem Tool mitschneiden. Z.B. HttpFox für Firefox oder eine der Entwicklerkonsolen wie Firebug für FF bzw. der in Chrome integrierten Konsole. Dann siehst du welche Parameter da mitgesendet werden. Dann nimmst du eine beliebige Sprache deiner Wahl, mit der man komfortabel HTTP-Requests abfeuern kann und sendest genau solche Requests und ersetzt einfach die Parameter wie es beliebt.

Alternativ kannst du auch mit Selenium rumspielen, aber das wäre mir zu umständlich.
 
Danke für die Tipps. Hab mal die Parameter rausgesucht. Durch Aufrufen der URL erscheint das Ergebnis, wie gewünscht:

https://www.insolvenzbekanntmachung...hesperpage=100&sortedby=Datum&page=1#Ergebnis

Das Ergebnis sind zahlreiche Links, die einen javascript Klick benötigen. Zum Beispiel:

javascript:NeuFenster('/cgi-bin/bl_aufruf.pl?PHPSESSID=61c119d28f8732c5c6c8e7a443f77704&datei=gerichte/sn/agleipzig/13/0403_IK1588_13/2013_07_04__10_13_56_Eroeffnungen.htm')

Das öffnet dann ein Fenster mit einem HTML-Dokument. Das Dokument möchte ich gern abspeichern. Und das mit allen Links. Wie stell ich das am Besten an?
 
  1. Website abfragen (die nötigen GET Parameter hast du ja scheinbar schon gefunden)
  2. aus dem erhaltenen Quelltext die weiterführenden Links extrahieren
  3. diese wiederum abfragen und Ergebnisse speichern

Das ist eigentlich in keiner Sprache ein Hexenwerk. Entweder ist alles was benötigt wird bereits an Board, oder es gibt Libraries wie zB libcurl um die URLs anzufragen.
Ich würde einfach mal schätzen, dass du mit Python sehr schnell ans Ziel kommst.

Um dir mal direkt nen Einstieg zu geben:
Code:
import urllib

url = "https://www.insolvenzbekanntmachungen.de/cgi-bin/bl_suche.pl?Suchfunktion=uneingeschr&Bundesland=Sachsen&Gericht=Leipzig&Gegenstand=Er%F6ffnungen&matchesperpage=100&sortedby=Datum&page=1#Ergebnis"
page = urllib.urlopen(url).read()

print page

Damit bekommst du schonmal den Quellcode mit den ganzen Links. Der Rest sollte mit minimalem Aufwand bei Google machbar sein.
 
Zuletzt bearbeitet:
Sollte tatsächlich kein Hexenwerk sein, wenn du dich etwas in cURL einliest. Ob du dann PHP, Perl oder sonstwas nutzt, um cURL anzusteuern, spielt keine Rolle. Unter Linux könntest du sogar den cURL-Aufruf direkt aus der Shell machen
 
Hey super, danke für die Hinweise.

Konnte es sowohl in python und mit curl (nutze MacOS) nachvollziehen. Dies Seite mit den Links wird mir also schön ins Terminal reingeschrieben. Werde diesen Weg jetzt mal weiter beschreiten.

Vorab, vielleicht noch eine Frage. Die Links, die ich zu extrahieren habe sind ja irgendwelche doofen javascript links. Das basiert wohl auf Folgendem:

Code:
<script type="text/javascript">
<!--
function NeuFenster(Adresse) {
 MeinFenster =
 window.open(Adresse, "Zweitfenster", "location=no,menubar=no,resizable=yes,scrollbars=yes,status=no,toolbar=no,top=0,left=0");
}
//-->
</script>

Dann kommen die Links so:

Code:
<A HREF="javascript:NeuFenster('/cgi-bin/bl_aufruf.pl?PHPSESSID=a5878fc101bb927456392b0d1fc7b37d&datei=gerichte/sh/agneumuenster/07/91_IK_128_07/2013_07_05__07_17_43_Entscheidungen_im_Restschuldbefreiungsverfahren.htm')">

Also muss ich jetzt die links so extrahieren, dass ich sie mit der Adresse die vor /cgi-bin/ ... usw steht zusammenführen muss, da die obigen Links ja nicht vollständig sind. Oder?
 
Das sind relative Pfade, also wäre der komplette Pfad zu:
Code:
<A HREF="javascript:NeuFenster('/cgi-bin/bl_aufruf.pl?PHPSESSID=a5878fc101bb927456392b0d1fc7b37d&datei=gerichte/sh/agneumuenster/07/91_IK_128_07/2013_07_05__07_17_43_Entscheidungen_im_Restschuldbefreiungsverfahren.htm')">
einfach nur
Code:
https://www.insolvenzbekanntmachungen.de/cgi-bin/bl_aufruf.pl?PHPSESSID=a5878fc101bb927456392b0d1fc7b37d&datei=gerichte/sh/agneumuenster/07/91_IK_128_07/2013_07_05__07_17_43_Entscheidungen_im_Restschuldbefreiungsverfahren.htm
Sprich einfach die URL noch vorn dran.

Da du OSX verwendest würde ich dir auch zu einer Terminallösung raten. Zumindest würde ich es so machen, da ich mich mit der Bash besser als mit Python auskenne^^ Damit geht das in einer (zugegebenermaßen langen) Zeile mit ein paar Pipes.
Neben curl würde ich die Links mit awk rausschneiden.

Edit:
Da ich immer gern im Terminal rumspiele konnte ich mir nicht verkneifen mal ne Beispiellösung zu erarbeiten. Ich pack es mal in nen Spoiler, falls es dir nicht nur um das Ergebnis sondern auch um den Lerneffekt geht ;)

Es ist noch nicht berücksichtigt, dass evtl. mehrere Seiten geladen werden müssen, falls es mehr als 100 Ergebnisse gibt.

Das Herzstück code.awk
Code:
BEGIN {
        i=1;
}
/<A HREF="javascript:NeuFenster/ {
        split($0, queryStringSearch, "\x27");
        url="https://www.insolvenzbekanntmachungen.de"queryStringSearch[2];
        split(url, urlResult, "?");
        split(urlResult[2], paramsResult, "&");
        print "curl "urlResult[1]" -g -d "paramsResult[1]" -d "paramsResult[2]" -o "i".htm 2>/dev/null; echo \"processed: "i"\"";
        ++i;
}


Der Befehl zum Aufrufen
Code:
curl https://www.insolvenzbekanntmachungen.de/cgi-bin/bl_suche.pl -g -d Suchfunktion=uneingeschr -d Bundesland=Sachsen -d Gericht=Leipzig -d Gegenstand=Er%F6ffnungen -d matchesperpage=100 -d sortedby=Datum -d page=1 2>/dev/null | awk -f code.awk | bash
An den Dateinamen kann man auch noch arbeiten, aber da ich nicht wusste was für dich sinnvoll ist hab ich sie einfach mal durchnummeriert.
 
Zuletzt bearbeitet:
Wow, super!!!!

Habs gerade mal probiert. Klappt hervorragend. Habs aber nicht verstanden ;-)

Aber was solls es läuft super. Jetzt hab ich die Seiten als .htm-Dokument und kann mit diesen weiterarbeiten. Hatte jetzt noch vor einzelne Daten (wie zB. Aktenzeichen, Treuhänder, Gericht) aus dem html Dokument in eine Excel-Tabelle zu schreiben. :freaky:

Ich hoffe nicht, dass ich da noch irgendwelche VBA Experten fragen muss. Vielleicht ist Excel auch die falsche Wahl. Muss ich mir nochmal anschauen.

Ansonsten nochmals danke für deine Zeit und tolle Hilfe.
 
Am besten schreibt man es in eine CSV. Die kann man dann auch mit Excel öffnen.
Ist noch ne Erklärung gewünscht? Sonst würde ich mir das Tippen des Prosatextes sparen.
 
Wenn du mich so nett fragst, würde ich deine Hilfe gern nochmal in Anspruch nehmen. Gibts auch irgendwelche Befehle, die mir die html in csv wandeln?
 
Ich meinte die Erklärung zum Vorhergehenden ;)

Die gewünschten Informationen müsste man jetzt wieder aus dem HTML Code parsen und entsprechend in eine Datei ausgeben.
 
Wenn es deine Zeit erlaubt, wäre sehr daran interessiert, wie dieses awk File funktioniert.

Was ich mir bei HTML Code parsen problematisch vorstelle ist, dass die Dokumente nicht immer einheitlich sind. Wenn ich also den Treuhänder / Verwalter Namen rausparsen will, kann ich wahrscheinlich gar keine konkrete Position benennen, an der Name steht. Wahrscheinlich muss ich da mit sowas wie grep arbeiten, oder?
 
awk ist ne Scriptsprache und in dem .awk file steht im Prinzip der Quellcode (ich weiß nicht ob es üblich ist die Dateien .awk zu nennen). Es wird immer zeilenweise auf dem Input gearbeitet und für jede Zeile festgelegt was getan werden soll. Dazu werden reguläre Ausdrücke wie im Beispiel /<A HREF="javascript:NeuFenster/ angegeben. Das bedeutet, für alle Zeilen für die der Ausdruck matcht wird der Code in den geschweiften Klammern ausgeführt. Dafür stehen diverse Variablen zur Verfügung ($0 - ganze Zeile, $1 erstes Element (standardmäßig werden die Elemente durch Leerzeichen getrennt), $2 ...).

Zu Beginn wird die Variable i mit 1 initialisiert
Zeile 5: splittet die ganze Eingabezeile in ein Array mit dem Trennzeichen '
wenn man sich die Zeile ansieht stellt man fest, dass anschließend der relative Pfad an 2. Stelle im Array steht.
Zeile 6: aus dem relativen Pfad wird die komplette URL gebaut.
Zeile 7: splittet wiederrum in ein Array mit dem Trennzeichen ?
dadurch wird der Pfad vom Query String getrennt.
Zeile 8: splittet die einzelnen Get-Parameter
Zeile 9: gibt die nötigen Befehle zum Runterladen der Dateien aus
Zeile 10: i inkrementieren

Das war im Prinzip die ganze Magie. Lässt man im Befehl oben das " | bash" weg werden die Befehle einfach auf der Konsole ausgegeben.


Jetzt könnte man nach einem ähnlichen Strickmuster Zeilen aus den runtergeladenen Dateien extrahieren und dort jeweils mit passenden regulären Ausdrücken die gewünschten Informationen rausschneiden und entsprechend formatiert in eine Datei printen. Im Prinzip muss man die Dateien dafür auch nicht nochmal zwischenspeichern, sondern kann das direkt machen. Ich denke aber so zweistufig ist das für den Anfang erstmal ok.

Falls noch Fragen auftauchen, dann her damit.
 
Danke nochmal für die Erklärungen. Jetzt hab ich einiges mehr verstanden. Mal schauen, was ich jetzt mit den Dateien anstelle.

Das Auslesen der Daten wird nochmal ne Herausforderung. Falls ich noch was brauche, würde ich mich vertrauensvoll an dich wenden.
 
Zurück
Oben