Seite auslassen, wenn diese nicht geladen wird

  • Hallo zusammen,

    ich habe Zugriff auf alle Einträge unserer internen Datenbank und möchte die 12000 Objekte in ein Textdokument ausgeben, damit ich bequemer nur die relevanten Objekte in meinem Kundengebiet herausfiltern kann. Ich kann zwar jetzt auch alle Kunden suchen, deren Kundennummern mit 990 beginnen oder der Name Parfümerie enthält, aber ich bräuchte stattdessen die Möglichkeit, alle zu suchen, die z.B. im PLZ Gebiet 11xxx ihren Sitz haben und das gibt die Filterfunktion leider nicht her.

    Ich habe ein Skript geschrieben, das alle Objektnummern von 1-12000 durchgehen soll und die entsprechende Webseite öffnet, dort lese ich ein paar Einträge aus dem Formular und schreibe die in eine Textdatei; soweit kein Problem.

    Das Problem kommt dann, wenn eine Seite von einem nicht mehr vorhandenen Objekt geöffnet werden soll. Dann bekomme ich neben einer langen Wartezeit mehrfach die Meldungen

    --> IE.au3 T3.0-2 Error from function _IEFormElementGetObjByName, $_IESTATUS_InvalidDataType

    --> IE.au3 T3.0-2 Error from function _IEFormElementGetValue, $_IESTATUS_InvalidDataType


    In dem Fall wird eine übergeordnete Seite geöffnet und der ganze Quellcode dieser Seite ausgelesen. Das will ich natürlich nicht. Bei der nachfolgenden Seite ist im Titel "verwalten" zu lesen; bei den Seiten mit existierenden Objekten steht im Titel "bearbeiten". Ich dachte ursprünglich, dass ich lediglich prüfen müsste, welches der beiden Worte im Titel steht. Das nützt mir aber nix, weil dazu die Seite ohne Objekt vollständig geladen werden müßte.

    Meine Frage:

    Wie kann ich unmittelbar nach Erhalt einer der beiden Meldungen das Skript dazu bewegen, nicht zu versuchen, die Seite zu öffnen, sondern mit der nächsten Seite weiter zu machen? Das Warten von jeweils etwa 20 Sekunden oder auch länger wenn die übergeordnete Seite geladen wird, muss ich vermeiden.

    Spoiler anzeigen

    #include <IE.au3>

    #include <GuiConstantsEx.au3>

    #include <ClipBoard.au3>

    #include <WindowsConstants.au3>

    #Include <String.au3>

    #include <Array.au3>

    #include <MsgBoxConstants.au3>

    #include <StringConstants.au3>

    $objektnummer = 2

    For $Schleife = 1 to 2

    Local $webseite = "https://webseite.com/object/edit/" & $objektnummer

    Local $oIE = _IECreate($webseite)

    _IELoadWait($oIE)

    Select

    Case StringInStr(_IEPropertyGet($oIE, "title"), "bearbeiten") = 0

    msgbox(0,"", _IEPropertyGet($oIE, "title") & "-- Titel beinhaltet: NICHT bearbeiten" & StringInStr(_IEPropertyGet($oIE, "title"), "verwalten"))

    $objektnummer = $objektnummer+1

    _IEQuit($oIE)

    Case StringInStr(_IEPropertyGet($oIE, "title"), "bearbeiten") > 0

    msgbox(0,"", _IEPropertyGet($oIE, "title") & "-- Titel beinhaltet: SCHON bearbeiten" & StringInStr(_IEPropertyGet($oIE, "title"), "bearbeiten"))

    $objektnummer = $objektnummer+1

    Local $webseite = "https://webseite.com/object/edit/" & $objektnummer

    Local $oIE = _IECreate($webseite)

    _IELoadWait($oIE)

    Local $sHTMLSeite = _IEBodyReadHTML($oIE)

    Local $file = FileOpen("c:\Daten\ergebnis.txt", 1)

    ; Prüfen, ob Datei im Schreibmodus geöffnet ist

    If $file = -1 Then

    MsgBox(0, "Fehler", "Die Datei konnte nicht geöffnet werden.")

    Exit

    EndIf

    ;~ Ab hier werden die Daten ausgelesen

    Local $objektplz = _IEFormElementGetObjByName($oForm, "object_address_zip")

    Local $objektstadt = _IEFormElementGetObjByName($oForm, "object_address_city")

    ...

    EndSelect

    Next


  • Hallo 32vroni

    wenn man jetzt an deiner Struktur nichts groß ändern möchte, reicht es, dass du auf Fehler prüfst und den Schleifendurchlauf überspringst.

    Also nach den entsprechenden Funktionsaufrufen (_IEFormElementGetObjByName) mit @error auf Fehler prüfen.

    Code
    If @error Then
       ; .... Was du hier vllt. machen willst. 
        ContinueLoop ; <-- Hiermit kannst du in Schleifen direkt zum nächsten Durchlauf springen.
    EndIf

    Grüße autoiter

  • Um was für eine Datenbank handelt es sich denn und mit welcher Software greifst du darauf zu? Wenn es sich um eine echte Datenbank handelt, dann kann ich mir kaum vorstellen, dass du die Einträge nicht wie gewünscht filtern können sollt.

  • Wie immer steht man erstmal unter Verdacht, der Bösewicht zu sein, der nur illegale Dinge im Kopf hat.

    Welche Software ich nutze ist relativ klar: Nix anderes als AutoIt und den Internet Explorer in Ermangelung des Wissens, wie ich das mit Firefox machen würde, da MozRepl nicht mehr unterstützt wird.

    Die Firma für welche ich arbeite stellt Gerätschaften her, die eine gewisse Kundengruppe least. Für diese Gerätschaften braucht es jemand, der den Kunden beim Einrichten und während der Vertragslaufzeit hilft, die zugehörige Software zu nutzen.

    Einer dieser Anwedungstechniker bin ich und ich stelle Touren zusammen, bei denen ich die Kunden besuche. Es gibt ziemlich viele Adressen, bei denen die Produkte eingesetzt werden und leider sind die Herrschaften, die die Daten eingeben, nicht die gleichen, die dann auch die Daten praktisch anwenden müssen. Ich kann mit dem Webinterface jeden einzelnen Kunden nach Namen oder Kundennummer suchen oder auch nach der Gerätenummer, leider nicht nach weiteren Kriterien. Habe ich einen ausgewählt, kann ich alle Daten, wie z.B. Adresse, Ansprechparter, Gerätetyp und noch ein paar Dinge auf der Seite sehen. Das hilft aber nix, wenn ich mir eine Tour zusammenstellen will, bei der ich möglichst effizient von einem zum nächsten fahren will.

    Also nutze ich meine geistige Restkraft und lasse mir automatisch alle relevanten Felder von den Kundennummern 1-12000 auslesen und speichere diese in eine Textdatei mit ; getrennt und kann dann schön mit Excel nach PLZ Bereichen oder Städten filtern. Erfreulicherweise ist der letzte Teil der URL die Objektnummer. Nur kann es vorkommen, dass es z.B. in grauer Vorzeit unter der Nummer 232 noch ein aktives Objekt gab und es dieses mittlerweile aber nicht mehr gibt. In dem Fall wird beim Aufruf dieser URL einfach die übergeordnete Seite aufgerufen. Welche leider mindestens 20 Sekunden zum Laden braucht. Da ich vorher nicht weiß, ob es das Objekt 232 noch gibt, muß ich die Seite 232 aufrufen. Wie könnte ich es denn verhindern, dass die übergeordnete Seite geöffnet wird und ich stattdessen irgendeine Info erhalte?

    Mittleweile habe ich festgestellt, dass mein eigentliches Problem nicht die anfangs genannten Fehlermeldungen sind, sondern die Tatsache, dass ich nicht die Umlenkung auf eine andere Seite verhindern kann, bzw. nicht weiß, wie ich damit umgehen könnte. Ein Prüfen, ob die Seite mit der Objektnummer 232 existiert hilft nix, weil durch das Umlenken ja eine gültige Seite aufgerufen wird.

    Danke für Ideen!

  • Hey 32vroni

    ich glaube auch nicht, dass du so schneller werden kannst. Du weißt ja nie vorher welche Objektnummern in dieser Datenbank vorhanden sind. Und die Geschwindigkeit des Webservers kannst du auch nicht beeinflussen. Kannst du nicht jemanden in der Firma (bist du Subunternehmer?) bitten, dir eine Liste bereitzustellen?

    Grüße autoiter

  • Was ich gerade noch gefunden habe: Mit einem Redirect Checker wie z.B. Urlitor kann ich sehen, dass bei einem existierenden Objekt nur einmal umgeleitet wird und bei einem nicht existierenden Objekt zweimal. Diese Info dauerte nur zwei Sekunden. Wenn ich sowas irgendwie mit Autoit machen könnte, wäre das schon gut.

  • Was ich gerade noch gefunden habe: Mit einem Redirect Checker wie z.B. Urlitor kann ich sehen, dass bei einem existierenden Objekt nur einmal umgeleitet wird und bei einem nicht existierenden Objekt zweimal. Diese Info dauerte nur zwei Sekunden. Wenn ich sowas irgendwie mit Autoit machen könnte, wäre das schon gut.

    Ich habe keine Ahnung.

    Allerdings kannst du bei der Funktion _IELoadWait ein Timeout angeben. Kann das nicht genügen?

    Grüße autoiter

  • Prinzipiell (vereinfacht) funktioniert ein Website-Aufruf wie folgt:

    Client: GET /index.html

    Server: 200 OK <Inhalt der Seite>

    Die 200 ist dabei der Statuscode und heißt konkret "Anfrage OK, Content folgt". Ein Webserver kann natürlich auch andere Codes schicken. Ein relevantes Beispiel wäre 303 (See other). Das ist nichts anderes als deine Weiterleitung. Du müsstest also nix anderes machen, als einen Raw HTTP Request (bspw. per TCP-Funktionen) senden und dann schauen, welcher Statuscode zurückkommt.

  • Wie immer steht man erstmal unter Verdacht, der Bösewicht zu sein, der nur illegale Dinge im Kopf hat.

    Stimmt, wenn jemand alle (für ihn relevanten=12000) Kundendaten herunterladen will/muß hört sich das sehr suspekt an, er könnte ja demnächst bei der Konkurenz anheuern wollen.

    Habe ich einen ausgewählt, kann ich alle Daten, wie z.B. Adresse, Ansprechparter, Gerätetyp und noch ein paar Dinge auf der Seite sehen. Das hilft aber nix, wenn ich mir eine Tour zusammenstellen will, bei der ich möglichst effizient von einem zum nächsten fahren will.

    Aus diesem Grunde solltest du mit deinem Vorgesetzten oder IT-Verantwortlichen reden, damit dieses Übel beseitigt wird. Wenn du (und die anderen AD'ler) vor jeder Tour unnötige (im Sinn: es muss doch auch einfacher gehen) Arbeiten erledigen mußt ist dies auf Dauer Kostenintensiver als einmal das System zu erweitern.