kleiner webcrawler

  • hallo,

    bin wieder mal auf Autoit gestoßen und dachte mir, daß es mir bei meinem jetzigen Problemchen helfen könnte.
    was es machen soll:
    1. quelltext einer html seite in eine txt-datei oder in eine temporäre variable speichern

    Code
    $oIE = _IECreate ("http://www.testseite.de/")
    $sHTML = _IEDocReadHTML ($oIE)


    2. aus diesem quelltext 15 links finden und in einer txt-datei abspeichern. Das Suchmuster für diesen Link ist immer das gleiche. Das gesuchte Anfangs-Tag heißt immer <li class="first">, der href in der Mitte ist das was ich abspeichern will (--> http://www.Gesuchter_Link.de:(

    Code
    <li class="first"><a href="http://www.Gesuchter_Link.de" rel="nofollow" title="xy">Link</a></li>

    Vieleicht mit einem RegEX-Ausdruck kombiniert mit einem _StringBetween ? Vieleicht habt ihr ja ne bessere Lösung, ich steh da an...

    3. ist im quelltext kein weiteres Vorkommen solch eines Links, d.h. wird der Tag <li class="first"> nicht mehr gefunden, soll das Script unten auf den WEITER-Button klicken. Das funzt schon :)

    4. das solange bis das Script am Ende der Seiten angelangt ist

    ich hoffe jemand schüttelt mir das schnell aus dem Handgelenk - ich sitz hier schon wieder 4h erfolglos :(

    mfg Alex

    2 Mal editiert, zuletzt von Vanaxel (19. Juli 2010 um 15:38)

  • naja entweder machst dus mit
    RegEx (bessere Lösung aber für unerfahrene meinstens sehr viel schwerer)

    [autoit]

    StringRegEx()

    [/autoit]

    oder mit den Stringfunktionen wie:

    [autoit]


    _StringBetween()
    StringinStr
    StringLeft
    StringRight
    ; ....

    [/autoit]
  • ja das hab ich eben noch reineditiert :P Das mit RegEx wäre eine feine Sache aber ich finde nirgends das Pattern wie ich:
    1. ein beliebiges Symbol
    2. eine beliebige Zeichenlänge
    3. zwischen Pos.A und Pos.B ausfindig machen kann

    eben wie zuerst geschrieben:
    finde

    Code
    http://www.Gesuchter_Link.de

    zwischen

    Code
    <li class="first"><a href="

    UND

    Code
    " rel="
  • Zitat

    Das mit RegEx wäre eine feine Sache aber ich finde nirgends das Pattern wie ich:
    1. ein beliebiges Symbol
    2. eine beliebige Zeichenlänge
    3. zwischen Pos.A und Pos.B ausfindig machen kann

    Genau das steht in der AutoIt-Hilfe, auch im dortigen Beispielscript, ich zitiere:

    Zitat

    ( ... ) Gruppe. Die Elemente in der Gruppe werden in Reihenfolge bearbeitet und können zusammen wiederholt werden. Z.B. (ab)+ entspricht "ab" oder "abab", aber nicht "aba". Eine Gruppe speichert auch den Text ab, der mit dem Set übereinstimmt, um ihn bei einem Rückverweis und in dem Rückgabearray der Funktion zu benutzen, abhängig von dem Flag-Parameter.

    zusammen mit

    Zitat

    . Findet jedes einzelne Zeichen (außer Zeilenschaltungen).

    und

    Zitat

    * Wiederholt die bisherigen Zeichen, Sets oder Gruppen kein oder mehrmals. Äquivalent zu {0,}


    wird das zu (.*)

    Spoiler anzeigen
    [autoit]

    #include <IE.au3>
    #include <Array.au3>
    $oIE = _IECreate ("http://www.autoit.de/")
    $sHTML = _IEDocReadHTML ($oIE)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sHTML = ' & $sHTML & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    ;(.*) ein oder mehrere Zeichen, das Ergebnis wird in ein Array geschrieben
    $aLinks=stringregexp($sHTML,'<LI><A href="(.*)">',3) ;bei dir würde das Patetrn also '<li class="first"><a href="(.*)" rel="' sein
    _arraydisplay($alinks)

    [/autoit]

    /EDIT/

    Zitat von BugFix

    _IELinkGetCollection

    Ob er jetzt aus dem Quellcode alle "passenden" Links ausfiltert oder aus einer _IELinkGetCollection-Liste die "passenden" ausfiltert bleibt m.E. gleich....

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (19. Juli 2010 um 16:31)

  • Code
    $aLinks=stringregexp($sHTML,'<LI><A href="(.*)">',3)

    omg so einfach also? muss ich gleich morgen versuchen

    Danke schonmal vielmals 8o 8o

  • funktioniert leider nicht wie gewollt, er fängt bei

    Code
    <li class="first"><a href="

    an aber hört dann nicht beim ende des links auf sondern nimmt zu seiner auswahl gleich die ganze zeile her weil diese kombination leider mehrmals in einer zeile hintereinander vorkommt.

    wie kann ich sagen daß:
    1. ein beliebiges Symbol
    2. eine beliebige Zeichenlänge
    3. zwischen Pos.A und Pos.B ausfindig machen kann
    4. wobei ich Pos. B klar definieren möchte mit ERSTES Hochkomma " nach dem href

    ?( ?( ?(

  • Hallo Vanaxel,

    Wozu diese Umstände? Wenn sowieso die IE.au3 verwendet wird, dann gehts mit einem Befehl: _IELinkGetCollection ;)

    dann mach es doch damit.

    Ob er jetzt aus dem Quellcode alle "passenden" Links ausfiltert oder aus einer _IELinkGetCollection-Liste die "passenden" ausfiltert bleibt m.E. gleich....

    anscheinend nicht (was auch am Threadersteller liegen könnte)

    @Vanaxel, oder poste einfach den Link zu der Seite die du untersuchen willst,

    mfg (Auto)Bert

  • es handelt sich um

    Code
    http://www.herold.at/gelbe-seiten/tischlereien/

    ich will da alle adressen auslesen, hpts. name, ort, plz, email

    meine vorgehensweise wäre eben diese gewesen:

    • manuell nachsehen wieviele seiten das verzeichnis hat
    • hol mit _INetGetSource ( $s_URL ) den quellcode seite 1, seite 2, dann seite 3 usw bis ende und schreibe ganzen quellcode in ein file
    • erfasse aus diesem file die direktlinks zu den firmen
    • hole mit _INetGetSource ( $s_URL ) den quellcode einer firma in ein temp file
    • lese name, ort, plz, email in ein array oder file aus
    • mache das mit allen firmen
    • Ergebnis: ein File mit namen, orte, plz, emails aller firmen und das ganze so performant wie möglich, weil werden um die 4000 firmen sein, dh. statt _IECreate besser _InetgetSource, da poppt wenigstens nix am schirm auf und man kann in der zwischenzeit andere sachen machen :)

    brauch das fürs büro :S

  • Du brauchst nur das:

    Thalhofer Johann
    1020 Wien, Obere Augartenstr 54-56

    Oder auch mit Telefonnummer und so?

  • ich brauche:
    Thal**** Jo****
    1020 Wien
    Obere Augartenstr 54-56
    emailadresse

    diese 4 daten

  • ALso wie ich an die Emailadresse komme, verstehe ich nicht. Laut Quelltext steht die nicht drinnen.... Wenn dich das nicht stört, könnte ich dir aber eventuel etwas zauber. Also dass Name, Ort/PLZ/Adresse

  • Hallo vanaxel,

    dein Vorhaben widerspricht den Nutzngsbedingungen von Herold.at.

    üblicherweise verkaufen solche Verlage aber selektierte Adressen, also einfach dort anfragen,

    mfg (Auto)Bert